From amit.sahrawat83@gmail.com Wed Dec 1 01:13:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.9 required=5.0 tests=BAYES_50,FREEMAIL_FROM, HTML_MESSAGE,J_CHICKENPOX_46,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB17DJhq183896 for ; Wed, 1 Dec 2010 01:13:20 -0600 X-ASG-Debug-ID: 1291187699-7bb202420000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-qy0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 603831C85653 for ; Tue, 30 Nov 2010 23:14:59 -0800 (PST) Received: from mail-qy0-f181.google.com (mail-qy0-f181.google.com [209.85.216.181]) by cuda.sgi.com with ESMTP id M6hQb6dEIOfeklxh for ; Tue, 30 Nov 2010 23:14:59 -0800 (PST) Received: by qyk12 with SMTP id 12so7482028qyk.5 for ; Tue, 30 Nov 2010 23:14:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:date:message-id :subject:from:to:content-type; bh=2KY/5nuxsrUFEXqaLX3/mYQnOfJwfBTwXzBGUOh8mD4=; b=AidEvLXC+1nC50PHVzWwk87pvpApNPSadIMVaI2aY05Ahe/BHF/yPBvHy/cSK0Y2A6 4UtPUdOX4JG4FTxeOt/OsTqSYo0yKfWLCAjFsS8h7rqITTrs5Ixkvpy2+kIK12LOepMK hHd6ywe56LiemULfTBOY1dB2g+Uw67FC/aIAU= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=weZ2QikcmXIs815Ub9GZfICraxlkNrPKmzSGVkiFqccyZmmD/OGJxR0RydIKR9qysU Co1n3WYW+xFgtYI8ZnqGP2R2B8yDrOpXuv1mNTU9GnFHJbF85Rck66vPaUZ1GtYCLyBZ y90WEQKcNpn4NwSOD+XPvlWvuGx8PPZ18A0iI= MIME-Version: 1.0 Received: by 10.224.6.141 with SMTP id 13mr7708468qaz.26.1291187699083; Tue, 30 Nov 2010 23:14:59 -0800 (PST) Received: by 10.220.194.3 with HTTP; Tue, 30 Nov 2010 23:14:58 -0800 (PST) Date: Wed, 1 Dec 2010 12:44:58 +0530 Message-ID: X-ASG-Orig-Subj: XFS file system corruption(Return Bad Transaction) kernel - 2.6.34 Subject: XFS file system corruption(Return Bad Transaction) kernel - 2.6.34 From: Amit Sahrawat To: Eric Sandeen , xfs@oss.sgi.com, sandeen-xfs@sandeen.net Content-Type: multipart/alternative; boundary=0015175cb71a246c770496541099 X-Barracuda-Connect: mail-qy0-f181.google.com[209.85.216.181] X-Barracuda-Start-Time: 1291187700 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.50 X-Barracuda-Spam-Status: No, SCORE=-1.50 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, MIME_BASE64_TEXT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48143 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.52 MIME_BASE64_TEXT RAW: Message text disguised using base64 encoding X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --0015175cb71a246c770496541099 Content-Type: text/plain; charset=ISO-8859-1 Dear Member, I am getting following corruption on XFS formatted disk during a simple copy operation: sd 9:0:0:0: Attached scsi removable disk sdc sd 9:0:0:0: Attached scsi generic sg2 type 0 XFS mounting filesystem sdc2 Starting XFS recovery on filesystem: sdc2 (logdev: internal) XFS: xlog_recover_process_data: bad transaction XFS: log mount/recovery failed: error 5 XFS: log mount failed [root@localhost TEGRA]# [root@localhost TEGRA]# mount /dev/sdc2 /mnt/ mount: /dev/sdc2: can't read superblock [root@localhost TEGRA]# xfs_logprint -t /dev/sdc2 xfs_logprint: data device: 0x822 log device: 0x822 daddr: 6809632 length: 20480 log tail: 284 head: 412 state: LOG REC AT LSN cycle 1 block 284 (0x1, 0x11c) ============================================================================ TRANS: tid:0x863c5000 type:CREATE #items:5 trans:0x0 q:0x80b5c08 BUF: cnt:2 total:2 a:0x80ad6f8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x2 len:1 bmap size:1 flags:0x0 AGI Buffer: (XAGI) BUF: cnt:2 total:2 a:0x80ad7b8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x18 len:8 bmap size:2 flags:0x0 BUF DATA INO: cnt:2 total:2 a:0x80adaa8 len:56 a:0x80adb20 len:96 INODE: #regs:2 ino:0x85 flags:0x1 dsize:0 CORE inode: INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80b5c48 len:96 a:0x80b5cb0 len:68 INODE: #regs:3 ino:0x80 flags:0x3 dsize:68 CORE inode: DATA FORK LOCAL inode data: BUF: cnt:2 total:2 a:0x80b5cf8 len:24 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5d18 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80adbe8 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80adbc8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80adae8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c08 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c48 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5c68 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80b5c88 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80ad6f8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80ad7b8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c28 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5d18 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5cf8 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80adbe8 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80adbc8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80adae8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c08 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c68 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5c48 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80b5c88 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80ad6f8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80ad7b8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c28 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5cf8 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5d18 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80adbe8 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80adbc8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80adae8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c08 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c48 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5c68 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80b5c88 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80ad6f8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80ad7b8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c28 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5d18 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5cf8 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80adbe8 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80adbc8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80adae8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c08 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c68 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5c48 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80b5c88 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80ad6f8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80ad7b8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c28 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5cf8 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5d18 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80adbe8 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80adbc8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80adae8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c08 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c48 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5c68 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80b5c88 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80ad6f8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80ad7b8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c28 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5d18 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5cf8 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80adbe8 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80adbc8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80adae8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c08 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c68 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5c48 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80b5c88 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80ad6f8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80ad7b8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c28 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5cf8 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5d18 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80adbe8 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80adbc8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80adae8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c08 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c48 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5c68 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80b5c88 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80ad6f8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80ad7b8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c28 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5d18 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5cf8 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80adbe8 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80adbc8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80adae8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c08 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c68 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5c48 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80b5c88 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80ad6f8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80ad7b8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c28 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5cf8 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5d18 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80adbe8 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80adbc8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80adae8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c08 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c48 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5c68 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80b5c88 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80ad6f8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80ad7b8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c28 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5d18 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5cf8 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80adbe8 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80adbc8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80adae8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c08 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c68 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5c48 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80b5c88 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80ad6f8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80ad7b8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c28 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5cf8 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5d18 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80adbe8 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80adbc8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80adae8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c08 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c48 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5c68 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80b5c88 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80ad6f8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80ad7b8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c28 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5d18 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5cf8 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80adbe8 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80adbc8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80adae8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c08 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c68 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5c48 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80b5c88 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80ad6f8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80ad7b8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c28 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5cf8 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5d18 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80adbe8 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80adbc8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80adae8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c08 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c48 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5c68 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80b5c88 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80ad6f8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80ad7b8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c28 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5d18 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5cf8 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80adbe8 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80adbc8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80adae8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c08 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c68 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5c48 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80b5c88 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80ad6f8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80ad7b8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c28 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5cf8 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5d18 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80adbe8 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80adbc8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80adae8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c08 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c48 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5c68 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80b5c88 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80ad6f8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80ad7b8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c28 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5d18 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5cf8 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80adbe8 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80adbc8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80adae8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c08 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c68 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: ============================================================================ TRANS: tid:0x863c5000 type:STRAT_WRITE #items:5 trans:0x0 q:0x80b5c48 INO: cnt:3 total:3 a:0x80adb88 len:56 a:0x80adb20 len:96 a:0x80b5c88 len:16 INODE: #regs:3 ino:0x85 flags:0x5 dsize:16 CORE inode: DATA FORK EXTENTS inode data: BUF: cnt:2 total:2 a:0x80ad6f8 len:24 a:0x80ad730 len:128 BUF: #regs:2 start blkno:0x1 len:1 bmap size:1 flags:0x0 AGF Buffer: (XAGF) BUF: cnt:2 total:2 a:0x80ad7b8 len:28 a:0x80ada20 len:128 BUF: #regs:2 start blkno:0x10 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5c28 len:28 a:0x80b5d38 len:128 BUF: #regs:2 start blkno:0x8 len:8 bmap size:2 flags:0x0 BUF DATA BUF: cnt:2 total:2 a:0x80b5cf8 len:24 a:0x80b5dc0 len:128 BUF: #regs:2 start blkno:0x0 len:1 bmap size:1 flags:0x0 SUPER Block Buffer: LOG REC AT LSN cycle 1 block 348 (0x1, 0x15c) XFS: xlog_recover_process_data: bad transaction xfs_logprint: failed in xfs_do_recovery_pass, error: 5 --0015175cb71a246c770496541099 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: base64 PGRpdj5EZWFyIE1lbWJlciw8L2Rpdj4KPGRpdj6gPC9kaXY+CjxkaXY+SSBhbSBnZXR0aW5nIGZv bGxvd2luZyBjb3JydXB0aW9uIG9uIFhGUyBmb3JtYXR0ZWQgZGlzayBkdXJpbmcgYSBzaW1wbGUg Y29weSBvcGVyYXRpb246PC9kaXY+CjxkaXY+c2QgOTowOjA6MDogQXR0YWNoZWQgc2NzaSByZW1v dmFibGUgZGlzayBzZGM8YnI+c2QgOTowOjA6MDogQXR0YWNoZWQgc2NzaSBnZW5lcmljIHNnMiB0 eXBlIDA8YnI+WEZTIG1vdW50aW5nIGZpbGVzeXN0ZW0gc2RjMjxicj5TdGFydGluZyBYRlMgcmVj b3Zlcnkgb24gZmlsZXN5c3RlbTogc2RjMiAobG9nZGV2OiBpbnRlcm5hbCk8YnI+WEZTOiB4bG9n X3JlY292ZXJfcHJvY2Vzc19kYXRhOiBiYWQgdHJhbnNhY3Rpb248YnI+ClhGUzogbG9nIG1vdW50 L3JlY292ZXJ5IGZhaWxlZDogZXJyb3IgNTxicj5YRlM6IGxvZyBtb3VudCBmYWlsZWQ8YnI+W3Jv b3RAbG9jYWxob3N0IFRFR1JBXSMgPGJyPltyb290QGxvY2FsaG9zdCBURUdSQV0jIG1vdW50IC9k ZXYvc2RjMiAvbW50Lzxicj5tb3VudDogL2Rldi9zZGMyOiBjYW4mIzM5O3QgcmVhZCBzdXBlcmJs b2NrPGJyPltyb290QGxvY2FsaG9zdCBURUdSQV0jIHhmc19sb2dwcmludCAtdCAvZGV2L3NkYzI8 YnI+Cnhmc19sb2dwcmludDo8YnI+oKCgIGRhdGEgZGV2aWNlOiAweDgyMjxicj6goKAgbG9nIGRl dmljZTogMHg4MjIgZGFkZHI6IDY4MDk2MzIgbGVuZ3RoOiAyMDQ4MDxicj6gPGJyPqCgoCBsb2cg dGFpbDogMjg0IGhlYWQ6IDQxMiBzdGF0ZTogJmx0O0RJUlRZJmd0Ozxicj6gPGJyPqA8YnI+TE9H IFJFQyBBVCBMU04gY3ljbGUgMSBibG9jayAyODQgKDB4MSwgMHgxMWMpPGJyPj09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT08YnI+ClRSQU5TOiB0aWQ6MHg4NjNjNTAwMKAgdHlwZTpDUkVBVEWgICNpdGVtczo1 oCB0cmFuczoweDCgIHE6MHg4MGI1YzA4PGJyPkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBhZDZm OCBsZW46MjQgYToweDgwYWQ3MzAgbGVuOjEyOCA8YnI+oKCgoKCgoCBCVUY6oCAjcmVnczoyoKAg c3RhcnQgYmxrbm86MHgyoKAgbGVuOjGgoCBibWFwIHNpemU6MaCgIGZsYWdzOjB4MDxicj6goKCg oKCgIEFHSSBCdWZmZXI6IChYQUdJKTxicj4KQlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGFkN2I4 IGxlbjoyOCBhOjB4ODBhZGEyMCBsZW46MTI4IDxicj6goKCgoKCgIEJVRjqgICNyZWdzOjKgoCBz dGFydCBibGtubzoweDE4oKAgbGVuOjigoCBibWFwIHNpemU6MqCgIGZsYWdzOjB4MDxicj6goKCg oKCgIEJVRiBEQVRBPGJyPklOTzogY250OjIgdG90YWw6MiBhOjB4ODBhZGFhOCBsZW46NTYgYTow eDgwYWRiMjAgbGVuOjk2IDxicj4KoKCgoKCgoCBJTk9ERTogI3JlZ3M6MqCgIGlubzoweDg1oCBm bGFnczoweDGgoCBkc2l6ZTowPGJyPqCgoKCgoKAgQ09SRSBpbm9kZTo8YnI+SU5POiBjbnQ6MyB0 b3RhbDozIGE6MHg4MGFkYjg4IGxlbjo1NiBhOjB4ODBiNWM0OCBsZW46OTYgYToweDgwYjVjYjAg bGVuOjY4IDxicj6goKCgoKCgIElOT0RFOiAjcmVnczozoKAgaW5vOjB4ODCgIGZsYWdzOjB4M6Cg IGRzaXplOjY4PGJyPqCgoKCgoKAgQ09SRSBpbm9kZTo8YnI+CqCgoKCgoKCgoKCgoKCgoCBEQVRB IEZPUksgTE9DQUwgaW5vZGUgZGF0YTo8YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGI1Y2Y4 IGxlbjoyNCBhOjB4ODBiNWQzOCBsZW46MTI4IDxicj6goKCgoKCgIEJVRjqgICNyZWdzOjKgoCBz dGFydCBibGtubzoweDCgoCBsZW46MaCgIGJtYXAgc2l6ZToxoKAgZmxhZ3M6MHgwPGJyPqCgoKCg oKAgU1VQRVIgQmxvY2sgQnVmZmVyOjxicj49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PGJyPgpUUkFOUzog dGlkOjB4ODYzYzUwMDCgIHR5cGU6U1RSQVRfV1JJVEWgICNpdGVtczo1oCB0cmFuczoweDCgIHE6 MHg4MGI1ZDE4PGJyPklOTzogY250OjMgdG90YWw6MyBhOjB4ODBhZGI4OCBsZW46NTYgYToweDgw YWRiMjAgbGVuOjk2IGE6MHg4MGFkYmU4IGxlbjoxNiA8YnI+oKCgoKCgoCBJTk9ERTogI3JlZ3M6 M6CgIGlubzoweDg1oCBmbGFnczoweDWgoCBkc2l6ZToxNjxicj6goKCgoKCgIENPUkUgaW5vZGU6 PGJyPgqgoKCgoKCgoKCgoKCgoKAgREFUQSBGT1JLIEVYVEVOVFMgaW5vZGUgZGF0YTo8YnI+QlVG OiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGFkYmM4IGxlbjoyNCBhOjB4ODBhZDczMCBsZW46MTI4IDxi cj6goKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDGgoCBsZW46MaCgIGJtYXAg c2l6ZToxoKAgZmxhZ3M6MHgwPGJyPqCgoKCgoKAgQUdGIEJ1ZmZlcjogKFhBR0YpPGJyPkJVRjog Y250OjIgdG90YWw6MiBhOjB4ODBhZGFlOCBsZW46MjggYToweDgwYWRhMjAgbGVuOjEyOCA8YnI+ CqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4MTCgoCBsZW46OKCgIGJtYXAg c2l6ZToyoKAgZmxhZ3M6MHgwPGJyPqCgoKCgoKAgQlVGIERBVEE8YnI+QlVGOiBjbnQ6MiB0b3Rh bDoyIGE6MHg4MGI1YzA4IGxlbjoyOCBhOjB4ODBiNWQzOCBsZW46MTI4IDxicj6goKCgoKCgIEJV RjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDigoCBsZW46OKCgIGJtYXAgc2l6ZToyoKAgZmxh Z3M6MHgwPGJyPgqgoKCgoKCgIEJVRiBEQVRBPGJyPkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBi NWM0OCBsZW46MjQgYToweDgwYjVkYzAgbGVuOjEyOCA8YnI+oKCgoKCgoCBCVUY6oCAjcmVnczoy oKAgc3RhcnQgYmxrbm86MHgwoKAgbGVuOjGgoCBibWFwIHNpemU6MaCgIGZsYWdzOjB4MDxicj6g oKCgoKCgIFNVUEVSIEJsb2NrIEJ1ZmZlcjo8YnI+PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTxicj4KVFJB TlM6IHRpZDoweDg2M2M1MDAwoCB0eXBlOlNUUkFUX1dSSVRFoCAjaXRlbXM6NaAgdHJhbnM6MHgw oCBxOjB4ODBiNWM2ODxicj5JTk86IGNudDozIHRvdGFsOjMgYToweDgwYWRiODggbGVuOjU2IGE6 MHg4MGFkYjIwIGxlbjo5NiBhOjB4ODBiNWM4OCBsZW46MTYgPGJyPqCgoKCgoKAgSU5PREU6ICNy ZWdzOjOgoCBpbm86MHg4NaAgZmxhZ3M6MHg1oKAgZHNpemU6MTY8YnI+oKCgoKCgoCBDT1JFIGlu b2RlOjxicj4KoKCgoKCgoKCgoKCgoKCgIERBVEEgRk9SSyBFWFRFTlRTIGlub2RlIGRhdGE6PGJy PkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBhZDZmOCBsZW46MjQgYToweDgwYWQ3MzAgbGVuOjEy OCA8YnI+oKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHgxoKAgbGVuOjGgoCBi bWFwIHNpemU6MaCgIGZsYWdzOjB4MDxicj6goKCgoKCgIEFHRiBCdWZmZXI6IChYQUdGKTxicj5C VUY6IGNudDoyIHRvdGFsOjIgYToweDgwYWQ3YjggbGVuOjI4IGE6MHg4MGFkYTIwIGxlbjoxMjgg PGJyPgqgoKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDEwoKAgbGVuOjigoCBi bWFwIHNpemU6MqCgIGZsYWdzOjB4MDxicj6goKCgoKCgIEJVRiBEQVRBPGJyPkJVRjogY250OjIg dG90YWw6MiBhOjB4ODBiNWMyOCBsZW46MjggYToweDgwYjVkMzggbGVuOjEyOCA8YnI+oKCgoKCg oCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHg4oKAgbGVuOjigoCBibWFwIHNpemU6MqCg IGZsYWdzOjB4MDxicj4KoKCgoKCgoCBCVUYgREFUQTxicj5CVUY6IGNudDoyIHRvdGFsOjIgYTow eDgwYjVkMTggbGVuOjI0IGE6MHg4MGI1ZGMwIGxlbjoxMjggPGJyPqCgoKCgoKAgQlVGOqAgI3Jl Z3M6MqCgIHN0YXJ0IGJsa25vOjB4MKCgIGxlbjoxoKAgYm1hcCBzaXplOjGgoCBmbGFnczoweDA8 YnI+oKCgoKCgoCBTVVBFUiBCbG9jayBCdWZmZXI6PGJyPj09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT08YnI+ ClRSQU5TOiB0aWQ6MHg4NjNjNTAwMKAgdHlwZTpTVFJBVF9XUklURaAgI2l0ZW1zOjWgIHRyYW5z OjB4MKAgcToweDgwYjVjZjg8YnI+SU5POiBjbnQ6MyB0b3RhbDozIGE6MHg4MGFkYjg4IGxlbjo1 NiBhOjB4ODBhZGIyMCBsZW46OTYgYToweDgwYWRiZTggbGVuOjE2IDxicj6goKCgoKCgIElOT0RF OiAjcmVnczozoKAgaW5vOjB4ODWgIGZsYWdzOjB4NaCgIGRzaXplOjE2PGJyPqCgoKCgoKAgQ09S RSBpbm9kZTo8YnI+CqCgoKCgoKCgoKCgoKCgoCBEQVRBIEZPUksgRVhURU5UUyBpbm9kZSBkYXRh Ojxicj5CVUY6IGNudDoyIHRvdGFsOjIgYToweDgwYWRiYzggbGVuOjI0IGE6MHg4MGFkNzMwIGxl bjoxMjggPGJyPqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4MaCgIGxlbjox oKAgYm1hcCBzaXplOjGgoCBmbGFnczoweDA8YnI+oKCgoKCgoCBBR0YgQnVmZmVyOiAoWEFHRik8 YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGFkYWU4IGxlbjoyOCBhOjB4ODBhZGEyMCBsZW46 MTI4IDxicj4KoKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHgxMKCgIGxlbjo4 oKAgYm1hcCBzaXplOjKgoCBmbGFnczoweDA8YnI+oKCgoKCgoCBCVUYgREFUQTxicj5CVUY6IGNu dDoyIHRvdGFsOjIgYToweDgwYjVjMDggbGVuOjI4IGE6MHg4MGI1ZDM4IGxlbjoxMjggPGJyPqCg oKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4OKCgIGxlbjo4oKAgYm1hcCBzaXpl OjKgoCBmbGFnczoweDA8YnI+CqCgoKCgoKAgQlVGIERBVEE8YnI+QlVGOiBjbnQ6MiB0b3RhbDoy IGE6MHg4MGI1YzY4IGxlbjoyNCBhOjB4ODBiNWRjMCBsZW46MTI4IDxicj6goKCgoKCgIEJVRjqg ICNyZWdzOjKgoCBzdGFydCBibGtubzoweDCgoCBsZW46MaCgIGJtYXAgc2l6ZToxoKAgZmxhZ3M6 MHgwPGJyPqCgoKCgoKAgU1VQRVIgQmxvY2sgQnVmZmVyOjxicj49PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PGJyPgpUUkFOUzogdGlkOjB4ODYzYzUwMDCgIHR5cGU6U1RSQVRfV1JJVEWgICNpdGVtczo1oCB0 cmFuczoweDCgIHE6MHg4MGI1YzQ4PGJyPklOTzogY250OjMgdG90YWw6MyBhOjB4ODBhZGI4OCBs ZW46NTYgYToweDgwYWRiMjAgbGVuOjk2IGE6MHg4MGI1Yzg4IGxlbjoxNiA8YnI+oKCgoKCgoCBJ Tk9ERTogI3JlZ3M6M6CgIGlubzoweDg1oCBmbGFnczoweDWgoCBkc2l6ZToxNjxicj6goKCgoKCg IENPUkUgaW5vZGU6PGJyPgqgoKCgoKCgoKCgoKCgoKAgREFUQSBGT1JLIEVYVEVOVFMgaW5vZGUg ZGF0YTo8YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGFkNmY4IGxlbjoyNCBhOjB4ODBhZDcz MCBsZW46MTI4IDxicj6goKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDGgoCBs ZW46MaCgIGJtYXAgc2l6ZToxoKAgZmxhZ3M6MHgwPGJyPqCgoKCgoKAgQUdGIEJ1ZmZlcjogKFhB R0YpPGJyPkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBhZDdiOCBsZW46MjggYToweDgwYWRhMjAg bGVuOjEyOCA8YnI+CqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4MTCgoCBs ZW46OKCgIGJtYXAgc2l6ZToyoKAgZmxhZ3M6MHgwPGJyPqCgoKCgoKAgQlVGIERBVEE8YnI+QlVG OiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGI1YzI4IGxlbjoyOCBhOjB4ODBiNWQzOCBsZW46MTI4IDxi cj6goKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDigoCBsZW46OKCgIGJtYXAg c2l6ZToyoKAgZmxhZ3M6MHgwPGJyPgqgoKCgoKCgIEJVRiBEQVRBPGJyPkJVRjogY250OjIgdG90 YWw6MiBhOjB4ODBiNWNmOCBsZW46MjQgYToweDgwYjVkYzAgbGVuOjEyOCA8YnI+oKCgoKCgoCBC VUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHgwoKAgbGVuOjGgoCBibWFwIHNpemU6MaCgIGZs YWdzOjB4MDxicj6goKCgoKCgIFNVUEVSIEJsb2NrIEJ1ZmZlcjo8YnI+PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PTxicj4KVFJBTlM6IHRpZDoweDg2M2M1MDAwoCB0eXBlOlNUUkFUX1dSSVRFoCAjaXRlbXM6 NaAgdHJhbnM6MHgwoCBxOjB4ODBiNWQxODxicj5JTk86IGNudDozIHRvdGFsOjMgYToweDgwYWRi ODggbGVuOjU2IGE6MHg4MGFkYjIwIGxlbjo5NiBhOjB4ODBhZGJlOCBsZW46MTYgPGJyPqCgoKCg oKAgSU5PREU6ICNyZWdzOjOgoCBpbm86MHg4NaAgZmxhZ3M6MHg1oKAgZHNpemU6MTY8YnI+oKCg oKCgoCBDT1JFIGlub2RlOjxicj4KoKCgoKCgoKCgoKCgoKCgIERBVEEgRk9SSyBFWFRFTlRTIGlu b2RlIGRhdGE6PGJyPkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBhZGJjOCBsZW46MjQgYToweDgw YWQ3MzAgbGVuOjEyOCA8YnI+oKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHgx oKAgbGVuOjGgoCBibWFwIHNpemU6MaCgIGZsYWdzOjB4MDxicj6goKCgoKCgIEFHRiBCdWZmZXI6 IChYQUdGKTxicj5CVUY6IGNudDoyIHRvdGFsOjIgYToweDgwYWRhZTggbGVuOjI4IGE6MHg4MGFk YTIwIGxlbjoxMjggPGJyPgqgoKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDEw oKAgbGVuOjigoCBibWFwIHNpemU6MqCgIGZsYWdzOjB4MDxicj6goKCgoKCgIEJVRiBEQVRBPGJy PkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBiNWMwOCBsZW46MjggYToweDgwYjVkMzggbGVuOjEy OCA8YnI+oKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHg4oKAgbGVuOjigoCBi bWFwIHNpemU6MqCgIGZsYWdzOjB4MDxicj4KoKCgoKCgoCBCVUYgREFUQTxicj5CVUY6IGNudDoy IHRvdGFsOjIgYToweDgwYjVjNDggbGVuOjI0IGE6MHg4MGI1ZGMwIGxlbjoxMjggPGJyPqCgoKCg oKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4MKCgIGxlbjoxoKAgYm1hcCBzaXplOjGg oCBmbGFnczoweDA8YnI+oKCgoKCgoCBTVVBFUiBCbG9jayBCdWZmZXI6PGJyPj09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT08YnI+ClRSQU5TOiB0aWQ6MHg4NjNjNTAwMKAgdHlwZTpTVFJBVF9XUklURaAgI2l0 ZW1zOjWgIHRyYW5zOjB4MKAgcToweDgwYjVjNjg8YnI+SU5POiBjbnQ6MyB0b3RhbDozIGE6MHg4 MGFkYjg4IGxlbjo1NiBhOjB4ODBhZGIyMCBsZW46OTYgYToweDgwYjVjODggbGVuOjE2IDxicj6g oKCgoKCgIElOT0RFOiAjcmVnczozoKAgaW5vOjB4ODWgIGZsYWdzOjB4NaCgIGRzaXplOjE2PGJy PqCgoKCgoKAgQ09SRSBpbm9kZTo8YnI+CqCgoKCgoKCgoKCgoKCgoCBEQVRBIEZPUksgRVhURU5U UyBpbm9kZSBkYXRhOjxicj5CVUY6IGNudDoyIHRvdGFsOjIgYToweDgwYWQ2ZjggbGVuOjI0IGE6 MHg4MGFkNzMwIGxlbjoxMjggPGJyPqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25v OjB4MaCgIGxlbjoxoKAgYm1hcCBzaXplOjGgoCBmbGFnczoweDA8YnI+oKCgoKCgoCBBR0YgQnVm ZmVyOiAoWEFHRik8YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGFkN2I4IGxlbjoyOCBhOjB4 ODBhZGEyMCBsZW46MTI4IDxicj4KoKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86 MHgxMKCgIGxlbjo4oKAgYm1hcCBzaXplOjKgoCBmbGFnczoweDA8YnI+oKCgoKCgoCBCVUYgREFU QTxicj5CVUY6IGNudDoyIHRvdGFsOjIgYToweDgwYjVjMjggbGVuOjI4IGE6MHg4MGI1ZDM4IGxl bjoxMjggPGJyPqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4OKCgIGxlbjo4 oKAgYm1hcCBzaXplOjKgoCBmbGFnczoweDA8YnI+CqCgoKCgoKAgQlVGIERBVEE8YnI+QlVGOiBj bnQ6MiB0b3RhbDoyIGE6MHg4MGI1ZDE4IGxlbjoyNCBhOjB4ODBiNWRjMCBsZW46MTI4IDxicj6g oKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDCgoCBsZW46MaCgIGJtYXAgc2l6 ZToxoKAgZmxhZ3M6MHgwPGJyPqCgoKCgoKAgU1VQRVIgQmxvY2sgQnVmZmVyOjxicj49PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PGJyPgpUUkFOUzogdGlkOjB4ODYzYzUwMDCgIHR5cGU6U1RSQVRfV1JJVEWg ICNpdGVtczo1oCB0cmFuczoweDCgIHE6MHg4MGI1Y2Y4PGJyPklOTzogY250OjMgdG90YWw6MyBh OjB4ODBhZGI4OCBsZW46NTYgYToweDgwYWRiMjAgbGVuOjk2IGE6MHg4MGFkYmU4IGxlbjoxNiA8 YnI+oKCgoKCgoCBJTk9ERTogI3JlZ3M6M6CgIGlubzoweDg1oCBmbGFnczoweDWgoCBkc2l6ZTox Njxicj6goKCgoKCgIENPUkUgaW5vZGU6PGJyPgqgoKCgoKCgoKCgoKCgoKAgREFUQSBGT1JLIEVY VEVOVFMgaW5vZGUgZGF0YTo8YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGFkYmM4IGxlbjoy NCBhOjB4ODBhZDczMCBsZW46MTI4IDxicj6goKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBi bGtubzoweDGgoCBsZW46MaCgIGJtYXAgc2l6ZToxoKAgZmxhZ3M6MHgwPGJyPqCgoKCgoKAgQUdG IEJ1ZmZlcjogKFhBR0YpPGJyPkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBhZGFlOCBsZW46Mjgg YToweDgwYWRhMjAgbGVuOjEyOCA8YnI+CqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJs a25vOjB4MTCgoCBsZW46OKCgIGJtYXAgc2l6ZToyoKAgZmxhZ3M6MHgwPGJyPqCgoKCgoKAgQlVG IERBVEE8YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGI1YzA4IGxlbjoyOCBhOjB4ODBiNWQz OCBsZW46MTI4IDxicj6goKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDigoCBs ZW46OKCgIGJtYXAgc2l6ZToyoKAgZmxhZ3M6MHgwPGJyPgqgoKCgoKCgIEJVRiBEQVRBPGJyPkJV RjogY250OjIgdG90YWw6MiBhOjB4ODBiNWM2OCBsZW46MjQgYToweDgwYjVkYzAgbGVuOjEyOCA8 YnI+oKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHgwoKAgbGVuOjGgoCBibWFw IHNpemU6MaCgIGZsYWdzOjB4MDxicj6goKCgoKCgIFNVUEVSIEJsb2NrIEJ1ZmZlcjo8YnI+PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PTxicj4KVFJBTlM6IHRpZDoweDg2M2M1MDAwoCB0eXBlOlNUUkFUX1dS SVRFoCAjaXRlbXM6NaAgdHJhbnM6MHgwoCBxOjB4ODBiNWM0ODxicj5JTk86IGNudDozIHRvdGFs OjMgYToweDgwYWRiODggbGVuOjU2IGE6MHg4MGFkYjIwIGxlbjo5NiBhOjB4ODBiNWM4OCBsZW46 MTYgPGJyPqCgoKCgoKAgSU5PREU6ICNyZWdzOjOgoCBpbm86MHg4NaAgZmxhZ3M6MHg1oKAgZHNp emU6MTY8YnI+oKCgoKCgoCBDT1JFIGlub2RlOjxicj4KoKCgoKCgoKCgoKCgoKCgIERBVEEgRk9S SyBFWFRFTlRTIGlub2RlIGRhdGE6PGJyPkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBhZDZmOCBs ZW46MjQgYToweDgwYWQ3MzAgbGVuOjEyOCA8YnI+oKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3Rh cnQgYmxrbm86MHgxoKAgbGVuOjGgoCBibWFwIHNpemU6MaCgIGZsYWdzOjB4MDxicj6goKCgoKCg IEFHRiBCdWZmZXI6IChYQUdGKTxicj5CVUY6IGNudDoyIHRvdGFsOjIgYToweDgwYWQ3YjggbGVu OjI4IGE6MHg4MGFkYTIwIGxlbjoxMjggPGJyPgqgoKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFy dCBibGtubzoweDEwoKAgbGVuOjigoCBibWFwIHNpemU6MqCgIGZsYWdzOjB4MDxicj6goKCgoKCg IEJVRiBEQVRBPGJyPkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBiNWMyOCBsZW46MjggYToweDgw YjVkMzggbGVuOjEyOCA8YnI+oKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHg4 oKAgbGVuOjigoCBibWFwIHNpemU6MqCgIGZsYWdzOjB4MDxicj4KoKCgoKCgoCBCVUYgREFUQTxi cj5CVUY6IGNudDoyIHRvdGFsOjIgYToweDgwYjVjZjggbGVuOjI0IGE6MHg4MGI1ZGMwIGxlbjox MjggPGJyPqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4MKCgIGxlbjoxoKAg Ym1hcCBzaXplOjGgoCBmbGFnczoweDA8YnI+oKCgoKCgoCBTVVBFUiBCbG9jayBCdWZmZXI6PGJy Pj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT08YnI+ClRSQU5TOiB0aWQ6MHg4NjNjNTAwMKAgdHlwZTpTVFJB VF9XUklURaAgI2l0ZW1zOjWgIHRyYW5zOjB4MKAgcToweDgwYjVkMTg8YnI+SU5POiBjbnQ6MyB0 b3RhbDozIGE6MHg4MGFkYjg4IGxlbjo1NiBhOjB4ODBhZGIyMCBsZW46OTYgYToweDgwYWRiZTgg bGVuOjE2IDxicj6goKCgoKCgIElOT0RFOiAjcmVnczozoKAgaW5vOjB4ODWgIGZsYWdzOjB4NaCg IGRzaXplOjE2PGJyPqCgoKCgoKAgQ09SRSBpbm9kZTo8YnI+CqCgoKCgoKCgoKCgoKCgoCBEQVRB IEZPUksgRVhURU5UUyBpbm9kZSBkYXRhOjxicj5CVUY6IGNudDoyIHRvdGFsOjIgYToweDgwYWRi YzggbGVuOjI0IGE6MHg4MGFkNzMwIGxlbjoxMjggPGJyPqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCg IHN0YXJ0IGJsa25vOjB4MaCgIGxlbjoxoKAgYm1hcCBzaXplOjGgoCBmbGFnczoweDA8YnI+oKCg oKCgoCBBR0YgQnVmZmVyOiAoWEFHRik8YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGFkYWU4 IGxlbjoyOCBhOjB4ODBhZGEyMCBsZW46MTI4IDxicj4KoKCgoKCgoCBCVUY6oCAjcmVnczoyoKAg c3RhcnQgYmxrbm86MHgxMKCgIGxlbjo4oKAgYm1hcCBzaXplOjKgoCBmbGFnczoweDA8YnI+oKCg oKCgoCBCVUYgREFUQTxicj5CVUY6IGNudDoyIHRvdGFsOjIgYToweDgwYjVjMDggbGVuOjI4IGE6 MHg4MGI1ZDM4IGxlbjoxMjggPGJyPqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25v OjB4OKCgIGxlbjo4oKAgYm1hcCBzaXplOjKgoCBmbGFnczoweDA8YnI+CqCgoKCgoKAgQlVGIERB VEE8YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGI1YzQ4IGxlbjoyNCBhOjB4ODBiNWRjMCBs ZW46MTI4IDxicj6goKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDCgoCBsZW46 MaCgIGJtYXAgc2l6ZToxoKAgZmxhZ3M6MHgwPGJyPqCgoKCgoKAgU1VQRVIgQmxvY2sgQnVmZmVy Ojxicj49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PGJyPgpUUkFOUzogdGlkOjB4ODYzYzUwMDCgIHR5cGU6 U1RSQVRfV1JJVEWgICNpdGVtczo1oCB0cmFuczoweDCgIHE6MHg4MGI1YzY4PGJyPklOTzogY250 OjMgdG90YWw6MyBhOjB4ODBhZGI4OCBsZW46NTYgYToweDgwYWRiMjAgbGVuOjk2IGE6MHg4MGI1 Yzg4IGxlbjoxNiA8YnI+oKCgoKCgoCBJTk9ERTogI3JlZ3M6M6CgIGlubzoweDg1oCBmbGFnczow eDWgoCBkc2l6ZToxNjxicj6goKCgoKCgIENPUkUgaW5vZGU6PGJyPgqgoKCgoKCgoKCgoKCgoKAg REFUQSBGT1JLIEVYVEVOVFMgaW5vZGUgZGF0YTo8YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4 MGFkNmY4IGxlbjoyNCBhOjB4ODBhZDczMCBsZW46MTI4IDxicj6goKCgoKCgIEJVRjqgICNyZWdz OjKgoCBzdGFydCBibGtubzoweDGgoCBsZW46MaCgIGJtYXAgc2l6ZToxoKAgZmxhZ3M6MHgwPGJy PqCgoKCgoKAgQUdGIEJ1ZmZlcjogKFhBR0YpPGJyPkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBh ZDdiOCBsZW46MjggYToweDgwYWRhMjAgbGVuOjEyOCA8YnI+CqCgoKCgoKAgQlVGOqAgI3JlZ3M6 MqCgIHN0YXJ0IGJsa25vOjB4MTCgoCBsZW46OKCgIGJtYXAgc2l6ZToyoKAgZmxhZ3M6MHgwPGJy PqCgoKCgoKAgQlVGIERBVEE8YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGI1YzI4IGxlbjoy OCBhOjB4ODBiNWQzOCBsZW46MTI4IDxicj6goKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBi bGtubzoweDigoCBsZW46OKCgIGJtYXAgc2l6ZToyoKAgZmxhZ3M6MHgwPGJyPgqgoKCgoKCgIEJV RiBEQVRBPGJyPkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBiNWQxOCBsZW46MjQgYToweDgwYjVk YzAgbGVuOjEyOCA8YnI+oKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHgwoKAg bGVuOjGgoCBibWFwIHNpemU6MaCgIGZsYWdzOjB4MDxicj6goKCgoKCgIFNVUEVSIEJsb2NrIEJ1 ZmZlcjo8YnI+PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PTxicj4KVFJBTlM6IHRpZDoweDg2M2M1MDAwoCB0 eXBlOlNUUkFUX1dSSVRFoCAjaXRlbXM6NaAgdHJhbnM6MHgwoCBxOjB4ODBiNWNmODxicj5JTk86 IGNudDozIHRvdGFsOjMgYToweDgwYWRiODggbGVuOjU2IGE6MHg4MGFkYjIwIGxlbjo5NiBhOjB4 ODBhZGJlOCBsZW46MTYgPGJyPqCgoKCgoKAgSU5PREU6ICNyZWdzOjOgoCBpbm86MHg4NaAgZmxh Z3M6MHg1oKAgZHNpemU6MTY8YnI+oKCgoKCgoCBDT1JFIGlub2RlOjxicj4KoKCgoKCgoKCgoKCg oKCgIERBVEEgRk9SSyBFWFRFTlRTIGlub2RlIGRhdGE6PGJyPkJVRjogY250OjIgdG90YWw6MiBh OjB4ODBhZGJjOCBsZW46MjQgYToweDgwYWQ3MzAgbGVuOjEyOCA8YnI+oKCgoKCgoCBCVUY6oCAj cmVnczoyoKAgc3RhcnQgYmxrbm86MHgxoKAgbGVuOjGgoCBibWFwIHNpemU6MaCgIGZsYWdzOjB4 MDxicj6goKCgoKCgIEFHRiBCdWZmZXI6IChYQUdGKTxicj5CVUY6IGNudDoyIHRvdGFsOjIgYTow eDgwYWRhZTggbGVuOjI4IGE6MHg4MGFkYTIwIGxlbjoxMjggPGJyPgqgoKCgoKCgIEJVRjqgICNy ZWdzOjKgoCBzdGFydCBibGtubzoweDEwoKAgbGVuOjigoCBibWFwIHNpemU6MqCgIGZsYWdzOjB4 MDxicj6goKCgoKCgIEJVRiBEQVRBPGJyPkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBiNWMwOCBs ZW46MjggYToweDgwYjVkMzggbGVuOjEyOCA8YnI+oKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3Rh cnQgYmxrbm86MHg4oKAgbGVuOjigoCBibWFwIHNpemU6MqCgIGZsYWdzOjB4MDxicj4KoKCgoKCg oCBCVUYgREFUQTxicj5CVUY6IGNudDoyIHRvdGFsOjIgYToweDgwYjVjNjggbGVuOjI0IGE6MHg4 MGI1ZGMwIGxlbjoxMjggPGJyPqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4 MKCgIGxlbjoxoKAgYm1hcCBzaXplOjGgoCBmbGFnczoweDA8YnI+oKCgoKCgoCBTVVBFUiBCbG9j ayBCdWZmZXI6PGJyPj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT08YnI+ClRSQU5TOiB0aWQ6MHg4NjNjNTAw MKAgdHlwZTpTVFJBVF9XUklURaAgI2l0ZW1zOjWgIHRyYW5zOjB4MKAgcToweDgwYjVjNDg8YnI+ SU5POiBjbnQ6MyB0b3RhbDozIGE6MHg4MGFkYjg4IGxlbjo1NiBhOjB4ODBhZGIyMCBsZW46OTYg YToweDgwYjVjODggbGVuOjE2IDxicj6goKCgoKCgIElOT0RFOiAjcmVnczozoKAgaW5vOjB4ODWg IGZsYWdzOjB4NaCgIGRzaXplOjE2PGJyPqCgoKCgoKAgQ09SRSBpbm9kZTo8YnI+CqCgoKCgoKCg oKCgoKCgoCBEQVRBIEZPUksgRVhURU5UUyBpbm9kZSBkYXRhOjxicj5CVUY6IGNudDoyIHRvdGFs OjIgYToweDgwYWQ2ZjggbGVuOjI0IGE6MHg4MGFkNzMwIGxlbjoxMjggPGJyPqCgoKCgoKAgQlVG OqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4MaCgIGxlbjoxoKAgYm1hcCBzaXplOjGgoCBmbGFn czoweDA8YnI+oKCgoKCgoCBBR0YgQnVmZmVyOiAoWEFHRik8YnI+QlVGOiBjbnQ6MiB0b3RhbDoy IGE6MHg4MGFkN2I4IGxlbjoyOCBhOjB4ODBhZGEyMCBsZW46MTI4IDxicj4KoKCgoKCgoCBCVUY6 oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHgxMKCgIGxlbjo4oKAgYm1hcCBzaXplOjKgoCBmbGFn czoweDA8YnI+oKCgoKCgoCBCVUYgREFUQTxicj5CVUY6IGNudDoyIHRvdGFsOjIgYToweDgwYjVj MjggbGVuOjI4IGE6MHg4MGI1ZDM4IGxlbjoxMjggPGJyPqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCg IHN0YXJ0IGJsa25vOjB4OKCgIGxlbjo4oKAgYm1hcCBzaXplOjKgoCBmbGFnczoweDA8YnI+CqCg oKCgoKAgQlVGIERBVEE8YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGI1Y2Y4IGxlbjoyNCBh OjB4ODBiNWRjMCBsZW46MTI4IDxicj6goKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtu bzoweDCgoCBsZW46MaCgIGJtYXAgc2l6ZToxoKAgZmxhZ3M6MHgwPGJyPqCgoKCgoKAgU1VQRVIg QmxvY2sgQnVmZmVyOjxicj49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PGJyPgpUUkFOUzogdGlkOjB4ODYz YzUwMDCgIHR5cGU6U1RSQVRfV1JJVEWgICNpdGVtczo1oCB0cmFuczoweDCgIHE6MHg4MGI1ZDE4 PGJyPklOTzogY250OjMgdG90YWw6MyBhOjB4ODBhZGI4OCBsZW46NTYgYToweDgwYWRiMjAgbGVu Ojk2IGE6MHg4MGFkYmU4IGxlbjoxNiA8YnI+oKCgoKCgoCBJTk9ERTogI3JlZ3M6M6CgIGlubzow eDg1oCBmbGFnczoweDWgoCBkc2l6ZToxNjxicj6goKCgoKCgIENPUkUgaW5vZGU6PGJyPgqgoKCg oKCgoKCgoKCgoKAgREFUQSBGT1JLIEVYVEVOVFMgaW5vZGUgZGF0YTo8YnI+QlVGOiBjbnQ6MiB0 b3RhbDoyIGE6MHg4MGFkYmM4IGxlbjoyNCBhOjB4ODBhZDczMCBsZW46MTI4IDxicj6goKCgoKCg IEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDGgoCBsZW46MaCgIGJtYXAgc2l6ZToxoKAg ZmxhZ3M6MHgwPGJyPqCgoKCgoKAgQUdGIEJ1ZmZlcjogKFhBR0YpPGJyPkJVRjogY250OjIgdG90 YWw6MiBhOjB4ODBhZGFlOCBsZW46MjggYToweDgwYWRhMjAgbGVuOjEyOCA8YnI+CqCgoKCgoKAg QlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4MTCgoCBsZW46OKCgIGJtYXAgc2l6ZToyoKAg ZmxhZ3M6MHgwPGJyPqCgoKCgoKAgQlVGIERBVEE8YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4 MGI1YzA4IGxlbjoyOCBhOjB4ODBiNWQzOCBsZW46MTI4IDxicj6goKCgoKCgIEJVRjqgICNyZWdz OjKgoCBzdGFydCBibGtubzoweDigoCBsZW46OKCgIGJtYXAgc2l6ZToyoKAgZmxhZ3M6MHgwPGJy PgqgoKCgoKCgIEJVRiBEQVRBPGJyPkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBiNWM0OCBsZW46 MjQgYToweDgwYjVkYzAgbGVuOjEyOCA8YnI+oKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3RhcnQg Ymxrbm86MHgwoKAgbGVuOjGgoCBibWFwIHNpemU6MaCgIGZsYWdzOjB4MDxicj6goKCgoKCgIFNV UEVSIEJsb2NrIEJ1ZmZlcjo8YnI+PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTxicj4KVFJBTlM6IHRpZDow eDg2M2M1MDAwoCB0eXBlOlNUUkFUX1dSSVRFoCAjaXRlbXM6NaAgdHJhbnM6MHgwoCBxOjB4ODBi NWM2ODxicj5JTk86IGNudDozIHRvdGFsOjMgYToweDgwYWRiODggbGVuOjU2IGE6MHg4MGFkYjIw IGxlbjo5NiBhOjB4ODBiNWM4OCBsZW46MTYgPGJyPqCgoKCgoKAgSU5PREU6ICNyZWdzOjOgoCBp bm86MHg4NaAgZmxhZ3M6MHg1oKAgZHNpemU6MTY8YnI+oKCgoKCgoCBDT1JFIGlub2RlOjxicj4K oKCgoKCgoKCgoKCgoKCgIERBVEEgRk9SSyBFWFRFTlRTIGlub2RlIGRhdGE6PGJyPkJVRjogY250 OjIgdG90YWw6MiBhOjB4ODBhZDZmOCBsZW46MjQgYToweDgwYWQ3MzAgbGVuOjEyOCA8YnI+oKCg oKCgoCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHgxoKAgbGVuOjGgoCBibWFwIHNpemU6 MaCgIGZsYWdzOjB4MDxicj6goKCgoKCgIEFHRiBCdWZmZXI6IChYQUdGKTxicj5CVUY6IGNudDoy IHRvdGFsOjIgYToweDgwYWQ3YjggbGVuOjI4IGE6MHg4MGFkYTIwIGxlbjoxMjggPGJyPgqgoKCg oKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDEwoKAgbGVuOjigoCBibWFwIHNpemU6 MqCgIGZsYWdzOjB4MDxicj6goKCgoKCgIEJVRiBEQVRBPGJyPkJVRjogY250OjIgdG90YWw6MiBh OjB4ODBiNWMyOCBsZW46MjggYToweDgwYjVkMzggbGVuOjEyOCA8YnI+oKCgoKCgoCBCVUY6oCAj cmVnczoyoKAgc3RhcnQgYmxrbm86MHg4oKAgbGVuOjigoCBibWFwIHNpemU6MqCgIGZsYWdzOjB4 MDxicj4KoKCgoKCgoCBCVUYgREFUQTxicj5CVUY6IGNudDoyIHRvdGFsOjIgYToweDgwYjVkMTgg bGVuOjI0IGE6MHg4MGI1ZGMwIGxlbjoxMjggPGJyPqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0 YXJ0IGJsa25vOjB4MKCgIGxlbjoxoKAgYm1hcCBzaXplOjGgoCBmbGFnczoweDA8YnI+oKCgoKCg oCBTVVBFUiBCbG9jayBCdWZmZXI6PGJyPj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT08YnI+ClRSQU5TOiB0 aWQ6MHg4NjNjNTAwMKAgdHlwZTpTVFJBVF9XUklURaAgI2l0ZW1zOjWgIHRyYW5zOjB4MKAgcTow eDgwYjVjZjg8YnI+SU5POiBjbnQ6MyB0b3RhbDozIGE6MHg4MGFkYjg4IGxlbjo1NiBhOjB4ODBh ZGIyMCBsZW46OTYgYToweDgwYWRiZTggbGVuOjE2IDxicj6goKCgoKCgIElOT0RFOiAjcmVnczoz oKAgaW5vOjB4ODWgIGZsYWdzOjB4NaCgIGRzaXplOjE2PGJyPqCgoKCgoKAgQ09SRSBpbm9kZTo8 YnI+CqCgoKCgoKCgoKCgoKCgoCBEQVRBIEZPUksgRVhURU5UUyBpbm9kZSBkYXRhOjxicj5CVUY6 IGNudDoyIHRvdGFsOjIgYToweDgwYWRiYzggbGVuOjI0IGE6MHg4MGFkNzMwIGxlbjoxMjggPGJy PqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4MaCgIGxlbjoxoKAgYm1hcCBz aXplOjGgoCBmbGFnczoweDA8YnI+oKCgoKCgoCBBR0YgQnVmZmVyOiAoWEFHRik8YnI+QlVGOiBj bnQ6MiB0b3RhbDoyIGE6MHg4MGFkYWU4IGxlbjoyOCBhOjB4ODBhZGEyMCBsZW46MTI4IDxicj4K oKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHgxMKCgIGxlbjo4oKAgYm1hcCBz aXplOjKgoCBmbGFnczoweDA8YnI+oKCgoKCgoCBCVUYgREFUQTxicj5CVUY6IGNudDoyIHRvdGFs OjIgYToweDgwYjVjMDggbGVuOjI4IGE6MHg4MGI1ZDM4IGxlbjoxMjggPGJyPqCgoKCgoKAgQlVG OqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4OKCgIGxlbjo4oKAgYm1hcCBzaXplOjKgoCBmbGFn czoweDA8YnI+CqCgoKCgoKAgQlVGIERBVEE8YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGI1 YzY4IGxlbjoyNCBhOjB4ODBiNWRjMCBsZW46MTI4IDxicj6goKCgoKCgIEJVRjqgICNyZWdzOjKg oCBzdGFydCBibGtubzoweDCgoCBsZW46MaCgIGJtYXAgc2l6ZToxoKAgZmxhZ3M6MHgwPGJyPqCg oKCgoKAgU1VQRVIgQmxvY2sgQnVmZmVyOjxicj49PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PGJyPgpUUkFO UzogdGlkOjB4ODYzYzUwMDCgIHR5cGU6U1RSQVRfV1JJVEWgICNpdGVtczo1oCB0cmFuczoweDCg IHE6MHg4MGI1YzQ4PGJyPklOTzogY250OjMgdG90YWw6MyBhOjB4ODBhZGI4OCBsZW46NTYgYTow eDgwYWRiMjAgbGVuOjk2IGE6MHg4MGI1Yzg4IGxlbjoxNiA8YnI+oKCgoKCgoCBJTk9ERTogI3Jl Z3M6M6CgIGlubzoweDg1oCBmbGFnczoweDWgoCBkc2l6ZToxNjxicj6goKCgoKCgIENPUkUgaW5v ZGU6PGJyPgqgoKCgoKCgoKCgoKCgoKAgREFUQSBGT1JLIEVYVEVOVFMgaW5vZGUgZGF0YTo8YnI+ QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGFkNmY4IGxlbjoyNCBhOjB4ODBhZDczMCBsZW46MTI4 IDxicj6goKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDGgoCBsZW46MaCgIGJt YXAgc2l6ZToxoKAgZmxhZ3M6MHgwPGJyPqCgoKCgoKAgQUdGIEJ1ZmZlcjogKFhBR0YpPGJyPkJV RjogY250OjIgdG90YWw6MiBhOjB4ODBhZDdiOCBsZW46MjggYToweDgwYWRhMjAgbGVuOjEyOCA8 YnI+CqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4MTCgoCBsZW46OKCgIGJt YXAgc2l6ZToyoKAgZmxhZ3M6MHgwPGJyPqCgoKCgoKAgQlVGIERBVEE8YnI+QlVGOiBjbnQ6MiB0 b3RhbDoyIGE6MHg4MGI1YzI4IGxlbjoyOCBhOjB4ODBiNWQzOCBsZW46MTI4IDxicj6goKCgoKCg IEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDigoCBsZW46OKCgIGJtYXAgc2l6ZToyoKAg ZmxhZ3M6MHgwPGJyPgqgoKCgoKCgIEJVRiBEQVRBPGJyPkJVRjogY250OjIgdG90YWw6MiBhOjB4 ODBiNWNmOCBsZW46MjQgYToweDgwYjVkYzAgbGVuOjEyOCA8YnI+oKCgoKCgoCBCVUY6oCAjcmVn czoyoKAgc3RhcnQgYmxrbm86MHgwoKAgbGVuOjGgoCBibWFwIHNpemU6MaCgIGZsYWdzOjB4MDxi cj6goKCgoKCgIFNVUEVSIEJsb2NrIEJ1ZmZlcjo8YnI+PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTxicj4K VFJBTlM6IHRpZDoweDg2M2M1MDAwoCB0eXBlOlNUUkFUX1dSSVRFoCAjaXRlbXM6NaAgdHJhbnM6 MHgwoCBxOjB4ODBiNWQxODxicj5JTk86IGNudDozIHRvdGFsOjMgYToweDgwYWRiODggbGVuOjU2 IGE6MHg4MGFkYjIwIGxlbjo5NiBhOjB4ODBhZGJlOCBsZW46MTYgPGJyPqCgoKCgoKAgSU5PREU6 ICNyZWdzOjOgoCBpbm86MHg4NaAgZmxhZ3M6MHg1oKAgZHNpemU6MTY8YnI+oKCgoKCgoCBDT1JF IGlub2RlOjxicj4KoKCgoKCgoKCgoKCgoKCgIERBVEEgRk9SSyBFWFRFTlRTIGlub2RlIGRhdGE6 PGJyPkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBhZGJjOCBsZW46MjQgYToweDgwYWQ3MzAgbGVu OjEyOCA8YnI+oKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHgxoKAgbGVuOjGg oCBibWFwIHNpemU6MaCgIGZsYWdzOjB4MDxicj6goKCgoKCgIEFHRiBCdWZmZXI6IChYQUdGKTxi cj5CVUY6IGNudDoyIHRvdGFsOjIgYToweDgwYWRhZTggbGVuOjI4IGE6MHg4MGFkYTIwIGxlbjox MjggPGJyPgqgoKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDEwoKAgbGVuOjig oCBibWFwIHNpemU6MqCgIGZsYWdzOjB4MDxicj6goKCgoKCgIEJVRiBEQVRBPGJyPkJVRjogY250 OjIgdG90YWw6MiBhOjB4ODBiNWMwOCBsZW46MjggYToweDgwYjVkMzggbGVuOjEyOCA8YnI+oKCg oKCgoCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHg4oKAgbGVuOjigoCBibWFwIHNpemU6 MqCgIGZsYWdzOjB4MDxicj4KoKCgoKCgoCBCVUYgREFUQTxicj5CVUY6IGNudDoyIHRvdGFsOjIg YToweDgwYjVjNDggbGVuOjI0IGE6MHg4MGI1ZGMwIGxlbjoxMjggPGJyPqCgoKCgoKAgQlVGOqAg I3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4MKCgIGxlbjoxoKAgYm1hcCBzaXplOjGgoCBmbGFnczow eDA8YnI+oKCgoKCgoCBTVVBFUiBCbG9jayBCdWZmZXI6PGJyPj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT08 YnI+ClRSQU5TOiB0aWQ6MHg4NjNjNTAwMKAgdHlwZTpTVFJBVF9XUklURaAgI2l0ZW1zOjWgIHRy YW5zOjB4MKAgcToweDgwYjVjNjg8YnI+SU5POiBjbnQ6MyB0b3RhbDozIGE6MHg4MGFkYjg4IGxl bjo1NiBhOjB4ODBhZGIyMCBsZW46OTYgYToweDgwYjVjODggbGVuOjE2IDxicj6goKCgoKCgIElO T0RFOiAjcmVnczozoKAgaW5vOjB4ODWgIGZsYWdzOjB4NaCgIGRzaXplOjE2PGJyPqCgoKCgoKAg Q09SRSBpbm9kZTo8YnI+CqCgoKCgoKCgoKCgoKCgoCBEQVRBIEZPUksgRVhURU5UUyBpbm9kZSBk YXRhOjxicj5CVUY6IGNudDoyIHRvdGFsOjIgYToweDgwYWQ2ZjggbGVuOjI0IGE6MHg4MGFkNzMw IGxlbjoxMjggPGJyPqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4MaCgIGxl bjoxoKAgYm1hcCBzaXplOjGgoCBmbGFnczoweDA8YnI+oKCgoKCgoCBBR0YgQnVmZmVyOiAoWEFH Rik8YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGFkN2I4IGxlbjoyOCBhOjB4ODBhZGEyMCBs ZW46MTI4IDxicj4KoKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHgxMKCgIGxl bjo4oKAgYm1hcCBzaXplOjKgoCBmbGFnczoweDA8YnI+oKCgoKCgoCBCVUYgREFUQTxicj5CVUY6 IGNudDoyIHRvdGFsOjIgYToweDgwYjVjMjggbGVuOjI4IGE6MHg4MGI1ZDM4IGxlbjoxMjggPGJy PqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4OKCgIGxlbjo4oKAgYm1hcCBz aXplOjKgoCBmbGFnczoweDA8YnI+CqCgoKCgoKAgQlVGIERBVEE8YnI+QlVGOiBjbnQ6MiB0b3Rh bDoyIGE6MHg4MGI1ZDE4IGxlbjoyNCBhOjB4ODBiNWRjMCBsZW46MTI4IDxicj6goKCgoKCgIEJV RjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDCgoCBsZW46MaCgIGJtYXAgc2l6ZToxoKAgZmxh Z3M6MHgwPGJyPqCgoKCgoKAgU1VQRVIgQmxvY2sgQnVmZmVyOjxicj49PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PGJyPgpUUkFOUzogdGlkOjB4ODYzYzUwMDCgIHR5cGU6U1RSQVRfV1JJVEWgICNpdGVtczo1 oCB0cmFuczoweDCgIHE6MHg4MGI1Y2Y4PGJyPklOTzogY250OjMgdG90YWw6MyBhOjB4ODBhZGI4 OCBsZW46NTYgYToweDgwYWRiMjAgbGVuOjk2IGE6MHg4MGFkYmU4IGxlbjoxNiA8YnI+oKCgoKCg oCBJTk9ERTogI3JlZ3M6M6CgIGlubzoweDg1oCBmbGFnczoweDWgoCBkc2l6ZToxNjxicj6goKCg oKCgIENPUkUgaW5vZGU6PGJyPgqgoKCgoKCgoKCgoKCgoKAgREFUQSBGT1JLIEVYVEVOVFMgaW5v ZGUgZGF0YTo8YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGFkYmM4IGxlbjoyNCBhOjB4ODBh ZDczMCBsZW46MTI4IDxicj6goKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDGg oCBsZW46MaCgIGJtYXAgc2l6ZToxoKAgZmxhZ3M6MHgwPGJyPqCgoKCgoKAgQUdGIEJ1ZmZlcjog KFhBR0YpPGJyPkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBhZGFlOCBsZW46MjggYToweDgwYWRh MjAgbGVuOjEyOCA8YnI+CqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4MTCg oCBsZW46OKCgIGJtYXAgc2l6ZToyoKAgZmxhZ3M6MHgwPGJyPqCgoKCgoKAgQlVGIERBVEE8YnI+ QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGI1YzA4IGxlbjoyOCBhOjB4ODBiNWQzOCBsZW46MTI4 IDxicj6goKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDigoCBsZW46OKCgIGJt YXAgc2l6ZToyoKAgZmxhZ3M6MHgwPGJyPgqgoKCgoKCgIEJVRiBEQVRBPGJyPkJVRjogY250OjIg dG90YWw6MiBhOjB4ODBiNWM2OCBsZW46MjQgYToweDgwYjVkYzAgbGVuOjEyOCA8YnI+oKCgoKCg oCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHgwoKAgbGVuOjGgoCBibWFwIHNpemU6MaCg IGZsYWdzOjB4MDxicj6goKCgoKCgIFNVUEVSIEJsb2NrIEJ1ZmZlcjo8YnI+PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PTxicj4KVFJBTlM6IHRpZDoweDg2M2M1MDAwoCB0eXBlOlNUUkFUX1dSSVRFoCAjaXRl bXM6NaAgdHJhbnM6MHgwoCBxOjB4ODBiNWM0ODxicj5JTk86IGNudDozIHRvdGFsOjMgYToweDgw YWRiODggbGVuOjU2IGE6MHg4MGFkYjIwIGxlbjo5NiBhOjB4ODBiNWM4OCBsZW46MTYgPGJyPqCg oKCgoKAgSU5PREU6ICNyZWdzOjOgoCBpbm86MHg4NaAgZmxhZ3M6MHg1oKAgZHNpemU6MTY8YnI+ oKCgoKCgoCBDT1JFIGlub2RlOjxicj4KoKCgoKCgoKCgoKCgoKCgIERBVEEgRk9SSyBFWFRFTlRT IGlub2RlIGRhdGE6PGJyPkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBhZDZmOCBsZW46MjQgYTow eDgwYWQ3MzAgbGVuOjEyOCA8YnI+oKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86 MHgxoKAgbGVuOjGgoCBibWFwIHNpemU6MaCgIGZsYWdzOjB4MDxicj6goKCgoKCgIEFHRiBCdWZm ZXI6IChYQUdGKTxicj5CVUY6IGNudDoyIHRvdGFsOjIgYToweDgwYWQ3YjggbGVuOjI4IGE6MHg4 MGFkYTIwIGxlbjoxMjggPGJyPgqgoKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtubzow eDEwoKAgbGVuOjigoCBibWFwIHNpemU6MqCgIGZsYWdzOjB4MDxicj6goKCgoKCgIEJVRiBEQVRB PGJyPkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBiNWMyOCBsZW46MjggYToweDgwYjVkMzggbGVu OjEyOCA8YnI+oKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHg4oKAgbGVuOjig oCBibWFwIHNpemU6MqCgIGZsYWdzOjB4MDxicj4KoKCgoKCgoCBCVUYgREFUQTxicj5CVUY6IGNu dDoyIHRvdGFsOjIgYToweDgwYjVjZjggbGVuOjI0IGE6MHg4MGI1ZGMwIGxlbjoxMjggPGJyPqCg oKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4MKCgIGxlbjoxoKAgYm1hcCBzaXpl OjGgoCBmbGFnczoweDA8YnI+oKCgoKCgoCBTVVBFUiBCbG9jayBCdWZmZXI6PGJyPj09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT08YnI+ClRSQU5TOiB0aWQ6MHg4NjNjNTAwMKAgdHlwZTpTVFJBVF9XUklURaAg I2l0ZW1zOjWgIHRyYW5zOjB4MKAgcToweDgwYjVkMTg8YnI+SU5POiBjbnQ6MyB0b3RhbDozIGE6 MHg4MGFkYjg4IGxlbjo1NiBhOjB4ODBhZGIyMCBsZW46OTYgYToweDgwYWRiZTggbGVuOjE2IDxi cj6goKCgoKCgIElOT0RFOiAjcmVnczozoKAgaW5vOjB4ODWgIGZsYWdzOjB4NaCgIGRzaXplOjE2 PGJyPqCgoKCgoKAgQ09SRSBpbm9kZTo8YnI+CqCgoKCgoKCgoKCgoKCgoCBEQVRBIEZPUksgRVhU RU5UUyBpbm9kZSBkYXRhOjxicj5CVUY6IGNudDoyIHRvdGFsOjIgYToweDgwYWRiYzggbGVuOjI0 IGE6MHg4MGFkNzMwIGxlbjoxMjggPGJyPqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJs a25vOjB4MaCgIGxlbjoxoKAgYm1hcCBzaXplOjGgoCBmbGFnczoweDA8YnI+oKCgoKCgoCBBR0Yg QnVmZmVyOiAoWEFHRik8YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGFkYWU4IGxlbjoyOCBh OjB4ODBhZGEyMCBsZW46MTI4IDxicj4KoKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxr bm86MHgxMKCgIGxlbjo4oKAgYm1hcCBzaXplOjKgoCBmbGFnczoweDA8YnI+oKCgoKCgoCBCVUYg REFUQTxicj5CVUY6IGNudDoyIHRvdGFsOjIgYToweDgwYjVjMDggbGVuOjI4IGE6MHg4MGI1ZDM4 IGxlbjoxMjggPGJyPqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4OKCgIGxl bjo4oKAgYm1hcCBzaXplOjKgoCBmbGFnczoweDA8YnI+CqCgoKCgoKAgQlVGIERBVEE8YnI+QlVG OiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGI1YzQ4IGxlbjoyNCBhOjB4ODBiNWRjMCBsZW46MTI4IDxi cj6goKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDCgoCBsZW46MaCgIGJtYXAg c2l6ZToxoKAgZmxhZ3M6MHgwPGJyPqCgoKCgoKAgU1VQRVIgQmxvY2sgQnVmZmVyOjxicj49PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PGJyPgpUUkFOUzogdGlkOjB4ODYzYzUwMDCgIHR5cGU6U1RSQVRfV1JJ VEWgICNpdGVtczo1oCB0cmFuczoweDCgIHE6MHg4MGI1YzY4PGJyPklOTzogY250OjMgdG90YWw6 MyBhOjB4ODBhZGI4OCBsZW46NTYgYToweDgwYWRiMjAgbGVuOjk2IGE6MHg4MGI1Yzg4IGxlbjox NiA8YnI+oKCgoKCgoCBJTk9ERTogI3JlZ3M6M6CgIGlubzoweDg1oCBmbGFnczoweDWgoCBkc2l6 ZToxNjxicj6goKCgoKCgIENPUkUgaW5vZGU6PGJyPgqgoKCgoKCgoKCgoKCgoKAgREFUQSBGT1JL IEVYVEVOVFMgaW5vZGUgZGF0YTo8YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGFkNmY4IGxl bjoyNCBhOjB4ODBhZDczMCBsZW46MTI4IDxicj6goKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFy dCBibGtubzoweDGgoCBsZW46MaCgIGJtYXAgc2l6ZToxoKAgZmxhZ3M6MHgwPGJyPqCgoKCgoKAg QUdGIEJ1ZmZlcjogKFhBR0YpPGJyPkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBhZDdiOCBsZW46 MjggYToweDgwYWRhMjAgbGVuOjEyOCA8YnI+CqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0 IGJsa25vOjB4MTCgoCBsZW46OKCgIGJtYXAgc2l6ZToyoKAgZmxhZ3M6MHgwPGJyPqCgoKCgoKAg QlVGIERBVEE8YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGI1YzI4IGxlbjoyOCBhOjB4ODBi NWQzOCBsZW46MTI4IDxicj6goKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDig oCBsZW46OKCgIGJtYXAgc2l6ZToyoKAgZmxhZ3M6MHgwPGJyPgqgoKCgoKCgIEJVRiBEQVRBPGJy PkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBiNWQxOCBsZW46MjQgYToweDgwYjVkYzAgbGVuOjEy OCA8YnI+oKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHgwoKAgbGVuOjGgoCBi bWFwIHNpemU6MaCgIGZsYWdzOjB4MDxicj6goKCgoKCgIFNVUEVSIEJsb2NrIEJ1ZmZlcjo8YnI+ PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PTxicj4KVFJBTlM6IHRpZDoweDg2M2M1MDAwoCB0eXBlOlNUUkFU X1dSSVRFoCAjaXRlbXM6NaAgdHJhbnM6MHgwoCBxOjB4ODBiNWNmODxicj5JTk86IGNudDozIHRv dGFsOjMgYToweDgwYWRiODggbGVuOjU2IGE6MHg4MGFkYjIwIGxlbjo5NiBhOjB4ODBhZGJlOCBs ZW46MTYgPGJyPqCgoKCgoKAgSU5PREU6ICNyZWdzOjOgoCBpbm86MHg4NaAgZmxhZ3M6MHg1oKAg ZHNpemU6MTY8YnI+oKCgoKCgoCBDT1JFIGlub2RlOjxicj4KoKCgoKCgoKCgoKCgoKCgIERBVEEg Rk9SSyBFWFRFTlRTIGlub2RlIGRhdGE6PGJyPkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBhZGJj OCBsZW46MjQgYToweDgwYWQ3MzAgbGVuOjEyOCA8YnI+oKCgoKCgoCBCVUY6oCAjcmVnczoyoKAg c3RhcnQgYmxrbm86MHgxoKAgbGVuOjGgoCBibWFwIHNpemU6MaCgIGZsYWdzOjB4MDxicj6goKCg oKCgIEFHRiBCdWZmZXI6IChYQUdGKTxicj5CVUY6IGNudDoyIHRvdGFsOjIgYToweDgwYWRhZTgg bGVuOjI4IGE6MHg4MGFkYTIwIGxlbjoxMjggPGJyPgqgoKCgoKCgIEJVRjqgICNyZWdzOjKgoCBz dGFydCBibGtubzoweDEwoKAgbGVuOjigoCBibWFwIHNpemU6MqCgIGZsYWdzOjB4MDxicj6goKCg oKCgIEJVRiBEQVRBPGJyPkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBiNWMwOCBsZW46MjggYTow eDgwYjVkMzggbGVuOjEyOCA8YnI+oKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86 MHg4oKAgbGVuOjigoCBibWFwIHNpemU6MqCgIGZsYWdzOjB4MDxicj4KoKCgoKCgoCBCVUYgREFU QTxicj5CVUY6IGNudDoyIHRvdGFsOjIgYToweDgwYjVjNjggbGVuOjI0IGE6MHg4MGI1ZGMwIGxl bjoxMjggPGJyPqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4MKCgIGxlbjox oKAgYm1hcCBzaXplOjGgoCBmbGFnczoweDA8YnI+oKCgoKCgoCBTVVBFUiBCbG9jayBCdWZmZXI6 PGJyPj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT08YnI+ClRSQU5TOiB0aWQ6MHg4NjNjNTAwMKAgdHlwZTpT VFJBVF9XUklURaAgI2l0ZW1zOjWgIHRyYW5zOjB4MKAgcToweDgwYjVjNDg8YnI+SU5POiBjbnQ6 MyB0b3RhbDozIGE6MHg4MGFkYjg4IGxlbjo1NiBhOjB4ODBhZGIyMCBsZW46OTYgYToweDgwYjVj ODggbGVuOjE2IDxicj6goKCgoKCgIElOT0RFOiAjcmVnczozoKAgaW5vOjB4ODWgIGZsYWdzOjB4 NaCgIGRzaXplOjE2PGJyPqCgoKCgoKAgQ09SRSBpbm9kZTo8YnI+CqCgoKCgoKCgoKCgoKCgoCBE QVRBIEZPUksgRVhURU5UUyBpbm9kZSBkYXRhOjxicj5CVUY6IGNudDoyIHRvdGFsOjIgYToweDgw YWQ2ZjggbGVuOjI0IGE6MHg4MGFkNzMwIGxlbjoxMjggPGJyPqCgoKCgoKAgQlVGOqAgI3JlZ3M6 MqCgIHN0YXJ0IGJsa25vOjB4MaCgIGxlbjoxoKAgYm1hcCBzaXplOjGgoCBmbGFnczoweDA8YnI+ oKCgoKCgoCBBR0YgQnVmZmVyOiAoWEFHRik8YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGFk N2I4IGxlbjoyOCBhOjB4ODBhZGEyMCBsZW46MTI4IDxicj4KoKCgoKCgoCBCVUY6oCAjcmVnczoy oKAgc3RhcnQgYmxrbm86MHgxMKCgIGxlbjo4oKAgYm1hcCBzaXplOjKgoCBmbGFnczoweDA8YnI+ oKCgoKCgoCBCVUYgREFUQTxicj5CVUY6IGNudDoyIHRvdGFsOjIgYToweDgwYjVjMjggbGVuOjI4 IGE6MHg4MGI1ZDM4IGxlbjoxMjggPGJyPqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJs a25vOjB4OKCgIGxlbjo4oKAgYm1hcCBzaXplOjKgoCBmbGFnczoweDA8YnI+CqCgoKCgoKAgQlVG IERBVEE8YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGI1Y2Y4IGxlbjoyNCBhOjB4ODBiNWRj MCBsZW46MTI4IDxicj6goKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDCgoCBs ZW46MaCgIGJtYXAgc2l6ZToxoKAgZmxhZ3M6MHgwPGJyPqCgoKCgoKAgU1VQRVIgQmxvY2sgQnVm ZmVyOjxicj49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PGJyPgpUUkFOUzogdGlkOjB4ODYzYzUwMDCgIHR5 cGU6U1RSQVRfV1JJVEWgICNpdGVtczo1oCB0cmFuczoweDCgIHE6MHg4MGI1ZDE4PGJyPklOTzog Y250OjMgdG90YWw6MyBhOjB4ODBhZGI4OCBsZW46NTYgYToweDgwYWRiMjAgbGVuOjk2IGE6MHg4 MGFkYmU4IGxlbjoxNiA8YnI+oKCgoKCgoCBJTk9ERTogI3JlZ3M6M6CgIGlubzoweDg1oCBmbGFn czoweDWgoCBkc2l6ZToxNjxicj6goKCgoKCgIENPUkUgaW5vZGU6PGJyPgqgoKCgoKCgoKCgoKCg oKAgREFUQSBGT1JLIEVYVEVOVFMgaW5vZGUgZGF0YTo8YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6 MHg4MGFkYmM4IGxlbjoyNCBhOjB4ODBhZDczMCBsZW46MTI4IDxicj6goKCgoKCgIEJVRjqgICNy ZWdzOjKgoCBzdGFydCBibGtubzoweDGgoCBsZW46MaCgIGJtYXAgc2l6ZToxoKAgZmxhZ3M6MHgw PGJyPqCgoKCgoKAgQUdGIEJ1ZmZlcjogKFhBR0YpPGJyPkJVRjogY250OjIgdG90YWw6MiBhOjB4 ODBhZGFlOCBsZW46MjggYToweDgwYWRhMjAgbGVuOjEyOCA8YnI+CqCgoKCgoKAgQlVGOqAgI3Jl Z3M6MqCgIHN0YXJ0IGJsa25vOjB4MTCgoCBsZW46OKCgIGJtYXAgc2l6ZToyoKAgZmxhZ3M6MHgw PGJyPqCgoKCgoKAgQlVGIERBVEE8YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGI1YzA4IGxl bjoyOCBhOjB4ODBiNWQzOCBsZW46MTI4IDxicj6goKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFy dCBibGtubzoweDigoCBsZW46OKCgIGJtYXAgc2l6ZToyoKAgZmxhZ3M6MHgwPGJyPgqgoKCgoKCg IEJVRiBEQVRBPGJyPkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBiNWM0OCBsZW46MjQgYToweDgw YjVkYzAgbGVuOjEyOCA8YnI+oKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHgw oKAgbGVuOjGgoCBibWFwIHNpemU6MaCgIGZsYWdzOjB4MDxicj6goKCgoKCgIFNVUEVSIEJsb2Nr IEJ1ZmZlcjo8YnI+PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTxicj4KVFJBTlM6IHRpZDoweDg2M2M1MDAw oCB0eXBlOlNUUkFUX1dSSVRFoCAjaXRlbXM6NaAgdHJhbnM6MHgwoCBxOjB4ODBiNWM2ODxicj5J Tk86IGNudDozIHRvdGFsOjMgYToweDgwYWRiODggbGVuOjU2IGE6MHg4MGFkYjIwIGxlbjo5NiBh OjB4ODBiNWM4OCBsZW46MTYgPGJyPqCgoKCgoKAgSU5PREU6ICNyZWdzOjOgoCBpbm86MHg4NaAg ZmxhZ3M6MHg1oKAgZHNpemU6MTY8YnI+oKCgoKCgoCBDT1JFIGlub2RlOjxicj4KoKCgoKCgoKCg oKCgoKCgIERBVEEgRk9SSyBFWFRFTlRTIGlub2RlIGRhdGE6PGJyPkJVRjogY250OjIgdG90YWw6 MiBhOjB4ODBhZDZmOCBsZW46MjQgYToweDgwYWQ3MzAgbGVuOjEyOCA8YnI+oKCgoKCgoCBCVUY6 oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHgxoKAgbGVuOjGgoCBibWFwIHNpemU6MaCgIGZsYWdz OjB4MDxicj6goKCgoKCgIEFHRiBCdWZmZXI6IChYQUdGKTxicj5CVUY6IGNudDoyIHRvdGFsOjIg YToweDgwYWQ3YjggbGVuOjI4IGE6MHg4MGFkYTIwIGxlbjoxMjggPGJyPgqgoKCgoKCgIEJVRjqg ICNyZWdzOjKgoCBzdGFydCBibGtubzoweDEwoKAgbGVuOjigoCBibWFwIHNpemU6MqCgIGZsYWdz OjB4MDxicj6goKCgoKCgIEJVRiBEQVRBPGJyPkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBiNWMy OCBsZW46MjggYToweDgwYjVkMzggbGVuOjEyOCA8YnI+oKCgoKCgoCBCVUY6oCAjcmVnczoyoKAg c3RhcnQgYmxrbm86MHg4oKAgbGVuOjigoCBibWFwIHNpemU6MqCgIGZsYWdzOjB4MDxicj4KoKCg oKCgoCBCVUYgREFUQTxicj5CVUY6IGNudDoyIHRvdGFsOjIgYToweDgwYjVkMTggbGVuOjI0IGE6 MHg4MGI1ZGMwIGxlbjoxMjggPGJyPqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25v OjB4MKCgIGxlbjoxoKAgYm1hcCBzaXplOjGgoCBmbGFnczoweDA8YnI+oKCgoKCgoCBTVVBFUiBC bG9jayBCdWZmZXI6PGJyPj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT08YnI+ClRSQU5TOiB0aWQ6MHg4NjNj NTAwMKAgdHlwZTpTVFJBVF9XUklURaAgI2l0ZW1zOjWgIHRyYW5zOjB4MKAgcToweDgwYjVjZjg8 YnI+SU5POiBjbnQ6MyB0b3RhbDozIGE6MHg4MGFkYjg4IGxlbjo1NiBhOjB4ODBhZGIyMCBsZW46 OTYgYToweDgwYWRiZTggbGVuOjE2IDxicj6goKCgoKCgIElOT0RFOiAjcmVnczozoKAgaW5vOjB4 ODWgIGZsYWdzOjB4NaCgIGRzaXplOjE2PGJyPqCgoKCgoKAgQ09SRSBpbm9kZTo8YnI+CqCgoKCg oKCgoKCgoKCgoCBEQVRBIEZPUksgRVhURU5UUyBpbm9kZSBkYXRhOjxicj5CVUY6IGNudDoyIHRv dGFsOjIgYToweDgwYWRiYzggbGVuOjI0IGE6MHg4MGFkNzMwIGxlbjoxMjggPGJyPqCgoKCgoKAg QlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4MaCgIGxlbjoxoKAgYm1hcCBzaXplOjGgoCBm bGFnczoweDA8YnI+oKCgoKCgoCBBR0YgQnVmZmVyOiAoWEFHRik8YnI+QlVGOiBjbnQ6MiB0b3Rh bDoyIGE6MHg4MGFkYWU4IGxlbjoyOCBhOjB4ODBhZGEyMCBsZW46MTI4IDxicj4KoKCgoKCgoCBC VUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHgxMKCgIGxlbjo4oKAgYm1hcCBzaXplOjKgoCBm bGFnczoweDA8YnI+oKCgoKCgoCBCVUYgREFUQTxicj5CVUY6IGNudDoyIHRvdGFsOjIgYToweDgw YjVjMDggbGVuOjI4IGE6MHg4MGI1ZDM4IGxlbjoxMjggPGJyPqCgoKCgoKAgQlVGOqAgI3JlZ3M6 MqCgIHN0YXJ0IGJsa25vOjB4OKCgIGxlbjo4oKAgYm1hcCBzaXplOjKgoCBmbGFnczoweDA8YnI+ CqCgoKCgoKAgQlVGIERBVEE8YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGI1YzY4IGxlbjoy NCBhOjB4ODBiNWRjMCBsZW46MTI4IDxicj6goKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBi bGtubzoweDCgoCBsZW46MaCgIGJtYXAgc2l6ZToxoKAgZmxhZ3M6MHgwPGJyPqCgoKCgoKAgU1VQ RVIgQmxvY2sgQnVmZmVyOjxicj49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PGJyPgpUUkFOUzogdGlkOjB4 ODYzYzUwMDCgIHR5cGU6U1RSQVRfV1JJVEWgICNpdGVtczo1oCB0cmFuczoweDCgIHE6MHg4MGI1 YzQ4PGJyPklOTzogY250OjMgdG90YWw6MyBhOjB4ODBhZGI4OCBsZW46NTYgYToweDgwYWRiMjAg bGVuOjk2IGE6MHg4MGI1Yzg4IGxlbjoxNiA8YnI+oKCgoKCgoCBJTk9ERTogI3JlZ3M6M6CgIGlu bzoweDg1oCBmbGFnczoweDWgoCBkc2l6ZToxNjxicj6goKCgoKCgIENPUkUgaW5vZGU6PGJyPgqg oKCgoKCgoKCgoKCgoKAgREFUQSBGT1JLIEVYVEVOVFMgaW5vZGUgZGF0YTo8YnI+QlVGOiBjbnQ6 MiB0b3RhbDoyIGE6MHg4MGFkNmY4IGxlbjoyNCBhOjB4ODBhZDczMCBsZW46MTI4IDxicj6goKCg oKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDGgoCBsZW46MaCgIGJtYXAgc2l6ZTox oKAgZmxhZ3M6MHgwPGJyPqCgoKCgoKAgQUdGIEJ1ZmZlcjogKFhBR0YpPGJyPkJVRjogY250OjIg dG90YWw6MiBhOjB4ODBhZDdiOCBsZW46MjggYToweDgwYWRhMjAgbGVuOjEyOCA8YnI+CqCgoKCg oKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4MTCgoCBsZW46OKCgIGJtYXAgc2l6ZToy oKAgZmxhZ3M6MHgwPGJyPqCgoKCgoKAgQlVGIERBVEE8YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6 MHg4MGI1YzI4IGxlbjoyOCBhOjB4ODBiNWQzOCBsZW46MTI4IDxicj6goKCgoKCgIEJVRjqgICNy ZWdzOjKgoCBzdGFydCBibGtubzoweDigoCBsZW46OKCgIGJtYXAgc2l6ZToyoKAgZmxhZ3M6MHgw PGJyPgqgoKCgoKCgIEJVRiBEQVRBPGJyPkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBiNWNmOCBs ZW46MjQgYToweDgwYjVkYzAgbGVuOjEyOCA8YnI+oKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3Rh cnQgYmxrbm86MHgwoKAgbGVuOjGgoCBibWFwIHNpemU6MaCgIGZsYWdzOjB4MDxicj6goKCgoKCg IFNVUEVSIEJsb2NrIEJ1ZmZlcjo8YnI+PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTxicj4KVFJBTlM6IHRp ZDoweDg2M2M1MDAwoCB0eXBlOlNUUkFUX1dSSVRFoCAjaXRlbXM6NaAgdHJhbnM6MHgwoCBxOjB4 ODBiNWQxODxicj5JTk86IGNudDozIHRvdGFsOjMgYToweDgwYWRiODggbGVuOjU2IGE6MHg4MGFk YjIwIGxlbjo5NiBhOjB4ODBhZGJlOCBsZW46MTYgPGJyPqCgoKCgoKAgSU5PREU6ICNyZWdzOjOg oCBpbm86MHg4NaAgZmxhZ3M6MHg1oKAgZHNpemU6MTY8YnI+oKCgoKCgoCBDT1JFIGlub2RlOjxi cj4KoKCgoKCgoKCgoKCgoKCgIERBVEEgRk9SSyBFWFRFTlRTIGlub2RlIGRhdGE6PGJyPkJVRjog Y250OjIgdG90YWw6MiBhOjB4ODBhZGJjOCBsZW46MjQgYToweDgwYWQ3MzAgbGVuOjEyOCA8YnI+ oKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHgxoKAgbGVuOjGgoCBibWFwIHNp emU6MaCgIGZsYWdzOjB4MDxicj6goKCgoKCgIEFHRiBCdWZmZXI6IChYQUdGKTxicj5CVUY6IGNu dDoyIHRvdGFsOjIgYToweDgwYWRhZTggbGVuOjI4IGE6MHg4MGFkYTIwIGxlbjoxMjggPGJyPgqg oKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDEwoKAgbGVuOjigoCBibWFwIHNp emU6MqCgIGZsYWdzOjB4MDxicj6goKCgoKCgIEJVRiBEQVRBPGJyPkJVRjogY250OjIgdG90YWw6 MiBhOjB4ODBiNWMwOCBsZW46MjggYToweDgwYjVkMzggbGVuOjEyOCA8YnI+oKCgoKCgoCBCVUY6 oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHg4oKAgbGVuOjigoCBibWFwIHNpemU6MqCgIGZsYWdz OjB4MDxicj4KoKCgoKCgoCBCVUYgREFUQTxicj5CVUY6IGNudDoyIHRvdGFsOjIgYToweDgwYjVj NDggbGVuOjI0IGE6MHg4MGI1ZGMwIGxlbjoxMjggPGJyPqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCg IHN0YXJ0IGJsa25vOjB4MKCgIGxlbjoxoKAgYm1hcCBzaXplOjGgoCBmbGFnczoweDA8YnI+oKCg oKCgoCBTVVBFUiBCbG9jayBCdWZmZXI6PGJyPj09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT08YnI+ClRSQU5T OiB0aWQ6MHg4NjNjNTAwMKAgdHlwZTpTVFJBVF9XUklURaAgI2l0ZW1zOjWgIHRyYW5zOjB4MKAg cToweDgwYjVjNjg8YnI+SU5POiBjbnQ6MyB0b3RhbDozIGE6MHg4MGFkYjg4IGxlbjo1NiBhOjB4 ODBhZGIyMCBsZW46OTYgYToweDgwYjVjODggbGVuOjE2IDxicj6goKCgoKCgIElOT0RFOiAjcmVn czozoKAgaW5vOjB4ODWgIGZsYWdzOjB4NaCgIGRzaXplOjE2PGJyPqCgoKCgoKAgQ09SRSBpbm9k ZTo8YnI+CqCgoKCgoKCgoKCgoKCgoCBEQVRBIEZPUksgRVhURU5UUyBpbm9kZSBkYXRhOjxicj5C VUY6IGNudDoyIHRvdGFsOjIgYToweDgwYWQ2ZjggbGVuOjI0IGE6MHg4MGFkNzMwIGxlbjoxMjgg PGJyPqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4MaCgIGxlbjoxoKAgYm1h cCBzaXplOjGgoCBmbGFnczoweDA8YnI+oKCgoKCgoCBBR0YgQnVmZmVyOiAoWEFHRik8YnI+QlVG OiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGFkN2I4IGxlbjoyOCBhOjB4ODBhZGEyMCBsZW46MTI4IDxi cj4KoKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHgxMKCgIGxlbjo4oKAgYm1h cCBzaXplOjKgoCBmbGFnczoweDA8YnI+oKCgoKCgoCBCVUYgREFUQTxicj5CVUY6IGNudDoyIHRv dGFsOjIgYToweDgwYjVjMjggbGVuOjI4IGE6MHg4MGI1ZDM4IGxlbjoxMjggPGJyPqCgoKCgoKAg QlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4OKCgIGxlbjo4oKAgYm1hcCBzaXplOjKgoCBm bGFnczoweDA8YnI+CqCgoKCgoKAgQlVGIERBVEE8YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4 MGI1ZDE4IGxlbjoyNCBhOjB4ODBiNWRjMCBsZW46MTI4IDxicj6goKCgoKCgIEJVRjqgICNyZWdz OjKgoCBzdGFydCBibGtubzoweDCgoCBsZW46MaCgIGJtYXAgc2l6ZToxoKAgZmxhZ3M6MHgwPGJy PqCgoKCgoKAgU1VQRVIgQmxvY2sgQnVmZmVyOjxicj49PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PGJyPgpU UkFOUzogdGlkOjB4ODYzYzUwMDCgIHR5cGU6U1RSQVRfV1JJVEWgICNpdGVtczo1oCB0cmFuczow eDCgIHE6MHg4MGI1Y2Y4PGJyPklOTzogY250OjMgdG90YWw6MyBhOjB4ODBhZGI4OCBsZW46NTYg YToweDgwYWRiMjAgbGVuOjk2IGE6MHg4MGFkYmU4IGxlbjoxNiA8YnI+oKCgoKCgoCBJTk9ERTog I3JlZ3M6M6CgIGlubzoweDg1oCBmbGFnczoweDWgoCBkc2l6ZToxNjxicj6goKCgoKCgIENPUkUg aW5vZGU6PGJyPgqgoKCgoKCgoKCgoKCgoKAgREFUQSBGT1JLIEVYVEVOVFMgaW5vZGUgZGF0YTo8 YnI+QlVGOiBjbnQ6MiB0b3RhbDoyIGE6MHg4MGFkYmM4IGxlbjoyNCBhOjB4ODBhZDczMCBsZW46 MTI4IDxicj6goKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDGgoCBsZW46MaCg IGJtYXAgc2l6ZToxoKAgZmxhZ3M6MHgwPGJyPqCgoKCgoKAgQUdGIEJ1ZmZlcjogKFhBR0YpPGJy PkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBhZGFlOCBsZW46MjggYToweDgwYWRhMjAgbGVuOjEy OCA8YnI+CqCgoKCgoKAgQlVGOqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4MTCgoCBsZW46OKCg IGJtYXAgc2l6ZToyoKAgZmxhZ3M6MHgwPGJyPqCgoKCgoKAgQlVGIERBVEE8YnI+QlVGOiBjbnQ6 MiB0b3RhbDoyIGE6MHg4MGI1YzA4IGxlbjoyOCBhOjB4ODBiNWQzOCBsZW46MTI4IDxicj6goKCg oKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDigoCBsZW46OKCgIGJtYXAgc2l6ZToy oKAgZmxhZ3M6MHgwPGJyPgqgoKCgoKCgIEJVRiBEQVRBPGJyPkJVRjogY250OjIgdG90YWw6MiBh OjB4ODBiNWM2OCBsZW46MjQgYToweDgwYjVkYzAgbGVuOjEyOCA8YnI+oKCgoKCgoCBCVUY6oCAj cmVnczoyoKAgc3RhcnQgYmxrbm86MHgwoKAgbGVuOjGgoCBibWFwIHNpemU6MaCgIGZsYWdzOjB4 MDxicj6goKCgoKCgIFNVUEVSIEJsb2NrIEJ1ZmZlcjo8YnI+PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTxi cj4KVFJBTlM6IHRpZDoweDg2M2M1MDAwoCB0eXBlOlNUUkFUX1dSSVRFoCAjaXRlbXM6NaAgdHJh bnM6MHgwoCBxOjB4ODBiNWM0ODxicj5JTk86IGNudDozIHRvdGFsOjMgYToweDgwYWRiODggbGVu OjU2IGE6MHg4MGFkYjIwIGxlbjo5NiBhOjB4ODBiNWM4OCBsZW46MTYgPGJyPqCgoKCgoKAgSU5P REU6ICNyZWdzOjOgoCBpbm86MHg4NaAgZmxhZ3M6MHg1oKAgZHNpemU6MTY8YnI+oKCgoKCgoCBD T1JFIGlub2RlOjxicj4KoKCgoKCgoKCgoKCgoKCgIERBVEEgRk9SSyBFWFRFTlRTIGlub2RlIGRh dGE6PGJyPkJVRjogY250OjIgdG90YWw6MiBhOjB4ODBhZDZmOCBsZW46MjQgYToweDgwYWQ3MzAg bGVuOjEyOCA8YnI+oKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHgxoKAgbGVu OjGgoCBibWFwIHNpemU6MaCgIGZsYWdzOjB4MDxicj6goKCgoKCgIEFHRiBCdWZmZXI6IChYQUdG KTxicj5CVUY6IGNudDoyIHRvdGFsOjIgYToweDgwYWQ3YjggbGVuOjI4IGE6MHg4MGFkYTIwIGxl bjoxMjggPGJyPgqgoKCgoKCgIEJVRjqgICNyZWdzOjKgoCBzdGFydCBibGtubzoweDEwoKAgbGVu OjigoCBibWFwIHNpemU6MqCgIGZsYWdzOjB4MDxicj6goKCgoKCgIEJVRiBEQVRBPGJyPkJVRjog Y250OjIgdG90YWw6MiBhOjB4ODBiNWMyOCBsZW46MjggYToweDgwYjVkMzggbGVuOjEyOCA8YnI+ oKCgoKCgoCBCVUY6oCAjcmVnczoyoKAgc3RhcnQgYmxrbm86MHg4oKAgbGVuOjigoCBibWFwIHNp emU6MqCgIGZsYWdzOjB4MDxicj4KoKCgoKCgoCBCVUYgREFUQTxicj5CVUY6IGNudDoyIHRvdGFs OjIgYToweDgwYjVjZjggbGVuOjI0IGE6MHg4MGI1ZGMwIGxlbjoxMjggPGJyPqCgoKCgoKAgQlVG OqAgI3JlZ3M6MqCgIHN0YXJ0IGJsa25vOjB4MKCgIGxlbjoxoKAgYm1hcCBzaXplOjGgoCBmbGFn czoweDA8YnI+oKCgoKCgoCBTVVBFUiBCbG9jayBCdWZmZXI6PGJyPqA8YnI+TE9HIFJFQyBBVCBM U04gY3ljbGUgMSBibG9jayAzNDggKDB4MSwgMHgxNWMpPGJyPgpYRlM6IHhsb2dfcmVjb3Zlcl9w cm9jZXNzX2RhdGE6IGJhZCB0cmFuc2FjdGlvbjxicj54ZnNfbG9ncHJpbnQ6IGZhaWxlZCBpbiB4 ZnNfZG9fcmVjb3ZlcnlfcGFzcywgZXJyb3I6IDU8YnI+PC9kaXY+Cg== --0015175cb71a246c770496541099-- From eflorac@intellique.com Wed Dec 1 01:40:52 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB17eqs0185491 for ; Wed, 1 Dec 2010 01:40:52 -0600 X-ASG-Debug-ID: 1291189352-7bc302ac0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6E5BB1C85510 for ; Tue, 30 Nov 2010 23:42:33 -0800 (PST) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id 1aYLDzNT5Ll8140k for ; Tue, 30 Nov 2010 23:42:33 -0800 (PST) Received: from galadriel.home (unknown [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP id 72181A6257; Wed, 1 Dec 2010 08:42:28 +0100 (CET) Date: Wed, 1 Dec 2010 08:42:25 +0100 From: Emmanuel Florac To: naveen yadav Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: issue with unmount of XFS partation Subject: Re: issue with unmount of XFS partation Message-ID: <20101201084225.7e47a2ff@galadriel.home> In-Reply-To: References: Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.20.1; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1291189355 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48145 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Wed, 1 Dec 2010 10:13:57 +0530 vous =E9criviez: > FAT got unmounted every time, but XFS does not, >=20 > /dev/sda2 on /dtv/usb/sda2 type xfs (rw,relatime,nouuid,attr2,noquota) > /dev/sdb2 on /dtv/usb/sdb2 type xfs (rw,relatime,nouuid,attr2,noquota) >=20 > If I do sync on Shell I got below error. I don't get it, do you unmount the FS before unplugging USB? It looks like you simply pulled the cable. FAT is an extremely primitive filesystem that remains coherent when there isn't any data in cache or disk activity; xfs (and all other modern filesystems) simply doesn't work that way. You must "umount" it before unplugging, else you'll break it. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From MAILER-DAEMON@oss.sgi.com Wed Dec 1 05:47:56 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=BAYES_20,MISSING_MIME_HB_SEP, T_MIME_NO_TEXT,T_TVD_MIME_NO_HEADERS autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1Blubd204291 for ; Wed, 1 Dec 2010 05:47:56 -0600 X-ASG-Debug-ID: 1291204179-457e01330000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail7.fastdnsnetwork.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 784071B9DA6 for ; Wed, 1 Dec 2010 03:49:39 -0800 (PST) Received: from mail7.fastdnsnetwork.com (mail7.fastdnsnetwork.com [174.133.162.186]) by cuda.sgi.com with ESMTP id bKiaCfBu3sXMLbfj for ; Wed, 01 Dec 2010 03:49:39 -0800 (PST) Received: (qmail 21039 invoked for bounce); 1 Dec 2010 11:48:15 -0000 Date: 1 Dec 2010 11:48:15 -0000 From: MAILER-DAEMON@mail7.fastdnsnetwork.com To: xfs@oss.sgi.com MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="1291204095mail7.fastdnsnetwork.com33097008" X-ASG-Orig-Subj: failure notice Subject: failure notice X-Barracuda-Connect: mail7.fastdnsnetwork.com[174.133.162.186] X-Barracuda-Start-Time: 1291204179 Message-Id: <20101201114939.784071B9DA6@cuda.sgi.com> X-Barracuda-Bayes: INNOCENT GLOBAL 0.1645 1.0000 -1.0202 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.68 X-Barracuda-Spam-Status: No, SCORE=-0.68 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=ANY_BOUNCE_MESSAGE, BOUNCE_MESSAGE, BSF_SC0_MISSING_MID, BSF_SC0_SA590, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48160 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.14 BSF_SC0_MISSING_MID BODY: Custom Rule BSF_SC0_MISSING_MID 0.20 BSF_SC0_SA590 Custom Rule SA590 0.00 BOUNCE_MESSAGE MTA bounce message 0.00 ANY_BOUNCE_MESSAGE Message is some kind of bounce message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --1291204095mail7.fastdnsnetwork.com33097008 Hi. This is the qmail-send program at mail7.fastdnsnetwork.com. I'm afraid I wasn't able to deliver your message to the following addresses. This is a permanent error; I've given up. Sorry it didn't work out. : mail is looping --- Enclosed are the original headers of the message. --1291204095mail7.fastdnsnetwork.com33097008 Content-Type: message/rfc822 Return-Path: Received: (qmail 20900 invoked by uid 399); 1 Dec 2010 11:48:09 -0000 Delivered-To: bennorayan@goodleather.net Received: (qmail 20786 invoked by uid 399); 1 Dec 2010 11:48:04 -0000 Message-ID: <20101201114804.20785.qmail@mail7.fastdnsnetwork.com> Delivered-To: goodledr@goodleather.net Received: (qmail 20708 invoked by uid 399); 1 Dec 2010 11:47:59 -0000 Received: from unknown (HELO oss.sgi.com) (122.166.114.232) by mail7.fastdnsnetwork.com with ESMTP; 1 Dec 2010 11:47:59 -0000 X-Originating-IP: 122.166.114.232 Received-SPF: none (mail7.fastdnsnetwork.com: domain at oss.sgi.com does not designate permitted sender hosts) identity=mailfrom; client-ip=122.166.114.232; envelope-from=; From: xfs@oss.sgi.com To: goodledr@goodleather.net Subject: MESSAGE COULD NOT BE DELIVERED Date: Wed, 1 Dec 2010 17:18:21 +0530 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0008_074DE884.2DD529BA" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2600.0000 X-MIMEOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 (Body supressed) ------=_NextPart_000_0008_074DE884.2DD529BA-- --1291204095mail7.fastdnsnetwork.com33097008-- From BATV+3217d6c06e4d83826047+2656+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 1 06:28:53 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1CSpQm206746 for ; Wed, 1 Dec 2010 06:28:53 -0600 X-ASG-Debug-ID: 1291206634-4f7d01390000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B34621BA206 for ; Wed, 1 Dec 2010 04:30:34 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id l8bysXQsBmqld5ap for ; Wed, 01 Dec 2010 04:30:34 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PNlpQ-0008Sn-PM; Wed, 01 Dec 2010 12:30:32 +0000 Date: Wed, 1 Dec 2010 07:30:32 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 02/14] xfs: clean up log space grant functions Subject: Re: [PATCH 02/14] xfs: clean up log space grant functions Message-ID: <20101201123032.GA20378@infradead.org> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1290994712-21376-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[18.85.46.34] X-Barracuda-Start-Time: 1291206634 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Nov 29, 2010 at 12:38:20PM +1100, Dave Chinner wrote: > From: Dave Chinner > > xlog_grant_log_space and xlog_regrant_log_write_space both have very > similar structure. Both have a "wait on non-empty queue" section at > the start, followed by a "wait for space" loop of which the contents > are almost identical to the initial non-empty queue section. > > In both cases, the non-empty queue wait can be folded into the wait > for space loop, simply by entering the loop if the queue is not > empty and the current ticket is not on the queue. If we trigger the > non-empty queue case, we always add ourselves to the queue, and > hence the second and subsequent loops are always driven by the "wait > for space" test. > > IOWs, both wait conditions can be folded into the one loop, removing > a bunch of duplicated code and making it simpler to modify in > future patches. I don't really like this patch. The new conditions are overly complicated because of the desire to only go through the loop once for the queue not empty case. In addition there's some behaviour changes: - in xlog_grant_log_space we previously didn't call xlog_grant_push_ail for the queue not empty case, and now we do. - in xlog_regrant_write_log_space the old version of the queue not empty case would loop over all waiting tickets, and if we could wake up all of them we'll skip the first wait, and given enough free space also the second wait, while the new code always adds it to the writeq, although it will still skip the actualy wait later. My recommendation would be to skip this patch for now and revisit the area later. For example the superflous xlog_grant_push_ail actually is rather harmless these days with the xfsaild threshold, so not skipping it for the first case probably is fine in the end. Then again the whole add to the queue just in case if it's non-empty doesn't make much sense to me to start with. As soon as xfs_log_move_tail makes space in the log it wakes up all tickets waiting for it anyway, so adding us to the queue just in case seems rather inefficient, and not overl helpful. From BATV+3217d6c06e4d83826047+2656+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 1 06:33:11 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1CXBuw206973 for ; Wed, 1 Dec 2010 06:33:11 -0600 X-ASG-Debug-ID: 1291206894-4f7d014d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E4CE01BA235 for ; Wed, 1 Dec 2010 04:34:54 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id h6qe7ggXkOvHDQtY for ; Wed, 01 Dec 2010 04:34:54 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PNlte-0000BE-DI; Wed, 01 Dec 2010 12:34:54 +0000 Date: Wed, 1 Dec 2010 07:34:54 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 04/14] xfs: use wait queues directly for log grant queues Subject: Re: [PATCH 04/14] xfs: use wait queues directly for log grant queues Message-ID: <20101201123454.GA612@infradead.org> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1290994712-21376-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291206894 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Nov 29, 2010 at 12:38:22PM +1100, Dave Chinner wrote: > From: Dave Chinner > > The log grant queues are one of the few places left using sv_t > constructs for waiting. Convert them to use wait queues directly > while we are cleaning up the code to move one step closer to remove > the sv_t type from the XFS codebase. Doing this one separately from the other sv_t removal seems a bit pointless. From BATV+3217d6c06e4d83826047+2656+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 1 06:40:52 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1Cep1V207442 for ; Wed, 1 Dec 2010 06:40:52 -0600 X-ASG-Debug-ID: 1291207355-4f7d018a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 69D751BA274 for ; Wed, 1 Dec 2010 04:42:35 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id m2zCzzLfuPlb0TYe for ; Wed, 01 Dec 2010 04:42:35 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PNm15-0001eE-1t; Wed, 01 Dec 2010 12:42:35 +0000 Date: Wed, 1 Dec 2010 07:42:35 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 03/14] xfs: convert log grant heads to LSN notation Subject: Re: [PATCH 03/14] xfs: convert log grant heads to LSN notation Message-ID: <20101201124234.GB612@infradead.org> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1290994712-21376-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291207355 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean The patch looks good to me, but I really hate overloading the lsn types and helpers. Just add duplicated of CYCLE_LSN/BLOCK_LSN and xlog_assign_lsn for a new type as use them. From BATV+3217d6c06e4d83826047+2656+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 1 06:43:57 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1ChvZp207784 for ; Wed, 1 Dec 2010 06:43:57 -0600 X-ASG-Debug-ID: 1291207540-083e00540000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1E4EF140434D for ; Wed, 1 Dec 2010 04:45:40 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Iy0vDivUZzxRXprn for ; Wed, 01 Dec 2010 04:45:40 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PNm44-0002PD-Bl; Wed, 01 Dec 2010 12:45:40 +0000 Date: Wed, 1 Dec 2010 07:45:40 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 05/14] xfs: make AIL tail pushing independent of the grant lock Subject: Re: [PATCH 05/14] xfs: make AIL tail pushing independent of the grant lock Message-ID: <20101201124540.GC612@infradead.org> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1290994712-21376-6-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291207541 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Once l_tail_lsn and l_last_sync_lsn are converted to atomic64_ts later in the series passing them in separately becomes pointless again. Maybe scale the patch back a bit and require the caller to hold l_grant_lock for now, until the atomic64_t conversion happens. From BATV+3217d6c06e4d83826047+2656+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 1 06:53:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1Cr0E4208341 for ; Wed, 1 Dec 2010 06:53:01 -0600 X-ASG-Debug-ID: 1291208083-0bf8006a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EC8231404474 for ; Wed, 1 Dec 2010 04:54:43 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id cUkp1cjKU1cRCXnc for ; Wed, 01 Dec 2010 04:54:43 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PNmCp-0003HE-A4; Wed, 01 Dec 2010 12:54:43 +0000 Date: Wed, 1 Dec 2010 07:54:43 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 06/14] xfs: convert l_last_sync_lsn to an atomic variable Subject: Re: [PATCH 06/14] xfs: convert l_last_sync_lsn to an atomic variable Message-ID: <20101201125443.GD612@infradead.org> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1290994712-21376-7-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291208083 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Looks good, Reviewed-by: Christoph Hellwig From BATV+3217d6c06e4d83826047+2656+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 1 06:54:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1CsLBR208436 for ; Wed, 1 Dec 2010 06:54:22 -0600 X-ASG-Debug-ID: 1291208165-6d22013d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 90AC41C85F8B for ; Wed, 1 Dec 2010 04:56:05 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id jeLh54POaroeDZg7 for ; Wed, 01 Dec 2010 04:56:05 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PNmE8-0003xK-V8; Wed, 01 Dec 2010 12:56:05 +0000 Date: Wed, 1 Dec 2010 07:56:04 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 07/14] xfs: convert l_tail_lsn to an atomic variable. Subject: Re: [PATCH 07/14] xfs: convert l_tail_lsn to an atomic variable. Message-ID: <20101201125604.GE612@infradead.org> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-8-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1290994712-21376-8-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291208165 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Looks good, Reviewed-by: Christoph Hellwig From BATV+3217d6c06e4d83826047+2656+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 1 06:57:37 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1Cvb2g208651 for ; Wed, 1 Dec 2010 06:57:37 -0600 X-ASG-Debug-ID: 1291208361-6d2f01630000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 37FE11C86905 for ; Wed, 1 Dec 2010 04:59:21 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id GxLMksyaNx2cGes2 for ; Wed, 01 Dec 2010 04:59:21 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PNmHI-00044q-PM; Wed, 01 Dec 2010 12:59:20 +0000 Date: Wed, 1 Dec 2010 07:59:20 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 08/14] xfs: convert log grant heads to atomic variables Subject: Re: [PATCH 08/14] xfs: convert log grant heads to atomic variables Message-ID: <20101201125920.GF612@infradead.org> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-9-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1290994712-21376-9-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291208361 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Nov 29, 2010 at 12:38:26PM +1100, Dave Chinner wrote: > From: Dave Chinner > > Convert the log grant heads to atomic64_t types in preparation for > converting the accounting algorithms to atomic operations. his patch > just converts the variables; the algorithmic changes are in a > separate patch for clarity. > > Signed-off-by: Dave Chinner > --- > fs/xfs/linux-2.6/xfs_trace.h | 18 +++++++------ > fs/xfs/xfs_log.c | 54 +++++++++++++++++++++-------------------- > fs/xfs/xfs_log_priv.h | 4 +- > fs/xfs/xfs_log_recover.c | 8 +++--- > 4 files changed, 44 insertions(+), 40 deletions(-) > > diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h > index d2cdc85..68c3bdd 100644 > --- a/fs/xfs/linux-2.6/xfs_trace.h > +++ b/fs/xfs/linux-2.6/xfs_trace.h > @@ -768,8 +768,8 @@ DECLARE_EVENT_CLASS(xfs_loggrant_class, > __field(unsigned int, flags) > __field(void *, reserveq) > __field(void *, writeq) > - __field(xfs_lsn_t, grant_reserve_lsn) > - __field(xfs_lsn_t, grant_write_lsn) > + __field(xfs_lsn_t, grant_reserve_head) > + __field(xfs_lsn_t, grant_write_head) What about just naming them _head from the beginning? That would be a tad cleaner. Same for the actual variables in the log, even if they change the type here. Otherwise looks good, Reviewed-by: Christoph Hellwig From BATV+3217d6c06e4d83826047+2656+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 1 07:03:21 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1D3LIk209024 for ; Wed, 1 Dec 2010 07:03:21 -0600 X-ASG-Debug-ID: 1291208705-643102040000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3D92C1C8695E for ; Wed, 1 Dec 2010 05:05:05 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 6so5STpUVC4BwNKR for ; Wed, 01 Dec 2010 05:05:05 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PNmMq-0005WZ-PB; Wed, 01 Dec 2010 13:05:04 +0000 Date: Wed, 1 Dec 2010 08:05:04 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 03/14] xfs: convert log grant heads to LSN notation Subject: Re: [PATCH 03/14] xfs: convert log grant heads to LSN notation Message-ID: <20101201130504.GA18379@infradead.org> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1290994712-21376-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291208705 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean > -STATIC int xlog_space_left(xlog_t *log, int cycle, int bytes); > +STATIC int xlog_space_left(int logsize, xfs_lsn_t tail_lsn, > + xfs_lsn_t head); Looking further through the series I have to say I really hate passing in the logsize instead of the log structure. Passing the log pointer from higher level functions just makes a lot more sense. Also in this case passing the tail_lsn explicitly doesn't make any sense - it becomes atomic later and thus there is no locking requirement for it. > -xlog_grant_sub_space(struct log *log, int bytes) > +__xlog_grant_sub_space( > + xfs_lsn_t *head, > + int bytes, > + int logsize) Same thing here - the calling convention would be a lot more regular by still passing the log as first argument. After the factoring I also think we could cut down on the amount of wrappers in this area. Just rename __xlog_grant_sub_space and __xlog_grant_add_space to not have the __ prefix, and kill the wrappers around it - they only have one or two callers, and just having two helpers and passing the heads we're interested in is a lot simpler and cleaner. From BATV+3217d6c06e4d83826047+2656+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 1 07:10:25 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_TICKET autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1DAPuD209478 for ; Wed, 1 Dec 2010 07:10:25 -0600 X-ASG-Debug-ID: 1291209129-406703180000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 44C391BA3EC for ; Wed, 1 Dec 2010 05:12:09 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id q64kedN01J7Mzlkm for ; Wed, 01 Dec 2010 05:12:09 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PNmTg-0006aZ-Sr; Wed, 01 Dec 2010 13:12:08 +0000 Date: Wed, 1 Dec 2010 08:12:08 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 09/14] xfs: introduce new locks for the log grant ticket wait queues Subject: Re: [PATCH 09/14] xfs: introduce new locks for the log grant ticket wait queues Message-ID: <20101201131208.GA22455@infradead.org> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-10-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1290994712-21376-10-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291209129 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean > + /* co-ordinate with xfs_log_force_shutdown */ > + if (XLOG_FORCED_SHUTDOWN(log)) { > + spin_unlock(&log->l_grant_reserve_lock); > + goto error_return; > + } Where is this coming from? Otherwise the patch looks good to me. From BATV+3217d6c06e4d83826047+2656+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 1 07:13:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1DDUNu209979 for ; Wed, 1 Dec 2010 07:13:30 -0600 X-ASG-Debug-ID: 1291209313-406e031d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C2A491BA432 for ; Wed, 1 Dec 2010 05:15:13 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id lDIHVfukgERkqxYG for ; Wed, 01 Dec 2010 05:15:13 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PNmWf-0007XD-BO; Wed, 01 Dec 2010 13:15:13 +0000 Date: Wed, 1 Dec 2010 08:15:13 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 10/14] xfs: convert grant head manipulations to lockless algorithm Subject: Re: [PATCH 10/14] xfs: convert grant head manipulations to lockless algorithm Message-ID: <20101201131513.GB22455@infradead.org> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-11-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1290994712-21376-11-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[18.85.46.34] X-Barracuda-Start-Time: 1291209313 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Nov 29, 2010 at 12:38:28PM +1100, Dave Chinner wrote: > From: Dave Chinner > > The only thing that the grant lock remains to protect is the grant head > manipulations when adding or removing space from the log. These calculations > are already based on atomic variables, so we can already update them safely > without locks. However, the grant head manpulations require atomic multi-step > calculations to be executed, which the algorithms currently don't allow. > > To make these multi-step calculations atomic, convert the algorithms to > compare-and-exchange loops on the atomic variables. That is, we sample the old > value, perform the calculation and use atomic64_cmpxchg() to attempt to update > the head with the new value. If the head has not changed since we sampled it, > it will succeed and we are done. Otherwise, we rerun the calculation again from > a new sample of the head. > > This allows us to remove the grant lock from around all the grant head space > manipulations, and that effectively removes the grant lock from the log > completely. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_log.c | 133 ++++++++++++++++++++++++++++++------------------------ > 1 files changed, 74 insertions(+), 59 deletions(-) > > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > index 8365496..50cf6af 100644 > --- a/fs/xfs/xfs_log.c > +++ b/fs/xfs/xfs_log.c > @@ -111,6 +111,13 @@ STATIC int xlog_iclogs_empty(xlog_t *log); > * is the byte offset into the log for the marker. Unlike the xfs_lsn_t, this > * is held in bytes rather than basic blocks, even though it uses the > * BLOCK_LSN() macro to extract it. > + * > + * We use a lock-free compare and exchange algorithm to atomically update > + * the grant head. That is, we sample the current head, crack it, perform the > + * calculation, recombine it into a new value, and then conditionally set the > + * value back into the atomic variable only if it hasn't changed since we first > + * sampled it. This provides atomic updates of the head, even though we do > + * non-atomic, multi-step calculation to arrive at the new value. > */ > static void > __xlog_grant_sub_space( > @@ -119,16 +126,23 @@ __xlog_grant_sub_space( > int logsize) > { > xfs_lsn_t head_lsn = atomic64_read(head); > - int cycle, space; > + xfs_lsn_t old, new; > > - cycle = CYCLE_LSN(head_lsn); > - space = BLOCK_LSN(head_lsn); > - space -= bytes; > - if (space < 0) { > - cycle--; > - space += logsize; > - } > - atomic64_set(head, xlog_assign_lsn(cycle, space)); > + do { > + int cycle, space; > + > + cycle = CYCLE_LSN(head_lsn); > + space = BLOCK_LSN(head_lsn); > + space -= bytes; > + if (space < 0) { > + cycle--; > + space += logsize; > + } > + > + old = head_lsn; > + new = xlog_assign_lsn(cycle, space); > + head_lsn = atomic64_cmpxchg(head, old, new); > + } while (head_lsn != old); > } > > static void > @@ -138,18 +152,25 @@ __xlog_grant_add_space( > int logsize) > { > xfs_lsn_t head_lsn = atomic64_read(head); > - int cycle, space, tmp; > + xfs_lsn_t old, new; > > - cycle = CYCLE_LSN(head_lsn); > - space = BLOCK_LSN(head_lsn); > - tmp = logsize - space; > - if (tmp > bytes) > - space += bytes; > - else { > - cycle++; > - space = bytes - tmp; > - } > - atomic64_set(head, xlog_assign_lsn(cycle, space)); > + do { > + int cycle, space, tmp; > + > + cycle = CYCLE_LSN(head_lsn); > + space = BLOCK_LSN(head_lsn); > + tmp = logsize - space; > + if (tmp > bytes) > + space += bytes; > + else { > + cycle++; > + space = bytes - tmp; > + } > + > + old = head_lsn; > + new = xlog_assign_lsn(cycle, space); > + head_lsn = atomic64_cmpxchg(head, old, new); > + } while (head_lsn != old); > } > > static inline void > @@ -360,11 +381,9 @@ xfs_log_reserve( > > trace_xfs_log_reserve(log, internal_ticket); > > - spin_lock(&log->l_grant_lock); > xlog_grant_push_ail(log, atomic64_read(&log->l_tail_lsn), > atomic64_read(&log->l_last_sync_lsn), > internal_ticket->t_unit_res); > - spin_unlock(&log->l_grant_lock); > retval = xlog_regrant_write_log_space(log, internal_ticket); > } else { > /* may sleep if need to allocate more tickets */ > @@ -378,12 +397,10 @@ xfs_log_reserve( > > trace_xfs_log_reserve(log, internal_ticket); > > - spin_lock(&log->l_grant_lock); > xlog_grant_push_ail(log, atomic64_read(&log->l_tail_lsn), > atomic64_read(&log->l_last_sync_lsn), > (internal_ticket->t_unit_res * > internal_ticket->t_cnt)); > - spin_unlock(&log->l_grant_lock); > retval = xlog_grant_log_space(log, internal_ticket); > } > > @@ -1376,9 +1393,7 @@ xlog_sync(xlog_t *log, > roundoff < BBTOB(1))); > > /* move grant heads by roundoff in sync */ > - spin_lock(&log->l_grant_lock); > xlog_grant_add_space(log, roundoff); > - spin_unlock(&log->l_grant_lock); > > /* put cycle number in every block */ > xlog_pack_data(log, iclog, roundoff); > @@ -2618,13 +2633,11 @@ redo: > } > > /* we've got enough space */ > - spin_lock(&log->l_grant_lock); > xlog_grant_add_space(log, need_bytes); > > trace_xfs_log_grant_exit(log, tic); > xlog_verify_grant_tail(log); > xlog_verify_grant_head(log, 1); > - spin_unlock(&log->l_grant_lock); > return 0; > > error_return: > @@ -2752,13 +2765,11 @@ redo: > } > > /* we've got enough space */ > - spin_lock(&log->l_grant_lock); > xlog_grant_add_space_write(log, need_bytes); > > trace_xfs_log_regrant_write_exit(log, tic); > xlog_verify_grant_tail(log); > xlog_verify_grant_head(log, 1); > - spin_unlock(&log->l_grant_lock); > return 0; > > > @@ -2779,23 +2790,23 @@ redo: > } > > > -/* The first cnt-1 times through here we don't need to > - * move the grant write head because the permanent > - * reservation has reserved cnt times the unit amount. > - * Release part of current permanent unit reservation and > - * reset current reservation to be one units worth. Also > - * move grant reservation head forward. > +/* > + * The first cnt-1 times through here we don't need to move the grant write > + * head because the permanent reservation has reserved cnt times the unit > + * amount. Release part of current permanent unit reservation and reset > + * current reservation to be one units worth. Also move grant reservation head > + * forward. > */ > STATIC void > -xlog_regrant_reserve_log_space(xlog_t *log, > - xlog_ticket_t *ticket) > +xlog_regrant_reserve_log_space( > + struct log *log, > + struct xlog_ticket *ticket) > { > trace_xfs_log_regrant_reserve_enter(log, ticket); > > if (ticket->t_cnt > 0) > ticket->t_cnt--; > > - spin_lock(&log->l_grant_lock); > xlog_grant_sub_space(log, ticket->t_curr_res); > ticket->t_curr_res = ticket->t_unit_res; > xlog_tic_reset_res(ticket); > @@ -2805,20 +2816,17 @@ xlog_regrant_reserve_log_space(xlog_t *log, > xlog_verify_grant_head(log, 1); > > /* just return if we still have some of the pre-reserved space */ > - if (ticket->t_cnt > 0) { > - spin_unlock(&log->l_grant_lock); > + if (ticket->t_cnt > 0) > return; > - } > > xlog_grant_add_space_reserve(log, ticket->t_unit_res); > > trace_xfs_log_regrant_reserve_exit(log, ticket); > > xlog_verify_grant_head(log, 0); > - spin_unlock(&log->l_grant_lock); > ticket->t_curr_res = ticket->t_unit_res; > xlog_tic_reset_res(ticket); > -} /* xlog_regrant_reserve_log_space */ > +} > > > /* > @@ -2836,34 +2844,33 @@ xlog_regrant_reserve_log_space(xlog_t *log, > * in the current reservation field. > */ > STATIC void > -xlog_ungrant_log_space(xlog_t *log, > - xlog_ticket_t *ticket) > +xlog_ungrant_log_space( > + struct log *log, > + struct xlog_ticket *ticket) > { > - if (ticket->t_cnt > 0) > - ticket->t_cnt--; > + int space; > > - spin_lock(&log->l_grant_lock); > trace_xfs_log_ungrant_enter(log, ticket); > + if (ticket->t_cnt > 0) > + ticket->t_cnt--; > > - xlog_grant_sub_space(log, ticket->t_curr_res); > - > - trace_xfs_log_ungrant_sub(log, ticket); > - > - /* If this is a permanent reservation ticket, we may be able to free > + /* > + * If this is a permanent reservation ticket, we may be able to free > * up more space based on the remaining count. > */ > + space = ticket->t_curr_res; > if (ticket->t_cnt > 0) { > ASSERT(ticket->t_flags & XLOG_TIC_PERM_RESERV); > - xlog_grant_sub_space(log, ticket->t_unit_res*ticket->t_cnt); > + space += ticket->t_unit_res * ticket->t_cnt; > } > + trace_xfs_log_ungrant_sub(log, ticket); > + xlog_grant_sub_space(log, space); > > trace_xfs_log_ungrant_exit(log, ticket); > - > xlog_verify_grant_head(log, 1); > - spin_unlock(&log->l_grant_lock); > - xfs_log_move_tail(log->l_mp, 1); > -} /* xlog_ungrant_log_space */ > > + xfs_log_move_tail(log->l_mp, 1); > +} > > /* > * Flush iclog to disk if this is the last reference to the given iclog and > @@ -3478,11 +3485,18 @@ xlog_verify_dest_ptr( > xlog_panic("xlog_verify_dest_ptr: invalid ptr"); > } > > +/* > + * XXX: because we cannot atomically sample both the reserve and write heads, > + * we cannot verify them reliably as they may be sampled in the middle of > + * racing modifications. Hence just taking snapshots of the heads can give an > + * incorrect view of the state of log. Hence just disable this check for now. > + */ > STATIC void > xlog_verify_grant_head( I can't see any way to keep this check with the atomic reserve/write heads, so we might as well remove it entirely. Otherwise the patch looks good, Reviewed-by: Christoph Hellwig From BATV+3217d6c06e4d83826047+2656+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 1 07:13:52 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1DDqo3210027 for ; Wed, 1 Dec 2010 07:13:52 -0600 X-ASG-Debug-ID: 1291209336-6d0001a00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 58D331C869F1 for ; Wed, 1 Dec 2010 05:15:36 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id S7zSNh5l0XEAoBAF for ; Wed, 01 Dec 2010 05:15:36 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PNmX1-0007Y0-Ve; Wed, 01 Dec 2010 13:15:36 +0000 Date: Wed, 1 Dec 2010 08:15:35 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 11/14] xfs: remove log grant lock Subject: Re: [PATCH 11/14] xfs: remove log grant lock Message-ID: <20101201131535.GC22455@infradead.org> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-12-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1290994712-21376-12-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[18.85.46.34] X-Barracuda-Start-Time: 1291209336 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Nov 29, 2010 at 12:38:29PM +1100, Dave Chinner wrote: > From: Dave Chinner > > The log grant lock no longer protects anything, so remove the remaining > initialisation and teardown code that still exists. Looks good, although I would fold it into the previous patch. Reviewed-by: Christoph Hellwig From BATV+3217d6c06e4d83826047+2656+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 1 07:17:25 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1DHOo0210298 for ; Wed, 1 Dec 2010 07:17:25 -0600 X-ASG-Debug-ID: 1291209548-6d1b01ab0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 72EBD1C86806 for ; Wed, 1 Dec 2010 05:19:08 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Q1vZbIKBGpPtOIVN for ; Wed, 01 Dec 2010 05:19:08 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PNmaS-0007ui-0p; Wed, 01 Dec 2010 13:19:08 +0000 Date: Wed, 1 Dec 2010 08:19:08 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 12/14] xfs: kill useless spinlock_destroy macro Subject: Re: [PATCH 12/14] xfs: kill useless spinlock_destroy macro Message-ID: <20101201131907.GD22455@infradead.org> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-13-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1290994712-21376-13-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[18.85.46.34] X-Barracuda-Start-Time: 1291209548 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Nov 29, 2010 at 12:38:30PM +1100, Dave Chinner wrote: > From: Dave Chinner > > It is only used in 2 places in the log code, and is an empty macro, > so get rid of it. yeah, time to kill it. Reviewed-by: Christoph Hellwig From BATV+3217d6c06e4d83826047+2656+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 1 07:18:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1DINuJ210361 for ; Wed, 1 Dec 2010 07:18:23 -0600 X-ASG-Debug-ID: 1291209606-21fa002b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 282551404539 for ; Wed, 1 Dec 2010 05:20:06 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 21ms22AqSnJd31Es for ; Wed, 01 Dec 2010 05:20:06 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PNmbO-00006c-FJ; Wed, 01 Dec 2010 13:20:06 +0000 Date: Wed, 1 Dec 2010 08:20:06 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 13/14] xfs: replace use of sv_t with waitqueues in the log Subject: Re: [PATCH 13/14] xfs: replace use of sv_t with waitqueues in the log Message-ID: <20101201132006.GE22455@infradead.org> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-14-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1290994712-21376-14-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[18.85.46.34] X-Barracuda-Start-Time: 1291209607 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Nov 29, 2010 at 12:38:31PM +1100, Dave Chinner wrote: > From: Dave Chinner > > Only the log still uses the old Irix wait queue interface. The log > grant lock scaling series killed one of the users, so convert > the remaining users of sv_t to plain wait queues so the sv_t wrapper can > be removed. Looks good, but as said before I'd prefer it to be merged with the introduction of xlog_wait and the first sv_t removal. Reviewed-by: Christoph Hellwig From BATV+3217d6c06e4d83826047+2656+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 1 07:18:47 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1DIlWX210409 for ; Wed, 1 Dec 2010 07:18:47 -0600 X-ASG-Debug-ID: 1291209630-457f02ea0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C7FB31B9FF8 for ; Wed, 1 Dec 2010 05:20:30 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id riqg9mCF0KoDhXhx for ; Wed, 01 Dec 2010 05:20:30 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PNmbm-00007D-Bx; Wed, 01 Dec 2010 13:20:30 +0000 Date: Wed, 1 Dec 2010 08:20:30 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 14/14] xfs: remove sv wrappers Subject: Re: [PATCH 14/14] xfs: remove sv wrappers Message-ID: <20101201132030.GF22455@infradead.org> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-15-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1290994712-21376-15-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[18.85.46.34] X-Barracuda-Start-Time: 1291209630 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Nov 29, 2010 at 12:38:32PM +1100, Dave Chinner wrote: > From: Dave Chinner > > The sv_t type is no longer used in XFS. Remove the header file defining the > wrapper and the fragments that still reference it. Looks good, although I'd suggest merging it into the previous patch. Reviewed-by: Christoph Hellwig From sandeen@sandeen.net Wed Dec 1 08:53:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1ErMMD217074 for ; Wed, 1 Dec 2010 08:53:23 -0600 X-ASG-Debug-ID: 1291215304-21fa02150000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id F22CB16071C5 for ; Wed, 1 Dec 2010 06:55:04 -0800 (PST) Received: from mail.sandeen.net (64-131-28-21.usfamily.net [64.131.28.21]) by cuda.sgi.com with ESMTP id 9kPCTeEBnCjprria for ; Wed, 01 Dec 2010 06:55:04 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 1EA054817D73; Wed, 1 Dec 2010 08:55:04 -0600 (CST) Message-ID: <4CF661C7.2020103@sandeen.net> Date: Wed, 01 Dec 2010 08:55:03 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.12) Gecko/20101027 Thunderbird/3.1.6 MIME-Version: 1.0 To: Amit Sahrawat CC: xfs@oss.sgi.com, sandeen-xfs@sandeen.net X-ASG-Orig-Subj: Re: XFS file system corruption(Return Bad Transaction) kernel - 2.6.34 Subject: Re: XFS file system corruption(Return Bad Transaction) kernel - 2.6.34 References: In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-28-21.usfamily.net[64.131.28.21] X-Barracuda-Start-Time: 1291215305 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48174 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 12/1/10 1:14 AM, Amit Sahrawat wrote: > Dear Member, > > I am getting following corruption on XFS formatted disk during a simple copy operation: > sd 9:0:0:0: Attached scsi removable disk sdc > sd 9:0:0:0: Attached scsi generic sg2 type 0 > XFS mounting filesystem sdc2 > Starting XFS recovery on filesystem: sdc2 (logdev: internal) > XFS: xlog_recover_process_data: bad transaction > XFS: log mount/recovery failed: error 5 > XFS: log mount failed hm, that's not a simple copy operation, that is a mount failing; your log appears to be corrupted. offhand I'm going to blame it on having a write cache enabled on your drive, and having barriers either off, or not working properly. -Eric From aelder@sgi.com Wed Dec 1 14:28:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1KSaFd232389 for ; Wed, 1 Dec 2010 14:28:36 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay1.corp.sgi.com (Postfix) with ESMTP id E9D858F8094; Wed, 1 Dec 2010 12:30:16 -0800 (PST) Received: from [127.0.0.1] ([198.149.20.12]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 1 Dec 2010 14:29:40 -0600 Subject: xfstests 065 failures From: Alex Elder Reply-To: aelder@sgi.com To: dchinner@redhat.com Cc: Bill Kendall , XFS Mailing List Content-Type: text/plain; charset="UTF-8" Date: Wed, 01 Dec 2010 14:29:39 -0600 Message-ID: <1291235379.2556.28.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 01 Dec 2010 20:29:40.0145 (UTC) FILETIME=[7ACB3210:01CB9196] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dave, you were asking on IRC about test 065 failures. I asked Bill Kendall about it and he bisected to find that the commit below seems to be where the problems started. I believe the problem is that one of the times is not updated properly when renaming the file "addedfile4". Here are the commands that might affect that file in test 065: mv addeddir4/addedfile5 addeddir4/addedfile4 mv addeddir4 addeddir6 I glanced at the commit and saw nothing obviously wrong, but at the moment I can't really dig into it any deeper so I thought I'd report what Bill found so others could look. -Alex >From dcd79a1423f64ee0184629874805c3ac40f3a2c5 Mon Sep 17 00:00:00 2001 From: Dave Chinner Date: Tue, 28 Sep 2010 12:27:25 +1000 Subject: [PATCH] xfs: don't use vfs writeback for pure metadata modifications Under heavy multi-way parallel create workloads, the VFS struggles to write back all the inodes that have been changed in age order. The bdi flusher thread becomes CPU bound, spending 85% of it's time in the VFS code, mostly traversing the superblock dirty inode list to separate dirty inodes old enough to flush. We already keep an index of all metadata changes in age order - in the AIL - and continued log pressure will do age ordered writeback without any extra overhead at all. If there is no pressure on the log, the xfssyncd will periodically write back metadata in ascending disk address offset order so will be very efficient. Hence we can stop marking VFS inodes dirty during transaction commit or when changing timestamps during transactions. This will keep the inodes in the superblock dirty list to those containing data or unlogged metadata changes. However, the timstamp changes are slightly more complex than this - there are a couple of places that do unlogged updates of the timestamps, and the VFS need to be informed of these. Hence add a new function xfs_trans_ichgtime() for transactional changes, and leave xfs_ichgtime() for the non-transactional changes. Signed-off-by: Dave Chinner Reviewed-by: Alex Elder Reviewed-by: Christoph Hellwig From aelder@oss.sgi.com Wed Dec 1 14:54:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1Ks3DV233550 for ; Wed, 1 Dec 2010 14:54:03 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id oB1Ks0NA233500; Wed, 1 Dec 2010 14:54:00 -0600 Date: Wed, 1 Dec 2010 14:54:00 -0600 Message-Id: <201012012054.oB1Ks0NA233500@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v2.6.36-rc8-11223-gc76febe X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: ece413f59f257682de4a2e2e42af33b016af53f3 X-Git-Newrev: c76febef574fd86566bbdf1a73a547a439115c25 This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, master has been updated c76febe xfs: only run xfs_error_test if error injection is active de25c18 xfs: avoid moving stale inodes in the AIL 309c848 xfs: delayed alloc blocks beyond EOF are valid after writeback 90810b9 xfs: push stale, pinned buffers on trylock failures c726de4 xfs: fix failed write truncation handling. from ece413f59f257682de4a2e2e42af33b016af53f3 (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 c76febef574fd86566bbdf1a73a547a439115c25 Author: Dave Chinner Date: Tue Nov 30 15:15:31 2010 +1100 xfs: only run xfs_error_test if error injection is active Recent tests writing lots of small files showed the flusher thread being CPU bound and taking a long time to do allocations on a debug kernel. perf showed this as the prime reason: samples pcnt function DSO _______ _____ ___________________________ _________________ 224648.00 36.8% xfs_error_test [kernel.kallsyms] 86045.00 14.1% xfs_btree_check_sblock [kernel.kallsyms] 39778.00 6.5% prandom32 [kernel.kallsyms] 37436.00 6.1% xfs_btree_increment [kernel.kallsyms] 29278.00 4.8% xfs_btree_get_rec [kernel.kallsyms] 27717.00 4.5% random32 [kernel.kallsyms] Walking btree blocks during allocation checking them requires each block (a cache hit, so no I/O) call xfs_error_test(), which then does a random32() call as the first operation. IOWs, ~50% of the CPU is being consumed just testing whether we need to inject an error, even though error injection is not active. Kill this overhead when error injection is not active by adding a global counter of active error traps and only calling into xfs_error_test when fault injection is active. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit de25c1818c44f580ff556cb9e0f7a1c687ed870b Author: Dave Chinner Date: Tue Nov 30 15:15:46 2010 +1100 xfs: avoid moving stale inodes in the AIL When an inode has been marked stale because the cluster is being freed, we don't want to (re-)insert this inode into the AIL. There is a race condition where the cluster buffer may be unpinned before the inode is inserted into the AIL during transaction committed processing. If the buffer is unpinned before the inode item has been committed and inserted, then it is possible for the buffer to be released and hence processthe stale inode callbacks before the inode is inserted into the AIL. In this case, we then insert a clean, stale inode into the AIL which will never get removed by an IO completion. It will, however, get reclaimed and that triggers an assert in xfs_inode_free() complaining about freeing an inode still in the AIL. This race can be avoided by not moving stale inodes forward in the AIL during transaction commit completion processing. This closes the race condition by ensuring we never insert clean stale inodes into the AIL. It is safe to do this because a dirty stale inode, by definition, must already be in the AIL. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 309c848002052edbec650075a1eb098b17c17f35 Author: Dave Chinner Date: Tue Nov 30 15:16:02 2010 +1100 xfs: delayed alloc blocks beyond EOF are valid after writeback There is an assumption in the parts of XFS that flushing a dirty file will make all the delayed allocation blocks disappear from an inode. That is, that after calling xfs_flush_pages() then ip->i_delayed_blks will be zero. This is an invalid assumption as we may have specualtive preallocation beyond EOF and they are recorded in ip->i_delayed_blks. A flush of the dirty pages of an inode will not change the state of these blocks beyond EOF, so a non-zero deeelalloc block count after a flush is valid. The bmap code has an invalid ASSERT() that needs to be removed, and the swapext code has a bug in that while it swaps the data forks around, it fails to swap the i_delayed_blks counter associated with the fork and hence can get the block accounting wrong. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 90810b9e82a36c3c57c1aeb8b2918b242a130b26 Author: Dave Chinner Date: Tue Nov 30 15:16:16 2010 +1100 xfs: push stale, pinned buffers on trylock failures As reported by Nick Piggin, XFS is suffering from long pauses under highly concurrent workloads when hosted on ramdisks. The problem is that an inode buffer is stuck in the pinned state in memory and as a result either the inode buffer or one of the inodes within the buffer is stopping the tail of the log from being moved forward. The system remains in this state until a periodic log force issued by xfssyncd causes the buffer to be unpinned. The main problem is that these are stale buffers, and are hence held locked until the transaction/checkpoint that marked them state has been committed to disk. When the filesystem gets into this state, only the xfssyncd can cause the async transactions to be committed to disk and hence unpin the inode buffer. This problem was encountered when scaling the busy extent list, but only the blocking lock interface was fixed to solve the problem. Extend the same fix to the buffer trylock operations - if we fail to lock a pinned, stale buffer, then force the log immediately so that when the next attempt to lock it comes around, it will have been unpinned. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit c726de4409a8d3a03877b1ef4342bfe8a15f5e5e Author: Dave Chinner Date: Tue Nov 30 15:14:39 2010 +1100 xfs: fix failed write truncation handling. Since the move to the new truncate sequence we call xfs_setattr to truncate down excessively instanciated blocks. As shown by the testcase in kernel.org BZ #22452 that doesn't work too well. Due to the confusion of the internal inode size, and the VFS inode i_size it zeroes data that it shouldn't. But full blown truncate seems like overkill here. We only instanciate delayed allocations in the write path, and given that we never released the iolock we can't have converted them to real allocations yet either. The only nasty case is pre-existing preallocation which we need to skip. We already do this for page discard during writeback, so make the delayed allocation block punching a generic function and call it from the failed write path as well as xfs_aops_discard_page. The callers are responsible for ensuring that partial blocks are not truncated away, and that they hold the ilock. Based on a fix originally from Christoph Hellwig. This version used filesystem blocks as the range unit. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig ----------------------------------------------------------------------- Summary of changes: fs/xfs/linux-2.6/xfs_aops.c | 94 ++++++++++++++++++------------------------ fs/xfs/linux-2.6/xfs_buf.c | 35 +++++++--------- fs/xfs/xfs_bmap.c | 85 ++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_bmap.h | 5 ++ fs/xfs/xfs_dfrag.c | 13 ++++++ fs/xfs/xfs_error.c | 3 + fs/xfs/xfs_error.h | 5 +- fs/xfs/xfs_inode_item.c | 31 +++++++++++--- 8 files changed, 188 insertions(+), 83 deletions(-) hooks/post-receive -- XFS development tree From aelder@oss.sgi.com Wed Dec 1 14:54:11 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1KsBnB233672 for ; Wed, 1 Dec 2010 14:54:11 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id oB1Ks9h4233622; Wed, 1 Dec 2010 14:54:09 -0600 Date: Wed, 1 Dec 2010 14:54:09 -0600 Message-Id: <201012012054.oB1Ks9h4233622@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-linus, updated. v2.6.36-rc8-11223-gc76febe X-Git-Refname: refs/heads/for-linus X-Git-Reftype: branch X-Git-Oldrev: ece413f59f257682de4a2e2e42af33b016af53f3 X-Git-Newrev: c76febef574fd86566bbdf1a73a547a439115c25 This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-linus has been updated c76febe xfs: only run xfs_error_test if error injection is active de25c18 xfs: avoid moving stale inodes in the AIL 309c848 xfs: delayed alloc blocks beyond EOF are valid after writeback 90810b9 xfs: push stale, pinned buffers on trylock failures c726de4 xfs: fix failed write truncation handling. from ece413f59f257682de4a2e2e42af33b016af53f3 (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 c76febef574fd86566bbdf1a73a547a439115c25 Author: Dave Chinner Date: Tue Nov 30 15:15:31 2010 +1100 xfs: only run xfs_error_test if error injection is active Recent tests writing lots of small files showed the flusher thread being CPU bound and taking a long time to do allocations on a debug kernel. perf showed this as the prime reason: samples pcnt function DSO _______ _____ ___________________________ _________________ 224648.00 36.8% xfs_error_test [kernel.kallsyms] 86045.00 14.1% xfs_btree_check_sblock [kernel.kallsyms] 39778.00 6.5% prandom32 [kernel.kallsyms] 37436.00 6.1% xfs_btree_increment [kernel.kallsyms] 29278.00 4.8% xfs_btree_get_rec [kernel.kallsyms] 27717.00 4.5% random32 [kernel.kallsyms] Walking btree blocks during allocation checking them requires each block (a cache hit, so no I/O) call xfs_error_test(), which then does a random32() call as the first operation. IOWs, ~50% of the CPU is being consumed just testing whether we need to inject an error, even though error injection is not active. Kill this overhead when error injection is not active by adding a global counter of active error traps and only calling into xfs_error_test when fault injection is active. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit de25c1818c44f580ff556cb9e0f7a1c687ed870b Author: Dave Chinner Date: Tue Nov 30 15:15:46 2010 +1100 xfs: avoid moving stale inodes in the AIL When an inode has been marked stale because the cluster is being freed, we don't want to (re-)insert this inode into the AIL. There is a race condition where the cluster buffer may be unpinned before the inode is inserted into the AIL during transaction committed processing. If the buffer is unpinned before the inode item has been committed and inserted, then it is possible for the buffer to be released and hence processthe stale inode callbacks before the inode is inserted into the AIL. In this case, we then insert a clean, stale inode into the AIL which will never get removed by an IO completion. It will, however, get reclaimed and that triggers an assert in xfs_inode_free() complaining about freeing an inode still in the AIL. This race can be avoided by not moving stale inodes forward in the AIL during transaction commit completion processing. This closes the race condition by ensuring we never insert clean stale inodes into the AIL. It is safe to do this because a dirty stale inode, by definition, must already be in the AIL. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 309c848002052edbec650075a1eb098b17c17f35 Author: Dave Chinner Date: Tue Nov 30 15:16:02 2010 +1100 xfs: delayed alloc blocks beyond EOF are valid after writeback There is an assumption in the parts of XFS that flushing a dirty file will make all the delayed allocation blocks disappear from an inode. That is, that after calling xfs_flush_pages() then ip->i_delayed_blks will be zero. This is an invalid assumption as we may have specualtive preallocation beyond EOF and they are recorded in ip->i_delayed_blks. A flush of the dirty pages of an inode will not change the state of these blocks beyond EOF, so a non-zero deeelalloc block count after a flush is valid. The bmap code has an invalid ASSERT() that needs to be removed, and the swapext code has a bug in that while it swaps the data forks around, it fails to swap the i_delayed_blks counter associated with the fork and hence can get the block accounting wrong. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit 90810b9e82a36c3c57c1aeb8b2918b242a130b26 Author: Dave Chinner Date: Tue Nov 30 15:16:16 2010 +1100 xfs: push stale, pinned buffers on trylock failures As reported by Nick Piggin, XFS is suffering from long pauses under highly concurrent workloads when hosted on ramdisks. The problem is that an inode buffer is stuck in the pinned state in memory and as a result either the inode buffer or one of the inodes within the buffer is stopping the tail of the log from being moved forward. The system remains in this state until a periodic log force issued by xfssyncd causes the buffer to be unpinned. The main problem is that these are stale buffers, and are hence held locked until the transaction/checkpoint that marked them state has been committed to disk. When the filesystem gets into this state, only the xfssyncd can cause the async transactions to be committed to disk and hence unpin the inode buffer. This problem was encountered when scaling the busy extent list, but only the blocking lock interface was fixed to solve the problem. Extend the same fix to the buffer trylock operations - if we fail to lock a pinned, stale buffer, then force the log immediately so that when the next attempt to lock it comes around, it will have been unpinned. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig commit c726de4409a8d3a03877b1ef4342bfe8a15f5e5e Author: Dave Chinner Date: Tue Nov 30 15:14:39 2010 +1100 xfs: fix failed write truncation handling. Since the move to the new truncate sequence we call xfs_setattr to truncate down excessively instanciated blocks. As shown by the testcase in kernel.org BZ #22452 that doesn't work too well. Due to the confusion of the internal inode size, and the VFS inode i_size it zeroes data that it shouldn't. But full blown truncate seems like overkill here. We only instanciate delayed allocations in the write path, and given that we never released the iolock we can't have converted them to real allocations yet either. The only nasty case is pre-existing preallocation which we need to skip. We already do this for page discard during writeback, so make the delayed allocation block punching a generic function and call it from the failed write path as well as xfs_aops_discard_page. The callers are responsible for ensuring that partial blocks are not truncated away, and that they hold the ilock. Based on a fix originally from Christoph Hellwig. This version used filesystem blocks as the range unit. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig ----------------------------------------------------------------------- Summary of changes: fs/xfs/linux-2.6/xfs_aops.c | 94 ++++++++++++++++++------------------------ fs/xfs/linux-2.6/xfs_buf.c | 35 +++++++--------- fs/xfs/xfs_bmap.c | 85 ++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_bmap.h | 5 ++ fs/xfs/xfs_dfrag.c | 13 ++++++ fs/xfs/xfs_error.c | 3 + fs/xfs/xfs_error.h | 5 +- fs/xfs/xfs_inode_item.c | 31 +++++++++++--- 8 files changed, 188 insertions(+), 83 deletions(-) hooks/post-receive -- XFS development tree From aelder@sgi.com Wed Dec 1 16:04:29 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1M4T16236283 for ; Wed, 1 Dec 2010 16:04:29 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4D2F3AC006; Wed, 1 Dec 2010 14:06:10 -0800 (PST) Received: from [127.0.0.1] ([198.149.20.12]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 1 Dec 2010 16:05:59 -0600 Subject: Re: [XFS updates] XFS development tree branch, master, updated. v2.6.36-rc8-11223-gc76febe From: Alex Elder Reply-To: aelder@sgi.com To: xfs@oss.sgi.com Cc: Dave Chinner In-Reply-To: <201012012054.oB1Ks0NA233500@oss.sgi.com> References: <201012012054.oB1Ks0NA233500@oss.sgi.com> Content-Type: text/plain; charset="UTF-8" Date: Wed, 01 Dec 2010 16:05:58 -0600 Message-ID: <1291241158.2556.54.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 01 Dec 2010 22:05:59.0494 (UTC) FILETIME=[EF8DDE60:01CB91A3] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 2010-12-01 at 14:54 -0600, xfs@oss.sgi.com wrote: > This is an automated email from the git hooks/post-receive script. It was > generated because a ref change was pushed to the repository containing > the project "XFS development tree". > > The branch, master has been updated > c76febe xfs: only run xfs_error_test if error injection is active > de25c18 xfs: avoid moving stale inodes in the AIL > 309c848 xfs: delayed alloc blocks beyond EOF are valid after writeback > 90810b9 xfs: push stale, pinned buffers on trylock failures > c726de4 xfs: fix failed write truncation handling. > from ece413f59f257682de4a2e2e42af33b016af53f3 (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. . . . I have updated the XFS master branch to be based on 6.2.37-rc4. The only commits that were rebased were those I just took in from Dave Chinner's xfsdev tree, so unless you have work based on that branch you should not need to do anything special to update your local repository. -Alex From BATV+3217d6c06e4d83826047+2656+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 1 16:05:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1M5RAC236334 for ; Wed, 1 Dec 2010 16:05:29 -0600 X-ASG-Debug-ID: 1291241231-3479026e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A9F824F05FE for ; Wed, 1 Dec 2010 14:07:11 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id UinowJwox2Ql2NWa for ; Wed, 01 Dec 2010 14:07:11 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PNupS-0007mj-2r for xfs@oss.sgi.com; Wed, 01 Dec 2010 22:07:10 +0000 Message-Id: <20101201220710.042656730@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Wed, 01 Dec 2010 17:06:21 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/4] xfs: remove leftovers of old buffer log items in recovery code Subject: [PATCH 1/4] xfs: remove leftovers of old buffer log items in recovery code References: <20101201220620.340188389@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-remove-blf_type-switches X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291241231 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean XFS used to support different types of buffer log items long time ago. Remove the switch statements checking the log item type in various buffer recovery helpers that were left over from those days and the rather useless xlog_recover_do_buffer_pass2 wrapper. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_log_recover.c =================================================================== --- xfs.orig/fs/xfs/xfs_log_recover.c 2010-11-29 15:06:43.921010269 +0100 +++ xfs/fs/xfs/xfs_log_recover.c 2010-11-29 16:33:20.495004054 +0100 @@ -1614,22 +1614,13 @@ xlog_recover_do_buffer_pass1( xfs_buf_cancel_t *nextp; xfs_buf_cancel_t *prevp; xfs_buf_cancel_t **bucket; - xfs_daddr_t blkno = 0; - uint len = 0; - ushort flags = 0; - - switch (buf_f->blf_type) { - case XFS_LI_BUF: - blkno = buf_f->blf_blkno; - len = buf_f->blf_len; - flags = buf_f->blf_flags; - break; - } + xfs_daddr_t blkno = buf_f->blf_blkno; + uint len = buf_f->blf_len; /* * If this isn't a cancel buffer item, then just return. */ - if (!(flags & XFS_BLF_CANCEL)) { + if (!(buf_f->blf_flags & XFS_BLF_CANCEL)) { trace_xfs_log_recover_buf_not_cancel(log, buf_f); return; } @@ -1767,77 +1758,38 @@ xlog_check_buffer_cancelled( return 0; } -STATIC int -xlog_recover_do_buffer_pass2( - xlog_t *log, - xfs_buf_log_format_t *buf_f) -{ - xfs_daddr_t blkno = 0; - ushort flags = 0; - uint len = 0; - - switch (buf_f->blf_type) { - case XFS_LI_BUF: - blkno = buf_f->blf_blkno; - flags = buf_f->blf_flags; - len = buf_f->blf_len; - break; - } - - return xlog_check_buffer_cancelled(log, blkno, len, flags); -} - /* - * Perform recovery for a buffer full of inodes. In these buffers, - * the only data which should be recovered is that which corresponds - * to the di_next_unlinked pointers in the on disk inode structures. - * The rest of the data for the inodes is always logged through the - * inodes themselves rather than the inode buffer and is recovered - * in xlog_recover_do_inode_trans(). + * Perform recovery for a buffer full of inodes. In these buffers, the only + * data which should be recovered is that which corresponds to the + * di_next_unlinked pointers in the on disk inode structures. The rest of the + * data for the inodes is always logged through the inodes themselves rather + * than the inode buffer and is recovered in xlog_recover_inode_pass2(). * - * The only time when buffers full of inodes are fully recovered is - * when the buffer is full of newly allocated inodes. In this case - * the buffer will not be marked as an inode buffer and so will be - * sent to xlog_recover_do_reg_buffer() below during recovery. + * The only time when buffers full of inodes are fully recovered is when the + * buffer is full of newly allocated inodes. In this case the buffer will + * not be marked as an inode buffer and so will be sent to + * xlog_recover_do_reg_buffer() below during recovery. */ STATIC int xlog_recover_do_inode_buffer( - xfs_mount_t *mp, + struct xfs_mount *mp, xlog_recover_item_t *item, - xfs_buf_t *bp, + struct xfs_buf *bp, xfs_buf_log_format_t *buf_f) { int i; - int item_index; - int bit; - int nbits; - int reg_buf_offset; - int reg_buf_bytes; + int item_index = 0; + int bit = 0; + int nbits = 0; + int reg_buf_offset = 0; + int reg_buf_bytes = 0; int next_unlinked_offset; int inodes_per_buf; xfs_agino_t *logged_nextp; xfs_agino_t *buffer_nextp; - unsigned int *data_map = NULL; - unsigned int map_size = 0; trace_xfs_log_recover_buf_inode_buf(mp->m_log, buf_f); - switch (buf_f->blf_type) { - case XFS_LI_BUF: - data_map = buf_f->blf_data_map; - map_size = buf_f->blf_map_size; - break; - } - /* - * Set the variables corresponding to the current region to - * 0 so that we'll initialize them on the first pass through - * the loop. - */ - reg_buf_offset = 0; - reg_buf_bytes = 0; - bit = 0; - nbits = 0; - item_index = 0; inodes_per_buf = XFS_BUF_COUNT(bp) >> mp->m_sb.sb_inodelog; for (i = 0; i < inodes_per_buf; i++) { next_unlinked_offset = (i * mp->m_sb.sb_inodesize) + @@ -1852,18 +1804,18 @@ xlog_recover_do_inode_buffer( * the current di_next_unlinked field. */ bit += nbits; - bit = xfs_next_bit(data_map, map_size, bit); + bit = xfs_next_bit(buf_f->blf_data_map, + buf_f->blf_map_size, bit); /* * If there are no more logged regions in the * buffer, then we're done. */ - if (bit == -1) { + if (bit == -1) return 0; - } - nbits = xfs_contig_bits(data_map, map_size, - bit); + nbits = xfs_contig_bits(buf_f->blf_data_map, + buf_f->blf_map_size, bit); ASSERT(nbits > 0); reg_buf_offset = bit << XFS_BLF_SHIFT; reg_buf_bytes = nbits << XFS_BLF_SHIFT; @@ -1875,9 +1827,8 @@ xlog_recover_do_inode_buffer( * di_next_unlinked field, then move on to the next * di_next_unlinked field. */ - if (next_unlinked_offset < reg_buf_offset) { + if (next_unlinked_offset < reg_buf_offset) continue; - } ASSERT(item->ri_buf[item_index].i_addr != NULL); ASSERT((item->ri_buf[item_index].i_len % XFS_BLF_CHUNK) == 0); @@ -1913,36 +1864,29 @@ xlog_recover_do_inode_buffer( * given buffer. The bitmap in the buf log format structure indicates * where to place the logged data. */ -/*ARGSUSED*/ STATIC void xlog_recover_do_reg_buffer( struct xfs_mount *mp, xlog_recover_item_t *item, - xfs_buf_t *bp, + struct xfs_buf *bp, xfs_buf_log_format_t *buf_f) { int i; int bit; int nbits; - unsigned int *data_map = NULL; - unsigned int map_size = 0; int error; trace_xfs_log_recover_buf_reg_buf(mp->m_log, buf_f); - switch (buf_f->blf_type) { - case XFS_LI_BUF: - data_map = buf_f->blf_data_map; - map_size = buf_f->blf_map_size; - break; - } bit = 0; i = 1; /* 0 is the buf format structure */ while (1) { - bit = xfs_next_bit(data_map, map_size, bit); + bit = xfs_next_bit(buf_f->blf_data_map, + buf_f->blf_map_size, bit); if (bit == -1) break; - nbits = xfs_contig_bits(data_map, map_size, bit); + nbits = xfs_contig_bits(buf_f->blf_data_map, + buf_f->blf_map_size, bit); ASSERT(nbits > 0); ASSERT(item->ri_buf[i].i_addr != NULL); ASSERT(item->ri_buf[i].i_len % XFS_BLF_CHUNK == 0); @@ -2182,13 +2126,9 @@ xlog_recover_do_buffer_trans( int pass) { xfs_buf_log_format_t *buf_f = item->ri_buf[0].i_addr; - xfs_mount_t *mp; + xfs_mount_t *mp = log->l_mp; xfs_buf_t *bp; int error; - int cancel; - xfs_daddr_t blkno; - int len; - ushort flags; uint buf_flags; if (pass == XLOG_RECOVER_PASS1) { @@ -2206,47 +2146,32 @@ xlog_recover_do_buffer_trans( * we call here will tell us whether or not to * continue with the replay of this buffer. */ - cancel = xlog_recover_do_buffer_pass2(log, buf_f); - if (cancel) { + if (xlog_check_buffer_cancelled(log, buf_f->blf_blkno, + buf_f->blf_len, buf_f->blf_flags)) { trace_xfs_log_recover_buf_cancel(log, buf_f); return 0; } } trace_xfs_log_recover_buf_recover(log, buf_f); - switch (buf_f->blf_type) { - case XFS_LI_BUF: - blkno = buf_f->blf_blkno; - len = buf_f->blf_len; - flags = buf_f->blf_flags; - break; - default: - xfs_fs_cmn_err(CE_ALERT, log->l_mp, - "xfs_log_recover: unknown buffer type 0x%x, logdev %s", - buf_f->blf_type, log->l_mp->m_logname ? - log->l_mp->m_logname : "internal"); - XFS_ERROR_REPORT("xlog_recover_do_buffer_trans", - XFS_ERRLEVEL_LOW, log->l_mp); - return XFS_ERROR(EFSCORRUPTED); - } - mp = log->l_mp; buf_flags = XBF_LOCK; - if (!(flags & XFS_BLF_INODE_BUF)) + if (!(buf_f->blf_flags & XFS_BLF_INODE_BUF)) buf_flags |= XBF_MAPPED; - bp = xfs_buf_read(mp->m_ddev_targp, blkno, len, buf_flags); + bp = xfs_buf_read(mp->m_ddev_targp, buf_f->blf_blkno, buf_f->blf_len, + buf_flags); if (XFS_BUF_ISERROR(bp)) { - xfs_ioerror_alert("xlog_recover_do..(read#1)", log->l_mp, - bp, blkno); + xfs_ioerror_alert("xlog_recover_do..(read#1)", mp, + bp, buf_f->blf_blkno); error = XFS_BUF_GETERROR(bp); xfs_buf_relse(bp); return error; } error = 0; - if (flags & XFS_BLF_INODE_BUF) { + if (buf_f->blf_flags & XFS_BLF_INODE_BUF) { error = xlog_recover_do_inode_buffer(mp, item, bp, buf_f); - } else if (flags & + } else if (buf_f->blf_flags & (XFS_BLF_UDQUOT_BUF|XFS_BLF_PDQUOT_BUF|XFS_BLF_GDQUOT_BUF)) { xlog_recover_do_dquot_buffer(mp, log, item, bp, buf_f); } else { From BATV+3217d6c06e4d83826047+2656+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 1 16:05:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1M5Su1236341 for ; Wed, 1 Dec 2010 16:05:30 -0600 X-ASG-Debug-ID: 1291241232-4a1903160000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6C7E91609CBA for ; Wed, 1 Dec 2010 14:07:12 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id MJc2InuiI1XHceIf for ; Wed, 01 Dec 2010 14:07:12 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PNupS-0007nl-GC for xfs@oss.sgi.com; Wed, 01 Dec 2010 22:07:10 +0000 Message-Id: <20101201220710.454838485@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Wed, 01 Dec 2010 17:06:23 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 3/4] xfs: refactor xlog_recover_commit_trans Subject: [PATCH 3/4] xfs: refactor xlog_recover_commit_trans References: <20101201220620.340188389@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-cleanup-xlog_recover_commit_trans X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291241232 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Merge the call to xlog_recover_reorder_trans and the loop over the recovery items from xlog_recover_do_trans into xlog_recover_commit_trans, and keep the switch statement over the log item types as a separate helper. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_log_recover.c =================================================================== --- xfs.orig/fs/xfs/xfs_log_recover.c 2010-11-29 15:15:58.174005517 +0100 +++ xfs/fs/xfs/xfs_log_recover.c 2010-11-29 15:27:26.298253879 +0100 @@ -2674,71 +2674,13 @@ xlog_recover_do_efd_trans( } /* - * Perform the transaction - * - * If the transaction modifies a buffer or inode, do it now. Otherwise, - * EFIs and EFDs get queued up by adding entries into the AIL for them. - */ -STATIC int -xlog_recover_do_trans( - xlog_t *log, - xlog_recover_t *trans, - int pass) -{ - int error = 0; - xlog_recover_item_t *item; - - error = xlog_recover_reorder_trans(log, trans, pass); - if (error) - return error; - - list_for_each_entry(item, &trans->r_itemq, ri_list) { - trace_xfs_log_recover_item_recover(log, trans, item, pass); - switch (ITEM_TYPE(item)) { - case XFS_LI_BUF: - error = xlog_recover_do_buffer_trans(log, item, pass); - break; - case XFS_LI_INODE: - error = xlog_recover_do_inode_trans(log, item, pass); - break; - case XFS_LI_EFI: - error = xlog_recover_do_efi_trans(log, item, - trans->r_lsn, pass); - break; - case XFS_LI_EFD: - xlog_recover_do_efd_trans(log, item, pass); - error = 0; - break; - case XFS_LI_DQUOT: - error = xlog_recover_do_dquot_trans(log, item, pass); - break; - case XFS_LI_QUOTAOFF: - error = xlog_recover_do_quotaoff_trans(log, item, - pass); - break; - default: - xlog_warn( - "XFS: invalid item type (%d) xlog_recover_do_trans", ITEM_TYPE(item)); - ASSERT(0); - error = XFS_ERROR(EIO); - break; - } - - if (error) - return error; - } - - return 0; -} - -/* * Free up any resources allocated by the transaction * * Remember that EFIs, EFDs, and IUNLINKs are handled later. */ STATIC void xlog_recover_free_trans( - xlog_recover_t *trans) + struct xlog_recover *trans) { xlog_recover_item_t *item, *n; int i; @@ -2757,17 +2699,65 @@ xlog_recover_free_trans( } STATIC int +xlog_recover_commit_item( + struct log *log, + struct xlog_recover *trans, + xlog_recover_item_t *item, + int pass) +{ + trace_xfs_log_recover_item_recover(log, trans, item, pass); + + switch (ITEM_TYPE(item)) { + case XFS_LI_BUF: + return xlog_recover_do_buffer_trans(log, item, pass); + break; + case XFS_LI_INODE: + return xlog_recover_do_inode_trans(log, item, pass); + case XFS_LI_EFI: + return xlog_recover_do_efi_trans(log, item, trans->r_lsn, pass); + case XFS_LI_EFD: + xlog_recover_do_efd_trans(log, item, pass); + return 0; + case XFS_LI_DQUOT: + return xlog_recover_do_dquot_trans(log, item, pass); + case XFS_LI_QUOTAOFF: + return xlog_recover_do_quotaoff_trans(log, item, pass); + default: + xlog_warn( + "XFS: invalid item type (%d) xlog_recover_do_trans", ITEM_TYPE(item)); + ASSERT(0); + return XFS_ERROR(EIO); + } +} + +/* + * Perform the transaction. + * + * If the transaction modifies a buffer or inode, do it now. Otherwise, + * EFIs and EFDs get queued up by adding entries into the AIL for them. + */ +STATIC int xlog_recover_commit_trans( - xlog_t *log, - xlog_recover_t *trans, + struct log *log, + struct xlog_recover *trans, int pass) { - int error; + int error = 0; + xlog_recover_item_t *item; hlist_del(&trans->r_list); - if ((error = xlog_recover_do_trans(log, trans, pass))) + + error = xlog_recover_reorder_trans(log, trans, pass); + if (error) return error; - xlog_recover_free_trans(trans); /* no error */ + + list_for_each_entry(item, &trans->r_itemq, ri_list) { + error = xlog_recover_commit_item(log, trans, item, pass); + if (error) + return error; + } + + xlog_recover_free_trans(trans); return 0; } From BATV+3217d6c06e4d83826047+2656+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 1 16:05:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_65, J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1M5SwK236339 for ; Wed, 1 Dec 2010 16:05:30 -0600 X-ASG-Debug-ID: 1291241230-734701b40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E14C91609CBA for ; Wed, 1 Dec 2010 14:07:11 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id HARdAZMiDfS4nfQr for ; Wed, 01 Dec 2010 14:07:11 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PNupS-0007nF-9h for xfs@oss.sgi.com; Wed, 01 Dec 2010 22:07:10 +0000 Message-Id: <20101201220710.254521341@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Wed, 01 Dec 2010 17:06:22 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/4] xfs: use struct list_head for the buf cancel table Subject: [PATCH 2/4] xfs: use struct list_head for the buf cancel table References: <20101201220620.340188389@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-buf-cancel-list_head X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291241231 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_buf_item.h =================================================================== --- xfs.orig/fs/xfs/xfs_buf_item.h 2010-11-29 16:33:20.473005032 +0100 +++ xfs/fs/xfs/xfs_buf_item.h 2010-11-29 17:26:52.384003914 +0100 @@ -105,17 +105,6 @@ typedef struct xfs_buf_log_item { xfs_buf_log_format_t bli_format; /* in-log header */ } xfs_buf_log_item_t; -/* - * This structure is used during recovery to record the buf log - * items which have been canceled and should not be replayed. - */ -typedef struct xfs_buf_cancel { - xfs_daddr_t bc_blkno; - uint bc_len; - int bc_refcount; - struct xfs_buf_cancel *bc_next; -} xfs_buf_cancel_t; - void xfs_buf_item_init(struct xfs_buf *, struct xfs_mount *); void xfs_buf_item_relse(struct xfs_buf *); void xfs_buf_item_log(xfs_buf_log_item_t *, uint, uint); Index: xfs/fs/xfs/xfs_log_priv.h =================================================================== --- xfs.orig/fs/xfs/xfs_log_priv.h 2010-11-29 16:33:20.486010899 +0100 +++ xfs/fs/xfs/xfs_log_priv.h 2010-11-29 17:26:52.385003145 +0100 @@ -21,7 +21,6 @@ struct xfs_buf; struct log; struct xlog_ticket; -struct xfs_buf_cancel; struct xfs_mount; /* @@ -491,7 +490,7 @@ typedef struct log { struct xfs_buftarg *l_targ; /* buftarg of log */ uint l_flags; uint l_quotaoffs_flag; /* XFS_DQ_*, for QUOTAOFFs */ - struct xfs_buf_cancel **l_buf_cancel_table; + struct list_head *l_buf_cancel_table; int l_iclog_hsize; /* size of iclog header */ int l_iclog_heads; /* # of iclog header sectors */ uint l_sectBBsize; /* sector size in BBs (2^n) */ @@ -534,6 +533,9 @@ typedef struct log { } xlog_t; +#define XLOG_BUF_CANCEL_BUCKET(log, blkno) \ + ((log)->l_buf_cancel_table + ((__uint64_t)blkno % XLOG_BC_TABLE_SIZE)) + #define XLOG_FORCED_SHUTDOWN(log) ((log)->l_flags & XLOG_IO_ERROR) /* common routines */ Index: xfs/fs/xfs/xfs_log_recover.c =================================================================== --- xfs.orig/fs/xfs/xfs_log_recover.c 2010-11-29 16:33:20.495004054 +0100 +++ xfs/fs/xfs/xfs_log_recover.c 2010-11-29 17:31:12.135004894 +0100 @@ -53,6 +53,17 @@ STATIC void xlog_recover_check_summary(x #endif /* + * This structure is used during recovery to record the buf log items which + * have been canceled and should not be replayed. + */ +struct xfs_buf_cancel { + xfs_daddr_t bc_blkno; + uint bc_len; + int bc_refcount; + struct list_head bc_list; +}; + +/* * Sector aligned buffer routines for buffer create/read/write/access */ @@ -1607,15 +1618,11 @@ xlog_recover_reorder_trans( */ STATIC void xlog_recover_do_buffer_pass1( - xlog_t *log, + struct log *log, xfs_buf_log_format_t *buf_f) { - xfs_buf_cancel_t *bcp; - xfs_buf_cancel_t *nextp; - xfs_buf_cancel_t *prevp; - xfs_buf_cancel_t **bucket; - xfs_daddr_t blkno = buf_f->blf_blkno; - uint len = buf_f->blf_len; + struct list_head *bucket; + struct xfs_buf_cancel *bcp; /* * If this isn't a cancel buffer item, then just return. @@ -1626,51 +1633,25 @@ xlog_recover_do_buffer_pass1( } /* - * Insert an xfs_buf_cancel record into the hash table of - * them. If there is already an identical record, bump - * its reference count. - */ - bucket = &log->l_buf_cancel_table[(__uint64_t)blkno % - XLOG_BC_TABLE_SIZE]; - /* - * If the hash bucket is empty then just insert a new record into - * the bucket. - */ - if (*bucket == NULL) { - bcp = (xfs_buf_cancel_t *)kmem_alloc(sizeof(xfs_buf_cancel_t), - KM_SLEEP); - bcp->bc_blkno = blkno; - bcp->bc_len = len; - bcp->bc_refcount = 1; - bcp->bc_next = NULL; - *bucket = bcp; - return; - } - - /* - * The hash bucket is not empty, so search for duplicates of our - * record. If we find one them just bump its refcount. If not - * then add us at the end of the list. - */ - prevp = NULL; - nextp = *bucket; - while (nextp != NULL) { - if (nextp->bc_blkno == blkno && nextp->bc_len == len) { - nextp->bc_refcount++; + * Insert an xfs_buf_cancel record into the hash table of them. + * If there is already an identical record, bump its reference count. + */ + bucket = XLOG_BUF_CANCEL_BUCKET(log, buf_f->blf_blkno); + list_for_each_entry(bcp, bucket, bc_list) { + if (bcp->bc_blkno == buf_f->blf_blkno && + bcp->bc_len == buf_f->blf_len) { + bcp->bc_refcount++; trace_xfs_log_recover_buf_cancel_ref_inc(log, buf_f); return; } - prevp = nextp; - nextp = nextp->bc_next; } - ASSERT(prevp != NULL); - bcp = (xfs_buf_cancel_t *)kmem_alloc(sizeof(xfs_buf_cancel_t), - KM_SLEEP); - bcp->bc_blkno = blkno; - bcp->bc_len = len; + + bcp = kmem_alloc(sizeof(struct xfs_buf_cancel), KM_SLEEP); + bcp->bc_blkno = buf_f->blf_blkno; + bcp->bc_len = buf_f->blf_len; bcp->bc_refcount = 1; - bcp->bc_next = NULL; - prevp->bc_next = bcp; + list_add_tail(&bcp->bc_list, bucket); + trace_xfs_log_recover_buf_cancel_add(log, buf_f); } @@ -1689,14 +1670,13 @@ xlog_recover_do_buffer_pass1( */ STATIC int xlog_check_buffer_cancelled( - xlog_t *log, + struct log *log, xfs_daddr_t blkno, uint len, ushort flags) { - xfs_buf_cancel_t *bcp; - xfs_buf_cancel_t *prevp; - xfs_buf_cancel_t **bucket; + struct list_head *bucket; + struct xfs_buf_cancel *bcp; if (log->l_buf_cancel_table == NULL) { /* @@ -1707,55 +1687,36 @@ xlog_check_buffer_cancelled( return 0; } - bucket = &log->l_buf_cancel_table[(__uint64_t)blkno % - XLOG_BC_TABLE_SIZE]; - bcp = *bucket; - if (bcp == NULL) { - /* - * There is no corresponding entry in the table built - * in pass one, so this buffer has not been cancelled. - */ - ASSERT(!(flags & XFS_BLF_CANCEL)); - return 0; - } - /* - * Search for an entry in the buffer cancel table that - * matches our buffer. + * Search for an entry in the cancel table that matches our buffer. */ - prevp = NULL; - while (bcp != NULL) { - if (bcp->bc_blkno == blkno && bcp->bc_len == len) { - /* - * We've go a match, so return 1 so that the - * recovery of this buffer is cancelled. - * If this buffer is actually a buffer cancel - * log item, then decrement the refcount on the - * one in the table and remove it if this is the - * last reference. - */ - if (flags & XFS_BLF_CANCEL) { - bcp->bc_refcount--; - if (bcp->bc_refcount == 0) { - if (prevp == NULL) { - *bucket = bcp->bc_next; - } else { - prevp->bc_next = bcp->bc_next; - } - kmem_free(bcp); - } - } - return 1; - } - prevp = bcp; - bcp = bcp->bc_next; + bucket = XLOG_BUF_CANCEL_BUCKET(log, blkno); + list_for_each_entry(bcp, bucket, bc_list) { + if (bcp->bc_blkno == blkno && bcp->bc_len == len) + goto found; } + /* - * We didn't find a corresponding entry in the table, so - * return 0 so that the buffer is NOT cancelled. + * We didn't find a corresponding entry in the table, so return 0 so + * that the buffer is NOT cancelled. */ ASSERT(!(flags & XFS_BLF_CANCEL)); return 0; + +found: + /* + * We've go a match, so return 1 so that the recovery of this buffer + * is cancelled. If this buffer is actually a buffer cancel log + * item, then decrement the refcount on the one in the table and + * remove it if this is the last reference. + */ + if (flags & XFS_BLF_CANCEL) { + if (--bcp->bc_refcount == 0) { + list_del(&bcp->bc_list); + kmem_free(bcp); + } + } + return 1; } /* @@ -3649,7 +3610,7 @@ xlog_do_log_recovery( xfs_daddr_t head_blk, xfs_daddr_t tail_blk) { - int error; + int error, i; ASSERT(head_blk != tail_blk); @@ -3657,10 +3618,12 @@ xlog_do_log_recovery( * First do a pass to find all of the cancelled buf log items. * Store them in the buf_cancel_table for use in the second pass. */ - log->l_buf_cancel_table = - (xfs_buf_cancel_t **)kmem_zalloc(XLOG_BC_TABLE_SIZE * - sizeof(xfs_buf_cancel_t*), + log->l_buf_cancel_table = kmem_zalloc(XLOG_BC_TABLE_SIZE * + sizeof(struct list_head), KM_SLEEP); + for (i = 0; i < XLOG_BC_TABLE_SIZE; i++) + INIT_LIST_HEAD(&log->l_buf_cancel_table[i]); + error = xlog_do_recovery_pass(log, head_blk, tail_blk, XLOG_RECOVER_PASS1); if (error != 0) { @@ -3679,7 +3642,7 @@ xlog_do_log_recovery( int i; for (i = 0; i < XLOG_BC_TABLE_SIZE; i++) - ASSERT(log->l_buf_cancel_table[i] == NULL); + ASSERT(list_empty(&log->l_buf_cancel_table[i])); } #endif /* DEBUG */ From BATV+3217d6c06e4d83826047+2656+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 1 16:05:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1M5STQ236342 for ; Wed, 1 Dec 2010 16:05:30 -0600 X-ASG-Debug-ID: 1291241232-734301db0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6C97F1609CBE for ; Wed, 1 Dec 2010 14:07:12 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 3do7UuMchneZVKLZ for ; Wed, 01 Dec 2010 14:07:12 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PNupR-0007m9-SE for xfs@oss.sgi.com; Wed, 01 Dec 2010 22:07:09 +0000 Message-Id: <20101201220620.340188389@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Wed, 01 Dec 2010 17:06:20 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/4] log recovery cleanups Subject: [PATCH 0/4] log recovery cleanups X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291241232 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean A couple of cleanups for the log recovery code that I stumbled upon when researching some improvements for the CRC cleanup. From BATV+3217d6c06e4d83826047+2656+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 1 16:05:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66, LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB1M5RQt236332 for ; Wed, 1 Dec 2010 16:05:30 -0600 X-ASG-Debug-ID: 1291241230-3482028f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5ADB44F05FE for ; Wed, 1 Dec 2010 14:07:11 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 2bOMalUQXXzbFOuE for ; Wed, 01 Dec 2010 14:07:11 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PNupS-0007oH-MP for xfs@oss.sgi.com; Wed, 01 Dec 2010 22:07:10 +0000 Message-Id: <20101201220710.647499265@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Wed, 01 Dec 2010 17:06:24 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 4/4] xfs: untangle phase1 vs phase2 recovery helpers Subject: [PATCH 4/4] xfs: untangle phase1 vs phase2 recovery helpers References: <20101201220620.340188389@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-split-log-recovery-passes X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291241231 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dispatch to a different helper for phase1 vs phase2 in xlog_recover_commit_trans instead of doing it in all the low-level functions. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_log_recover.c =================================================================== --- xfs.orig/fs/xfs/xfs_log_recover.c 2010-12-01 17:03:04.922253529 +0100 +++ xfs/fs/xfs/xfs_log_recover.c 2010-12-01 17:12:29.318255483 +0100 @@ -1616,11 +1616,12 @@ xlog_recover_reorder_trans( * record in the table to tell us how many times we expect to see this * record during the second pass. */ -STATIC void -xlog_recover_do_buffer_pass1( +STATIC int +xlog_recover_buffer_pass1( struct log *log, - xfs_buf_log_format_t *buf_f) + xlog_recover_item_t *item) { + xfs_buf_log_format_t *buf_f = item->ri_buf[0].i_addr; struct list_head *bucket; struct xfs_buf_cancel *bcp; @@ -1629,7 +1630,7 @@ xlog_recover_do_buffer_pass1( */ if (!(buf_f->blf_flags & XFS_BLF_CANCEL)) { trace_xfs_log_recover_buf_not_cancel(log, buf_f); - return; + return 0; } /* @@ -1642,7 +1643,7 @@ xlog_recover_do_buffer_pass1( bcp->bc_len == buf_f->blf_len) { bcp->bc_refcount++; trace_xfs_log_recover_buf_cancel_ref_inc(log, buf_f); - return; + return 0; } } @@ -1653,6 +1654,7 @@ xlog_recover_do_buffer_pass1( list_add_tail(&bcp->bc_list, bucket); trace_xfs_log_recover_buf_cancel_add(log, buf_f); + return 0; } /* @@ -2081,10 +2083,9 @@ xlog_recover_do_dquot_buffer( * for more details on the implementation of the table of cancel records. */ STATIC int -xlog_recover_do_buffer_trans( +xlog_recover_buffer_pass2( xlog_t *log, - xlog_recover_item_t *item, - int pass) + xlog_recover_item_t *item) { xfs_buf_log_format_t *buf_f = item->ri_buf[0].i_addr; xfs_mount_t *mp = log->l_mp; @@ -2092,27 +2093,16 @@ xlog_recover_do_buffer_trans( int error; uint buf_flags; - if (pass == XLOG_RECOVER_PASS1) { - /* - * In this pass we're only looking for buf items - * with the XFS_BLF_CANCEL bit set. - */ - xlog_recover_do_buffer_pass1(log, buf_f); + /* + * In this pass we only want to recover all the buffers which have + * not been cancelled and are not cancellation buffers themselves. + */ + if (xlog_check_buffer_cancelled(log, buf_f->blf_blkno, + buf_f->blf_len, buf_f->blf_flags)) { + trace_xfs_log_recover_buf_cancel(log, buf_f); return 0; - } else { - /* - * In this pass we want to recover all the buffers - * which have not been cancelled and are not - * cancellation buffers themselves. The routine - * we call here will tell us whether or not to - * continue with the replay of this buffer. - */ - if (xlog_check_buffer_cancelled(log, buf_f->blf_blkno, - buf_f->blf_len, buf_f->blf_flags)) { - trace_xfs_log_recover_buf_cancel(log, buf_f); - return 0; - } } + trace_xfs_log_recover_buf_recover(log, buf_f); buf_flags = XBF_LOCK; @@ -2172,16 +2162,14 @@ xlog_recover_do_buffer_trans( } STATIC int -xlog_recover_do_inode_trans( +xlog_recover_inode_pass2( xlog_t *log, - xlog_recover_item_t *item, - int pass) + xlog_recover_item_t *item) { xfs_inode_log_format_t *in_f; - xfs_mount_t *mp; + xfs_mount_t *mp = log->l_mp; xfs_buf_t *bp; xfs_dinode_t *dip; - xfs_ino_t ino; int len; xfs_caddr_t src; xfs_caddr_t dest; @@ -2191,10 +2179,6 @@ xlog_recover_do_inode_trans( xfs_icdinode_t *dicp; int need_free = 0; - if (pass == XLOG_RECOVER_PASS1) { - return 0; - } - if (item->ri_buf[0].i_len == sizeof(xfs_inode_log_format_t)) { in_f = item->ri_buf[0].i_addr; } else { @@ -2204,8 +2188,6 @@ xlog_recover_do_inode_trans( if (error) goto error; } - ino = in_f->ilf_ino; - mp = log->l_mp; /* * Inode buffers can be freed, look out for it, @@ -2240,8 +2222,8 @@ xlog_recover_do_inode_trans( xfs_buf_relse(bp); xfs_fs_cmn_err(CE_ALERT, mp, "xfs_inode_recover: Bad inode magic number, dino ptr = 0x%p, dino bp = 0x%p, ino = %Ld", - dip, bp, ino); - XFS_ERROR_REPORT("xlog_recover_do_inode_trans(1)", + dip, bp, in_f->ilf_ino); + XFS_ERROR_REPORT("xlog_recover_inode_pass2(1)", XFS_ERRLEVEL_LOW, mp); error = EFSCORRUPTED; goto error; @@ -2251,8 +2233,8 @@ xlog_recover_do_inode_trans( xfs_buf_relse(bp); xfs_fs_cmn_err(CE_ALERT, mp, "xfs_inode_recover: Bad inode log record, rec ptr 0x%p, ino %Ld", - item, ino); - XFS_ERROR_REPORT("xlog_recover_do_inode_trans(2)", + item, in_f->ilf_ino); + XFS_ERROR_REPORT("xlog_recover_inode_pass2(2)", XFS_ERRLEVEL_LOW, mp); error = EFSCORRUPTED; goto error; @@ -2280,12 +2262,12 @@ xlog_recover_do_inode_trans( if (unlikely((dicp->di_mode & S_IFMT) == S_IFREG)) { if ((dicp->di_format != XFS_DINODE_FMT_EXTENTS) && (dicp->di_format != XFS_DINODE_FMT_BTREE)) { - XFS_CORRUPTION_ERROR("xlog_recover_do_inode_trans(3)", + XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(3)", XFS_ERRLEVEL_LOW, mp, dicp); xfs_buf_relse(bp); xfs_fs_cmn_err(CE_ALERT, mp, "xfs_inode_recover: Bad regular inode log record, rec ptr 0x%p, ino ptr = 0x%p, ino bp = 0x%p, ino %Ld", - item, dip, bp, ino); + item, dip, bp, in_f->ilf_ino); error = EFSCORRUPTED; goto error; } @@ -2293,40 +2275,40 @@ xlog_recover_do_inode_trans( if ((dicp->di_format != XFS_DINODE_FMT_EXTENTS) && (dicp->di_format != XFS_DINODE_FMT_BTREE) && (dicp->di_format != XFS_DINODE_FMT_LOCAL)) { - XFS_CORRUPTION_ERROR("xlog_recover_do_inode_trans(4)", + XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(4)", XFS_ERRLEVEL_LOW, mp, dicp); xfs_buf_relse(bp); xfs_fs_cmn_err(CE_ALERT, mp, "xfs_inode_recover: Bad dir inode log record, rec ptr 0x%p, ino ptr = 0x%p, ino bp = 0x%p, ino %Ld", - item, dip, bp, ino); + item, dip, bp, in_f->ilf_ino); error = EFSCORRUPTED; goto error; } } if (unlikely(dicp->di_nextents + dicp->di_anextents > dicp->di_nblocks)){ - XFS_CORRUPTION_ERROR("xlog_recover_do_inode_trans(5)", + XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(5)", XFS_ERRLEVEL_LOW, mp, dicp); xfs_buf_relse(bp); xfs_fs_cmn_err(CE_ALERT, mp, "xfs_inode_recover: Bad inode log record, rec ptr 0x%p, dino ptr 0x%p, dino bp 0x%p, ino %Ld, total extents = %d, nblocks = %Ld", - item, dip, bp, ino, + item, dip, bp, in_f->ilf_ino, dicp->di_nextents + dicp->di_anextents, dicp->di_nblocks); error = EFSCORRUPTED; goto error; } if (unlikely(dicp->di_forkoff > mp->m_sb.sb_inodesize)) { - XFS_CORRUPTION_ERROR("xlog_recover_do_inode_trans(6)", + XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(6)", XFS_ERRLEVEL_LOW, mp, dicp); xfs_buf_relse(bp); xfs_fs_cmn_err(CE_ALERT, mp, "xfs_inode_recover: Bad inode log rec ptr 0x%p, dino ptr 0x%p, dino bp 0x%p, ino %Ld, forkoff 0x%x", - item, dip, bp, ino, dicp->di_forkoff); + item, dip, bp, in_f->ilf_ino, dicp->di_forkoff); error = EFSCORRUPTED; goto error; } if (unlikely(item->ri_buf[1].i_len > sizeof(struct xfs_icdinode))) { - XFS_CORRUPTION_ERROR("xlog_recover_do_inode_trans(7)", + XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(7)", XFS_ERRLEVEL_LOW, mp, dicp); xfs_buf_relse(bp); xfs_fs_cmn_err(CE_ALERT, mp, @@ -2418,7 +2400,7 @@ xlog_recover_do_inode_trans( break; default: - xlog_warn("XFS: xlog_recover_do_inode_trans: Invalid flag"); + xlog_warn("XFS: xlog_recover_inode_pass2: Invalid flag"); ASSERT(0); xfs_buf_relse(bp); error = EIO; @@ -2442,18 +2424,11 @@ error: * of that type. */ STATIC int -xlog_recover_do_quotaoff_trans( +xlog_recover_quotaoff_pass1( xlog_t *log, - xlog_recover_item_t *item, - int pass) + xlog_recover_item_t *item) { - xfs_qoff_logformat_t *qoff_f; - - if (pass == XLOG_RECOVER_PASS2) { - return (0); - } - - qoff_f = item->ri_buf[0].i_addr; + xfs_qoff_logformat_t *qoff_f = item->ri_buf[0].i_addr; ASSERT(qoff_f); /* @@ -2474,22 +2449,17 @@ xlog_recover_do_quotaoff_trans( * Recover a dquot record */ STATIC int -xlog_recover_do_dquot_trans( +xlog_recover_dquot_pass2( xlog_t *log, - xlog_recover_item_t *item, - int pass) + xlog_recover_item_t *item) { - xfs_mount_t *mp; + xfs_mount_t *mp = log->l_mp; xfs_buf_t *bp; struct xfs_disk_dquot *ddq, *recddq; int error; xfs_dq_logformat_t *dq_f; uint type; - if (pass == XLOG_RECOVER_PASS1) { - return 0; - } - mp = log->l_mp; /* * Filesystems are required to send in quota flags at mount time. @@ -2533,7 +2503,7 @@ xlog_recover_do_dquot_trans( if ((error = xfs_qm_dqcheck(recddq, dq_f->qlf_id, 0, XFS_QMOPT_DOWARN, - "xlog_recover_do_dquot_trans (log copy)"))) { + "xlog_recover_dquot_pass2 (log copy)"))) { return XFS_ERROR(EIO); } ASSERT(dq_f->qlf_len == 1); @@ -2556,7 +2526,7 @@ xlog_recover_do_dquot_trans( * minimal initialization then. */ if (xfs_qm_dqcheck(ddq, dq_f->qlf_id, 0, XFS_QMOPT_DOWARN, - "xlog_recover_do_dquot_trans")) { + "xlog_recover_dquot_pass2")) { xfs_buf_relse(bp); return XFS_ERROR(EIO); } @@ -2579,24 +2549,18 @@ xlog_recover_do_dquot_trans( * LSN. */ STATIC int -xlog_recover_do_efi_trans( +xlog_recover_efi_pass2( xlog_t *log, xlog_recover_item_t *item, - xfs_lsn_t lsn, - int pass) + xfs_lsn_t lsn) { int error; - xfs_mount_t *mp; + xfs_mount_t *mp = log->l_mp; xfs_efi_log_item_t *efip; xfs_efi_log_format_t *efi_formatp; - if (pass == XLOG_RECOVER_PASS1) { - return 0; - } - efi_formatp = item->ri_buf[0].i_addr; - mp = log->l_mp; efip = xfs_efi_init(mp, efi_formatp->efi_nextents); if ((error = xfs_efi_copy_format(&(item->ri_buf[0]), &(efip->efi_format)))) { @@ -2623,11 +2587,10 @@ xlog_recover_do_efi_trans( * efd format structure. If we find it, we remove the efi from the * AIL and free it. */ -STATIC void -xlog_recover_do_efd_trans( +STATIC int +xlog_recover_efd_pass2( xlog_t *log, - xlog_recover_item_t *item, - int pass) + xlog_recover_item_t *item) { xfs_efd_log_format_t *efd_formatp; xfs_efi_log_item_t *efip = NULL; @@ -2636,10 +2599,6 @@ xlog_recover_do_efd_trans( struct xfs_ail_cursor cur; struct xfs_ail *ailp = log->l_ailp; - if (pass == XLOG_RECOVER_PASS1) { - return; - } - efd_formatp = item->ri_buf[0].i_addr; ASSERT((item->ri_buf[0].i_len == (sizeof(xfs_efd_log_format_32_t) + ((efd_formatp->efd_nextents - 1) * sizeof(xfs_extent_32_t)))) || @@ -2671,6 +2630,8 @@ xlog_recover_do_efd_trans( } xfs_trans_ail_cursor_done(ailp, &cur); spin_unlock(&ailp->xa_lock); + + return 0; } /* @@ -2699,32 +2660,59 @@ xlog_recover_free_trans( } STATIC int -xlog_recover_commit_item( +xlog_recover_commit_pass1( struct log *log, struct xlog_recover *trans, - xlog_recover_item_t *item, - int pass) + xlog_recover_item_t *item) { - trace_xfs_log_recover_item_recover(log, trans, item, pass); + trace_xfs_log_recover_item_recover(log, trans, item, XLOG_RECOVER_PASS1); switch (ITEM_TYPE(item)) { case XFS_LI_BUF: - return xlog_recover_do_buffer_trans(log, item, pass); - break; + return xlog_recover_buffer_pass1(log, item); + case XFS_LI_QUOTAOFF: + return xlog_recover_quotaoff_pass1(log, item); case XFS_LI_INODE: - return xlog_recover_do_inode_trans(log, item, pass); case XFS_LI_EFI: - return xlog_recover_do_efi_trans(log, item, trans->r_lsn, pass); case XFS_LI_EFD: - xlog_recover_do_efd_trans(log, item, pass); + case XFS_LI_DQUOT: + /* nothing to do in pass 1 */ return 0; + default: + xlog_warn( + "XFS: invalid item type (%d) xlog_recover_commit_pass1", + ITEM_TYPE(item)); + ASSERT(0); + return XFS_ERROR(EIO); + } +} + +STATIC int +xlog_recover_commit_pass2( + struct log *log, + struct xlog_recover *trans, + xlog_recover_item_t *item) +{ + trace_xfs_log_recover_item_recover(log, trans, item, XLOG_RECOVER_PASS2); + + switch (ITEM_TYPE(item)) { + case XFS_LI_BUF: + return xlog_recover_buffer_pass2(log, item); + case XFS_LI_INODE: + return xlog_recover_inode_pass2(log, item); + case XFS_LI_EFI: + return xlog_recover_efi_pass2(log, item, trans->r_lsn); + case XFS_LI_EFD: + return xlog_recover_efd_pass2(log, item); case XFS_LI_DQUOT: - return xlog_recover_do_dquot_trans(log, item, pass); + return xlog_recover_dquot_pass2(log, item); case XFS_LI_QUOTAOFF: - return xlog_recover_do_quotaoff_trans(log, item, pass); + /* nothing to do in pass2 */ + return 0; default: xlog_warn( - "XFS: invalid item type (%d) xlog_recover_do_trans", ITEM_TYPE(item)); + "XFS: invalid item type (%d) xlog_recover_commit_pass2", + ITEM_TYPE(item)); ASSERT(0); return XFS_ERROR(EIO); } @@ -2752,7 +2740,10 @@ xlog_recover_commit_trans( return error; list_for_each_entry(item, &trans->r_itemq, ri_list) { - error = xlog_recover_commit_item(log, trans, item, pass); + if (pass == XLOG_RECOVER_PASS1) + error = xlog_recover_commit_pass1(log, trans, item); + else + error = xlog_recover_commit_pass2(log, trans, item); if (error) return error; } From SRS0+W+pQ+5+fromorbit.com=david@internode.on.net Wed Dec 1 19:27:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB21R305243939 for ; Wed, 1 Dec 2010 19:27:03 -0600 X-ASG-Debug-ID: 1291253324-31bf01b60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4EA8E160AA63 for ; Wed, 1 Dec 2010 17:28:45 -0800 (PST) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id 8bkHc1d6Coebwv3m for ; Wed, 01 Dec 2010 17:28:45 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 36992712-1927428 for multiple; Thu, 02 Dec 2010 11:58:43 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PNxyT-0006D8-Qo; Thu, 02 Dec 2010 12:28:41 +1100 Date: Thu, 2 Dec 2010 12:28:41 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/8] xfs: Pull EFI/EFD handling out from under the AIL lock Subject: Re: [PATCH 1/8] xfs: Pull EFI/EFD handling out from under the AIL lock Message-ID: <20101202012841.GL16922@dastard> References: <1290993152-20999-1-git-send-email-david@fromorbit.com> <1290993152-20999-2-git-send-email-david@fromorbit.com> <20101130201734.GA16079@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101130201734.GA16079@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1291253326 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48216 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Nov 30, 2010 at 03:17:34PM -0500, Christoph Hellwig wrote: > > - xfs_efi_init needs to initialize efi_next_extent using ATOMIC_INIT OK. > - there is a behaviour change about the xfs_trans_del_item call > in xfs_efi_item_unpin - before it was protected by the > XFS_EFI_CANCELED which was never set, and now it's not. XFS_EFI_CANCELED has not been set in the code base since xfs_efi_cancel() was removed back in 2006 by commit 065d312e15902976d256ddaf396a7950ec0350a8 ("[XFS] Remove unused iop_abort log item operation), and even then xfs_efi_cancel() was never called. I haven't tracked it back further than that (beyond git history), but handling of efis in cancelled transactions has been broken for a long time. Basically, when we get an IOP_UNPIN(lip, 1); call from xfs_trans_uncommit() (i.e. remove == 1), if we don't free the log item descriptor we leak it. IOWs, the new behaviour introduced in this patch is actually the correct behaviour. > - what happened to XFS_EFI_RECOVERED? You changed it to be indexed > for the atomic bit-ops, but it's still used non-atomic in the log > recovery code. Ah, I forgot to convert it. > - Why is XFS_EFI_COMMITTED cleared in xlog_recover_do_efi_trans, > where it can't ever be set? It was just a straight transformation. I'll kill it. > - can you please add a shared helper for xfs_efi_item_unpin and > xfs_efi_release, ala: Ok. Will do. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+W+pQ+5+fromorbit.com=david@internode.on.net Wed Dec 1 19:30:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB21UXJj244091 for ; Wed, 1 Dec 2010 19:30:34 -0600 X-ASG-Debug-ID: 1291253535-1d0400b80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A36B81BB270 for ; Wed, 1 Dec 2010 17:32:16 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id BySFDH6YoApFGSYT for ; Wed, 01 Dec 2010 17:32:16 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 48849312-1927428 for multiple; Thu, 02 Dec 2010 12:02:15 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PNy1t-0006DK-Sc; Thu, 02 Dec 2010 12:32:13 +1100 Date: Thu, 2 Dec 2010 12:32:13 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/8] xfs: bulk AIL insertion during transaction commit Subject: Re: [PATCH 3/8] xfs: bulk AIL insertion during transaction commit Message-ID: <20101202013213.GM16922@dastard> References: <1290993152-20999-1-git-send-email-david@fromorbit.com> <1290993152-20999-4-git-send-email-david@fromorbit.com> <20101130224057.GA16143@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101130224057.GA16143@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1291253537 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48217 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Nov 30, 2010 at 05:40:57PM -0500, Christoph Hellwig wrote: > Generally looks good, a few minor comments below: > > > +void > > +xfs_trans_committed_bulk( > > + struct xfs_ail *ailp, > > + struct xfs_log_vec *log_vector, > > + xfs_lsn_t commit_lsn, > > + int aborted) > > +{ > > +#define LGIA_SIZE 32 > > + struct xfs_log_item *lgia[LGIA_SIZE]; > > The lgia name seems a bit to obscure to me. lgia == "log item array" > What about just log_items > as variable name, and LOG_ITEM_BATCH_SIZE or similar for the size? Ok, that's easy to do. > > + spin_lock(&ailp->xa_lock); > > + xfs_trans_ail_update_bulk(ailp, lgia, LGIA_SIZE, > > + commit_lsn); > > + for (i = 0; i < LGIA_SIZE; i++) > > + IOP_UNPIN(lgia[i], 0); > > > + spin_lock(&ailp->xa_lock); > > + xfs_trans_ail_update_bulk(ailp, lgia, i, commit_lsn); > > + for (j = 0; j < i; j++) > > + IOP_UNPIN(lgia[j], 0); > > It might be worth to factor these two little sniplets into a little > helper. I thought about it, but didn't because there was more code in writing a helper. I'll do it anyway... > > > + * Bulk update version of xfs_trans_ail_update. > > That won't be a very useful comment anymore once xfs_trans_ail_update is > implemented as a wrapper around this function.. Yup, but when the wrapper is introduced the comment is updated appropriately. > > > + struct xfs_log_item **lgia, > > Same naming comment here. Will fix. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+jcQm+5+fromorbit.com=david@internode.on.net Wed Dec 1 19:46:56 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB21ktbw244793 for ; Wed, 1 Dec 2010 19:46:55 -0600 X-ASG-Debug-ID: 1291254516-29f102d70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DEB951401FAE for ; Wed, 1 Dec 2010 17:48:37 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id cu1SBKhiqWMQJm7I for ; Wed, 01 Dec 2010 17:48:37 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 47875939-1927428 for multiple; Thu, 02 Dec 2010 12:18:36 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PNyHi-0006FJ-08; Thu, 02 Dec 2010 12:48:34 +1100 Date: Thu, 2 Dec 2010 12:48:33 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 02/14] xfs: clean up log space grant functions Subject: Re: [PATCH 02/14] xfs: clean up log space grant functions Message-ID: <20101202014833.GN16922@dastard> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-3-git-send-email-david@fromorbit.com> <20101201123032.GA20378@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101201123032.GA20378@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1291254518 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48218 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 01, 2010 at 07:30:32AM -0500, Christoph Hellwig wrote: > On Mon, Nov 29, 2010 at 12:38:20PM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > xlog_grant_log_space and xlog_regrant_log_write_space both have very > > similar structure. Both have a "wait on non-empty queue" section at > > the start, followed by a "wait for space" loop of which the contents > > are almost identical to the initial non-empty queue section. > > > > In both cases, the non-empty queue wait can be folded into the wait > > for space loop, simply by entering the loop if the queue is not > > empty and the current ticket is not on the queue. If we trigger the > > non-empty queue case, we always add ourselves to the queue, and > > hence the second and subsequent loops are always driven by the "wait > > for space" test. > > > > IOWs, both wait conditions can be folded into the one loop, removing > > a bunch of duplicated code and making it simpler to modify in > > future patches. > > I don't really like this patch. The new conditions are overly > complicated because of the desire to only go through the loop once > for the queue not empty case. In addition there's some behaviour > changes: > > - in xlog_grant_log_space we previously didn't call xlog_grant_push_ail > for the queue not empty case, and now we do. As you point out, there's no actual harm in doing that. > - in xlog_regrant_write_log_space the old version of the queue not > empty case would loop over all waiting tickets, and if we could > wake up all of them we'll skip the first wait, and given enough > free space also the second wait, while the new code always adds it > to the writeq, although it will still skip the actualy wait later. I didn't think there's any harm in that, either, because we're walking the entire queue anyway and it does not dirty any global shared cachelines we aren't already dirtying by taking the queue lock. > My recommendation would be to skip this patch for now and revisit the > area later. Ugh. That means the following 10 patches need to be reworked. > For example the superflous xlog_grant_push_ail actually > is rather harmless these days with the xfsaild threshold, so not > skipping it for the first case probably is fine in the end. Then again > the whole add to the queue just in case if it's non-empty doesn't make > much sense to me to start with. As soon as xfs_log_move_tail makes > space in the log it wakes up all tickets waiting for it anyway, so > adding us to the queue just in case seems rather inefficient, and not > overl helpful. Ok, so your main objection is the needless addition to the queue? That can be avoided easily enough via a local variable. Would that be sufficient to alleviate your concerns? Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+W+pQ+5+fromorbit.com=david@internode.on.net Wed Dec 1 19:47:48 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB21llGK244843 for ; Wed, 1 Dec 2010 19:47:48 -0600 X-ASG-Debug-ID: 1291254569-334500330000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BA54F1BB301 for ; Wed, 1 Dec 2010 17:49:30 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id cfYJDBJR0PX5fX3A for ; Wed, 01 Dec 2010 17:49:30 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 48851849-1927428 for multiple; Thu, 02 Dec 2010 12:19:29 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PNyIa-0006Fd-2s; Thu, 02 Dec 2010 12:49:28 +1100 Date: Thu, 2 Dec 2010 12:49:28 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 03/14] xfs: convert log grant heads to LSN notation Subject: Re: [PATCH 03/14] xfs: convert log grant heads to LSN notation Message-ID: <20101202014927.GO16922@dastard> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-4-git-send-email-david@fromorbit.com> <20101201124234.GB612@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101201124234.GB612@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1291254571 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48217 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 01, 2010 at 07:42:35AM -0500, Christoph Hellwig wrote: > The patch looks good to me, but I really hate overloading the lsn types > and helpers. Just add duplicated of CYCLE_LSN/BLOCK_LSN and > xlog_assign_lsn for a new type as use them. Ok, will fix. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+tXB3+5+fromorbit.com=david@internode.on.net Wed Dec 1 19:59:54 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB21xrSY245458 for ; Wed, 1 Dec 2010 19:59:53 -0600 X-ASG-Debug-ID: 1291255295-290302990000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 22EF41C85066 for ; Wed, 1 Dec 2010 18:01:35 -0800 (PST) Received: from mail.internode.on.net (bld-mail20.adl6.internode.on.net [150.101.137.105]) by cuda.sgi.com with ESMTP id qNmZFGzcJeGanLPS for ; Wed, 01 Dec 2010 18:01:35 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 3172791-1927428 for multiple; Thu, 02 Dec 2010 12:31:34 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PNyUG-0006GZ-QQ; Thu, 02 Dec 2010 13:01:32 +1100 Date: Thu, 2 Dec 2010 13:01:32 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 03/14] xfs: convert log grant heads to LSN notation Subject: Re: [PATCH 03/14] xfs: convert log grant heads to LSN notation Message-ID: <20101202020132.GP16922@dastard> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-4-git-send-email-david@fromorbit.com> <20101201130504.GA18379@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101201130504.GA18379@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail20.adl6.internode.on.net[150.101.137.105] X-Barracuda-Start-Time: 1291255297 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48219 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 01, 2010 at 08:05:04AM -0500, Christoph Hellwig wrote: > > -STATIC int xlog_space_left(xlog_t *log, int cycle, int bytes); > > +STATIC int xlog_space_left(int logsize, xfs_lsn_t tail_lsn, > > + xfs_lsn_t head); > > Looking further through the series I have to say I really hate > passing in the logsize instead of the log structure. Passing the > log pointer from higher level functions just makes a lot more sense. > > Also in this case passing the tail_lsn explicitly doesn't make any sense > - it becomes atomic later and thus there is no locking requirement for > it. What I wanted to make clear is that the calculation works on fixed values and doesn't sample values internally itself. I guess that's not important for the log size, but for stuff like the tail lsn it avoids needing to sample inside xlog_space_left() before we crack it. i.e. something like this is wrong: cycle = CYCLE_LSN(atomic64_read(&log->l_tail_lsn)); block = BLOCK_LSN(atomic64_read(&log->l_tail_lsn)); and this is correct: tail_lsn = atomic64_read(&log->l_tail_lsn); cycle = CYCLE_LSN(tail_lsn); block = BLOCK_LSN(tail_lsn); So it makes sense to me to have the value of of the tail lsn and other variables that should only be sampled once passed into the function. That avoids misunderstandings further down the track because it is obvious that the calculation works on constant values. Perhaps I should add "const" to the parameter declarations to help make my intentions clear... > > > -xlog_grant_sub_space(struct log *log, int bytes) > > +__xlog_grant_sub_space( > > + xfs_lsn_t *head, > > + int bytes, > > + int logsize) > > Same thing here - the calling convention would be a lot more regular > by still passing the log as first argument. Ok, it's only for the logsize again, but that's not the important part of the calculation... > After the factoring I also think we could cut down on the amount of > wrappers in this area. Just rename __xlog_grant_sub_space and > __xlog_grant_add_space to not have the __ prefix, and kill the wrappers > around it - they only have one or two callers, and just having two > helpers and passing the heads we're interested in is a lot simpler and > cleaner. I thought about that - my first version even did this. I thought it was easier to understand the changes if I didn't change the calling conventions for modifying the grant heads. As such, I'd prefer to make this change to the wrappers in a separate patch. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+W+pQ+5+fromorbit.com=david@internode.on.net Wed Dec 1 20:00:42 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB220gOL245517 for ; Wed, 1 Dec 2010 20:00:42 -0600 X-ASG-Debug-ID: 1291255344-7a5503400000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2D67C1C851E5 for ; Wed, 1 Dec 2010 18:02:24 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id E5oDqiFFROQkHuEk for ; Wed, 01 Dec 2010 18:02:24 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 48853526-1927428 for multiple; Thu, 02 Dec 2010 12:32:23 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PNyUu-0006Gh-Ff; Thu, 02 Dec 2010 13:02:12 +1100 Date: Thu, 2 Dec 2010 13:02:12 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 04/14] xfs: use wait queues directly for log grant queues Subject: Re: [PATCH 04/14] xfs: use wait queues directly for log grant queues Message-ID: <20101202020212.GQ16922@dastard> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-5-git-send-email-david@fromorbit.com> <20101201123454.GA612@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101201123454.GA612@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1291255346 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48219 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 01, 2010 at 07:34:54AM -0500, Christoph Hellwig wrote: > On Mon, Nov 29, 2010 at 12:38:22PM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > The log grant queues are one of the few places left using sv_t > > constructs for waiting. Convert them to use wait queues directly > > while we are cleaning up the code to move one step closer to remove > > the sv_t type from the XFS codebase. > > Doing this one separately from the other sv_t removal seems a bit > pointless. Ok, as you suggest later Iii'll just fold the other sv_t patches into this one. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+fUtr+5+fromorbit.com=david@internode.on.net Wed Dec 1 20:02:57 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB222utm245616 for ; Wed, 1 Dec 2010 20:02:57 -0600 X-ASG-Debug-ID: 1291255478-7a3503430000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B138E1C851FC for ; Wed, 1 Dec 2010 18:04:39 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id 25HjJPQGDmzktmBs for ; Wed, 01 Dec 2010 18:04:39 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 48639325-1927428 for multiple; Thu, 02 Dec 2010 12:34:31 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PNyWn-0006H9-G9; Thu, 02 Dec 2010 13:04:09 +1100 Date: Thu, 2 Dec 2010 13:04:09 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 05/14] xfs: make AIL tail pushing independent of the grant lock Subject: Re: [PATCH 05/14] xfs: make AIL tail pushing independent of the grant lock Message-ID: <20101202020409.GR16922@dastard> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-6-git-send-email-david@fromorbit.com> <20101201124540.GC612@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101201124540.GC612@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1291255480 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48219 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 01, 2010 at 07:45:40AM -0500, Christoph Hellwig wrote: > Once l_tail_lsn and l_last_sync_lsn are converted to atomic64_ts later > in the series passing them in separately becomes pointless again. Maybe > scale the patch back a bit and require the caller to hold l_grant_lock > for now, until the atomic64_t conversion happens. Same reasoning as for the change to xlog_space_left - the values should only be sampled once for correctness, which is why I pass them into the function. more "const" annotations, I guess. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+Ztt8+5+fromorbit.com=david@internode.on.net Wed Dec 1 20:03:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB2231l0245632 for ; Wed, 1 Dec 2010 20:03:01 -0600 X-ASG-Debug-ID: 1291255483-7a4403460000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7471A1C851FE for ; Wed, 1 Dec 2010 18:04:44 -0800 (PST) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id QE2qd7gdZnmAbtmS for ; Wed, 01 Dec 2010 18:04:44 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 48487720-1927428 for multiple; Thu, 02 Dec 2010 12:34:43 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PNyXJ-0006HJ-Me; Thu, 02 Dec 2010 13:04:41 +1100 Date: Thu, 2 Dec 2010 13:04:41 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 08/14] xfs: convert log grant heads to atomic variables Subject: Re: [PATCH 08/14] xfs: convert log grant heads to atomic variables Message-ID: <20101202020441.GS16922@dastard> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-9-git-send-email-david@fromorbit.com> <20101201125920.GF612@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101201125920.GF612@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1291255485 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48219 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 01, 2010 at 07:59:20AM -0500, Christoph Hellwig wrote: > On Mon, Nov 29, 2010 at 12:38:26PM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > Convert the log grant heads to atomic64_t types in preparation for > > converting the accounting algorithms to atomic operations. his patch > > just converts the variables; the algorithmic changes are in a > > separate patch for clarity. > > > > Signed-off-by: Dave Chinner > > --- > > fs/xfs/linux-2.6/xfs_trace.h | 18 +++++++------ > > fs/xfs/xfs_log.c | 54 +++++++++++++++++++++-------------------- > > fs/xfs/xfs_log_priv.h | 4 +- > > fs/xfs/xfs_log_recover.c | 8 +++--- > > 4 files changed, 44 insertions(+), 40 deletions(-) > > > > diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h > > index d2cdc85..68c3bdd 100644 > > --- a/fs/xfs/linux-2.6/xfs_trace.h > > +++ b/fs/xfs/linux-2.6/xfs_trace.h > > @@ -768,8 +768,8 @@ DECLARE_EVENT_CLASS(xfs_loggrant_class, > > __field(unsigned int, flags) > > __field(void *, reserveq) > > __field(void *, writeq) > > - __field(xfs_lsn_t, grant_reserve_lsn) > > - __field(xfs_lsn_t, grant_write_lsn) > > + __field(xfs_lsn_t, grant_reserve_head) > > + __field(xfs_lsn_t, grant_write_head) > > What about just naming them _head from the beginning? That would > be a tad cleaner. Same for the actual variables in the log, even > if they change the type here. Will do. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+W+pQ+5+fromorbit.com=david@internode.on.net Wed Dec 1 20:08:52 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_TICKET autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB228pYl245854 for ; Wed, 1 Dec 2010 20:08:52 -0600 X-ASG-Debug-ID: 1291255833-254701ef0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 697681B9487 for ; Wed, 1 Dec 2010 18:10:34 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id Aye7sVXZM3MCP7qG for ; Wed, 01 Dec 2010 18:10:34 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 48385437-1927428 for multiple; Thu, 02 Dec 2010 12:40:32 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PNycx-0006Ho-A9; Thu, 02 Dec 2010 13:10:31 +1100 Date: Thu, 2 Dec 2010 13:10:31 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 09/14] xfs: introduce new locks for the log grant ticket wait queues Subject: Re: [PATCH 09/14] xfs: introduce new locks for the log grant ticket wait queues Message-ID: <20101202021031.GT16922@dastard> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-10-git-send-email-david@fromorbit.com> <20101201131208.GA22455@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101201131208.GA22455@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1291255835 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48219 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 01, 2010 at 08:12:08AM -0500, Christoph Hellwig wrote: > > + /* co-ordinate with xfs_log_force_shutdown */ > > + if (XLOG_FORCED_SHUTDOWN(log)) { > > + spin_unlock(&log->l_grant_reserve_lock); > > + goto error_return; > > + } > > Where is this coming from? Otherwise the patch looks good to me. To handles the race condition between xfs_log_force_shutdown() clearing all the tickets off the queue and a racing log reserve that had already checked the shutdown flag and was spinning waiting for the reserve lock to add the ticket to the queue. The race condition is documented in xfs_log_force_shutdown()... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+W+pQ+5+fromorbit.com=david@internode.on.net Wed Dec 1 20:09:50 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB229okA245896 for ; Wed, 1 Dec 2010 20:09:50 -0600 X-ASG-Debug-ID: 1291255892-7a3703750000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4566B1C8525D for ; Wed, 1 Dec 2010 18:11:33 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id PXiEW8XjQEDNhbnk for ; Wed, 01 Dec 2010 18:11:33 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 48854960-1927428 for multiple; Thu, 02 Dec 2010 12:41:32 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PNydu-0006Hx-Mo; Thu, 02 Dec 2010 13:11:30 +1100 Date: Thu, 2 Dec 2010 13:11:30 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 10/14] xfs: convert grant head manipulations to lockless algorithm Subject: Re: [PATCH 10/14] xfs: convert grant head manipulations to lockless algorithm Message-ID: <20101202021130.GU16922@dastard> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-11-git-send-email-david@fromorbit.com> <20101201131513.GB22455@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101201131513.GB22455@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1291255894 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0021 1.0000 -2.0070 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.01 X-Barracuda-Spam-Status: No, SCORE=-2.01 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48219 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 01, 2010 at 08:15:13AM -0500, Christoph Hellwig wrote: > On Mon, Nov 29, 2010 at 12:38:28PM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > The only thing that the grant lock remains to protect is the grant head > > manipulations when adding or removing space from the log. These calculations > > are already based on atomic variables, so we can already update them safely > > without locks. However, the grant head manpulations require atomic multi-step > > calculations to be executed, which the algorithms currently don't allow. > > > > To make these multi-step calculations atomic, convert the algorithms to > > compare-and-exchange loops on the atomic variables. That is, we sample the old > > value, perform the calculation and use atomic64_cmpxchg() to attempt to update > > the head with the new value. If the head has not changed since we sampled it, > > it will succeed and we are done. Otherwise, we rerun the calculation again from > > a new sample of the head. > > > > This allows us to remove the grant lock from around all the grant head space > > manipulations, and that effectively removes the grant lock from the log > > completely. > > > > Signed-off-by: Dave Chinner .... > > @@ -3478,11 +3485,18 @@ xlog_verify_dest_ptr( > > xlog_panic("xlog_verify_dest_ptr: invalid ptr"); > > } > > > > +/* > > + * XXX: because we cannot atomically sample both the reserve and write heads, > > + * we cannot verify them reliably as they may be sampled in the middle of > > + * racing modifications. Hence just taking snapshots of the heads can give an > > + * incorrect view of the state of log. Hence just disable this check for now. > > + */ > > STATIC void > > xlog_verify_grant_head( > > I can't see any way to keep this check with the atomic reserve/write > heads, so we might as well remove it entirely. Ok, will do. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+tXB3+5+fromorbit.com=david@internode.on.net Wed Dec 1 20:14:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB22EapY246391 for ; Wed, 1 Dec 2010 20:14:36 -0600 X-ASG-Debug-ID: 1291256177-509401880000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id ABCC7160ADB3 for ; Wed, 1 Dec 2010 18:16:18 -0800 (PST) Received: from mail.internode.on.net (bld-mail20.adl6.internode.on.net [150.101.137.105]) by cuda.sgi.com with ESMTP id DssgHF5xm04GlEHr for ; Wed, 01 Dec 2010 18:16:18 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 3174778-1927428 for multiple; Thu, 02 Dec 2010 12:46:11 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PNyiP-0006IN-JK; Thu, 02 Dec 2010 13:16:09 +1100 Date: Thu, 2 Dec 2010 13:16:09 +1100 From: Dave Chinner To: Amit Sahrawat Cc: Eric Sandeen , xfs@oss.sgi.com, sandeen-xfs@sandeen.net X-ASG-Orig-Subj: Re: XFS file system corruption(Return Bad Transaction) kernel - 2.6.34 Subject: Re: XFS file system corruption(Return Bad Transaction) kernel - 2.6.34 Message-ID: <20101202021609.GV16922@dastard> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail20.adl6.internode.on.net[150.101.137.105] X-Barracuda-Start-Time: 1291256179 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48220 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 01, 2010 at 12:44:58PM +0530, Amit Sahrawat wrote: > Dear Member, > > I am getting following corruption on XFS formatted disk during a simple copy > operation: > sd 9:0:0:0: Attached scsi removable disk sdc > sd 9:0:0:0: Attached scsi generic sg2 type 0 > XFS mounting filesystem sdc2 > Starting XFS recovery on filesystem: sdc2 (logdev: internal) > XFS: xlog_recover_process_data: bad transaction > XFS: log mount/recovery failed: error 5 > XFS: log mount failed > [root@localhost TEGRA]# "TEGRA" - You're running on an ARM device? If so, what kernel are you running? i.e. does it have the VIVT cache aliasing fixes in it? Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+W+pQ+5+fromorbit.com=david@internode.on.net Wed Dec 1 20:19:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB22Ja0P246609 for ; Wed, 1 Dec 2010 20:19:36 -0600 X-ASG-Debug-ID: 1291256478-1cf802aa0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0CD4A1BAC59 for ; Wed, 1 Dec 2010 18:21:18 -0800 (PST) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id rAc5VXRMhTeuidCo for ; Wed, 01 Dec 2010 18:21:18 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 37000957-1927428 for multiple; Thu, 02 Dec 2010 12:51:17 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PNynM-0006JD-81; Thu, 02 Dec 2010 13:21:16 +1100 Date: Thu, 2 Dec 2010 13:21:16 +1100 From: Dave Chinner To: Alex Elder Cc: dchinner@redhat.com, XFS Mailing List X-ASG-Orig-Subj: Re: xfstests 065 failures Subject: Re: xfstests 065 failures Message-ID: <20101202022116.GW16922@dastard> References: <1291235379.2556.28.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1291235379.2556.28.camel@doink> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1291256480 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0015 1.0000 -2.0115 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.01 X-Barracuda-Spam-Status: No, SCORE=-2.01 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48221 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 01, 2010 at 02:29:39PM -0600, Alex Elder wrote: > Dave, you were asking on IRC about test 065 failures. > I asked Bill Kendall about it and he bisected to find > that the commit below seems to be where the problems > started. I believe the problem is that one of the > times is not updated properly when renaming the file > "addedfile4". Here are the commands that might affect > that file in test 065: > > mv addeddir4/addedfile5 addeddir4/addedfile4 > mv addeddir4 addeddir6 > > I glanced at the commit and saw nothing obviously > wrong, but at the moment I can't really dig into > it any deeper so I thought I'd report what Bill > found so others could look. Yeah, I know that this patch was the cause, and IIRC it only affects a hard linked directory. What I found is that the iterative dump actually contains all the correct changes (the restore part of the test does not fail) - it's just that the dump image table of contents does not contain the all the changes. I haven't tracked down why the dump TOC does not contain a modification that is actually in the dump yet.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From amit.sahrawat83@gmail.com Wed Dec 1 21:38:26 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.2 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,J_CHICKENPOX_45,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB23cPjH250034 for ; Wed, 1 Dec 2010 21:38:26 -0600 X-ASG-Debug-ID: 1291261209-57e202630000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-qy0-f174.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 674DB1C8632C for ; Wed, 1 Dec 2010 19:40:09 -0800 (PST) Received: from mail-qy0-f174.google.com (mail-qy0-f174.google.com [209.85.216.174]) by cuda.sgi.com with ESMTP id H01HP3eCEGbY5XD7 for ; Wed, 01 Dec 2010 19:40:09 -0800 (PST) Received: by qyk11 with SMTP id 11so3581544qyk.5 for ; Wed, 01 Dec 2010 19:40:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:cc:content-type; bh=3eN9FK9Or81wtpTdaaWuXhb7tYTYejpWdMFL4SfU184=; b=Ot6PbvfXc/l1zqKbxX+LM5oL7Xgoi7r7KC8FlOG9t9juebnWWbRlUizVSdjiNDr63Y r9Asgaiw6ueQWbG7F7yBxwIXY5SpcXNw1wieA090u/iwUJ6gqzVGa9+pVNkTiYikaq47 15wpf8a5t1rOxdIEaIAQ+4jOvewox+bsYqRc8= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; b=sWeGKdIUHbL+7XcpfPssn87LoXu4l0Mr3n8sY5/8ekITIHKVKY/1hoG9Ghx/DnJgoE c0wQ/UeAYaWn7hq6jEqDKy9dNMovvOMeyoPB2bd1xUdpdasifJtCiqW2kc4TtUfufVKJ FsYOG5Dc837z35Pw8pVMAaCRbUDWthxV1A+/s= MIME-Version: 1.0 Received: by 10.229.227.12 with SMTP id iy12mr8128080qcb.101.1291261208805; Wed, 01 Dec 2010 19:40:08 -0800 (PST) Received: by 10.220.194.3 with HTTP; Wed, 1 Dec 2010 19:40:08 -0800 (PST) In-Reply-To: <4CF661C7.2020103@sandeen.net> References: <4CF661C7.2020103@sandeen.net> Date: Thu, 2 Dec 2010 09:10:08 +0530 Message-ID: X-ASG-Orig-Subj: Re: XFS file system corruption(Return Bad Transaction) kernel - 2.6.34 Subject: Re: XFS file system corruption(Return Bad Transaction) kernel - 2.6.34 From: Amit Sahrawat To: Eric Sandeen Cc: xfs@oss.sgi.com, sandeen-xfs@sandeen.net, david@fromorbit.com Content-Type: multipart/alternative; boundary=00163630f435a9c7700496652d68 X-Barracuda-Connect: mail-qy0-f174.google.com[209.85.216.174] X-Barracuda-Start-Time: 1291261209 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48224 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --00163630f435a9c7700496652d68 Content-Type: text/plain; charset=ISO-8859-1 While the copy operation is in progress, simply unplug the usb device and then replug. The issue can be seen from XFS (2.6.31) onwards, I am trying to figure out the changes between 2.6.30.9 and 2.6.31. One thing I noticed is - there is difference in speed for 2 versions - in case of 2.6.30.9 if I remove the USB within '5' seconds - I can see the file being created at the destination and some data written, while in case of 2.6.31(onwards), it takes around 20 seconds to get some data to disk. I am using MIPS at the moment with VIPT(fixes included) Please let me know if this information is useful. Thanks, Amit Sahrawat On Wed, Dec 1, 2010 at 8:25 PM, Eric Sandeen wrote: > On 12/1/10 1:14 AM, Amit Sahrawat wrote: > > Dear Member, > > > > I am getting following corruption on XFS formatted disk during a simple > copy operation: > > sd 9:0:0:0: Attached scsi removable disk sdc > > sd 9:0:0:0: Attached scsi generic sg2 type 0 > > XFS mounting filesystem sdc2 > > Starting XFS recovery on filesystem: sdc2 (logdev: internal) > > XFS: xlog_recover_process_data: bad transaction > > XFS: log mount/recovery failed: error 5 > > XFS: log mount failed > > hm, that's not a simple copy operation, that is a mount failing; > your log appears to be corrupted. > > offhand I'm going to blame it on having a write cache enabled > on your drive, and having barriers either off, or not working > properly. > > -Eric > > --00163630f435a9c7700496652d68 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
While the copy operation is in progress, simply unplug the usb device = and then replug.
The issue can be seen from XFS (2.6.31) onwards, I am trying to figure= out the changes between 2.6.30.9 and 2.6.31.
One thing I noticed is - there is difference in speed for 2 versions -= in case of 2.6.30.9 if I remove the USB within '5' seconds - I can= see the file being created at the destination and some data written, while= in case of 2.6.31(onwards), it takes=A0around 20 seconds to get some data = to disk.
I am using MIPS at the moment with VIPT(fixes included)

Please let me know if this information is useful.
=A0
Thanks,
Amit Sahrawat
On Wed, Dec 1, 2010 at 8:25 PM, Eric Sandeen <sandeen@sandeen.n= et> wrote:
On 12/1/10 1:14 AM, Amit Sahrawat wrote:
> Dear Mem= ber,
>
> I am getting following corruption on XFS formatted dis= k during a simple copy operation:
> sd 9:0:0:0: Attached scsi removab= le disk sdc
> sd 9:0:0:0: Attached scsi generic sg2 type 0
> XFS mounting file= system sdc2
> Starting XFS recovery on filesystem: sdc2 (logdev: inte= rnal)
> XFS: xlog_recover_process_data: bad transaction
> XFS: = log mount/recovery failed: error 5
> XFS: log mount failed

hm, that's not a simple copy op= eration, that is a mount failing;
your log appears to be corrupted.
<= br>offhand I'm going to blame it on having a write cache enabled
on your drive, and having barriers either off, or not working
properly.<= br>
-Eric


--00163630f435a9c7700496652d68-- From amit.sahrawat83@gmail.com Wed Dec 1 21:39:59 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.2 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,J_CHICKENPOX_55,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB23dw4Y250093 for ; Wed, 1 Dec 2010 21:39:59 -0600 X-ASG-Debug-ID: 1291261301-1db9011e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-qy0-f174.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 809E5160AE7B for ; Wed, 1 Dec 2010 19:41:41 -0800 (PST) Received: from mail-qy0-f174.google.com (mail-qy0-f174.google.com [209.85.216.174]) by cuda.sgi.com with ESMTP id iNVnWkD3UcJXTpfw for ; Wed, 01 Dec 2010 19:41:41 -0800 (PST) Received: by qyk11 with SMTP id 11so3582780qyk.5 for ; Wed, 01 Dec 2010 19:41:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:cc:content-type; bh=/oV4NFdpueP4EM2eDGGI0WTQZ6ke8FMxCwNjm9LQ0pg=; b=SzzPS/z2+IYCvItgUr9nFxzk3k1OQzE90MfgYTyB/93p5JHdbQB4qjxtjIMwoLjnyg R6Xy8qi3lgL6LE5tx31MC6U4Qkkdd0KbZf5Xfsh1rk6mLgxV1T4vvJIAmqyuu+gEZHt8 zCwRmj1z1upDXaJgBsqIsxyazAlhIYMU3nsHM= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; b=tlq4Hx0PWQIcRDDOdlICdojHgkLSoZTfrU+4juzRWOT56QSYgygoo7zD5q4YvGcdum tBG28TqlA5B1vHds9EHIG3kgS/Nkg5aBHvdseO0WPIbXHRc6p9dK2vbmplEc6SiH4o+C hh5Hl4aC96luFAvnwbXfPXWSBhbiOO1HrG8iM= MIME-Version: 1.0 Received: by 10.229.227.12 with SMTP id iy12mr8129210qcb.101.1291261301021; Wed, 01 Dec 2010 19:41:41 -0800 (PST) Received: by 10.220.194.3 with HTTP; Wed, 1 Dec 2010 19:41:40 -0800 (PST) In-Reply-To: <20101202021609.GV16922@dastard> References: <20101202021609.GV16922@dastard> Date: Thu, 2 Dec 2010 09:11:40 +0530 Message-ID: X-ASG-Orig-Subj: Re: XFS file system corruption(Return Bad Transaction) kernel - 2.6.34 Subject: Re: XFS file system corruption(Return Bad Transaction) kernel - 2.6.34 From: Amit Sahrawat To: Dave Chinner Cc: Eric Sandeen , xfs@oss.sgi.com, sandeen-xfs@sandeen.net Content-Type: multipart/alternative; boundary=00163630f43528de3504966533b4 X-Barracuda-Connect: mail-qy0-f174.google.com[209.85.216.174] X-Barracuda-Start-Time: 1291261302 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48226 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --00163630f43528de3504966533b4 Content-Type: text/plain; charset=ISO-8859-1 "TEGRA" by mistake happended to be the name of directory where I maintained logs :) I am using MIPS with VIPT cache(fixes included - regarding bad client id). Thanks, Amit Sahrawat On Thu, Dec 2, 2010 at 7:46 AM, Dave Chinner wrote: > On Wed, Dec 01, 2010 at 12:44:58PM +0530, Amit Sahrawat wrote: > > Dear Member, > > > > I am getting following corruption on XFS formatted disk during a simple > copy > > operation: > > sd 9:0:0:0: Attached scsi removable disk sdc > > sd 9:0:0:0: Attached scsi generic sg2 type 0 > > XFS mounting filesystem sdc2 > > Starting XFS recovery on filesystem: sdc2 (logdev: internal) > > XFS: xlog_recover_process_data: bad transaction > > XFS: log mount/recovery failed: error 5 > > XFS: log mount failed > > [root@localhost TEGRA]# > > "TEGRA" - You're running on an ARM device? If so, what kernel are > you running? i.e. does it have the VIVT cache aliasing fixes in it? > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --00163630f43528de3504966533b4 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
"TEGRA" by mistake happended to be the name of directory whe= re I maintained logs :)
I am using MIPS with VIPT cache(fixes included - regarding bad client = id).
=A0
=A0
Thanks,
Amit Sahrawat

On Thu, Dec 2, 2010 at 7:46 AM, Dave Chinner <david@fromorbit.c= om> wrote:
On Wed, Dec 01, 2010 at 12:44:58PM +0530, Amit Sahrawat w= rote:
> Dear Member,
>
> I am getting following corruptio= n on XFS formatted disk during a simple copy
> operation:
> sd = 9:0:0:0: Attached scsi removable disk sdc
> sd 9:0:0:0: Attached scsi generic sg2 type 0
> XFS mounting file= system sdc2
> Starting XFS recovery on filesystem: sdc2 (logdev: inte= rnal)
> XFS: xlog_recover_process_data: bad transaction
> XFS: = log mount/recovery failed: error 5
> XFS: log mount failed
> [root@localhost TEGRA]#

&qu= ot;TEGRA" - You're running on an ARM device? If so, what kernel ar= e
you running? i.e. does it have the VIVT cache aliasing fixes in it?
Cheers,

Dave.
--
Dave Chinner
<= a href=3D"mailto:david@fromorbit.com">david@fromorbit.com

--00163630f43528de3504966533b4-- From sandeen@sandeen.net Wed Dec 1 21:55:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_45 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB23tEPA250836 for ; Wed, 1 Dec 2010 21:55:15 -0600 X-ASG-Debug-ID: 1291262217-7d0e00ce0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6B1B81C81737 for ; Wed, 1 Dec 2010 19:56:57 -0800 (PST) Received: from mail.sandeen.net (64-131-28-21.usfamily.net [64.131.28.21]) by cuda.sgi.com with ESMTP id edUj8bnxJUBrOgp2 for ; Wed, 01 Dec 2010 19:56:57 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 204F648E8B05; Wed, 1 Dec 2010 21:56:57 -0600 (CST) Message-ID: <4CF71907.60803@sandeen.net> Date: Wed, 01 Dec 2010 21:56:55 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.12) Gecko/20101027 Thunderbird/3.1.6 MIME-Version: 1.0 To: Amit Sahrawat CC: xfs@oss.sgi.com, sandeen-xfs@sandeen.net, david@fromorbit.com X-ASG-Orig-Subj: Re: XFS file system corruption(Return Bad Transaction) kernel - 2.6.34 Subject: Re: XFS file system corruption(Return Bad Transaction) kernel - 2.6.34 References: <4CF661C7.2020103@sandeen.net> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-28-21.usfamily.net[64.131.28.21] X-Barracuda-Start-Time: 1291262218 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48227 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 12/1/10 9:40 PM, Amit Sahrawat wrote: > While the copy operation is in progress, simply unplug the usb device and then replug. that's not a simple copy operation either ;) > The issue can be seen from XFS (2.6.31) onwards, I am trying to figure out the changes between 2.6.30.9 and 2.6.31. If you have a regression, perhaps you can do: # git bisect start v2.6.31 v2.6.30 fs/xfs and methodically test the changes in between. -Eric > One thing I noticed is - there is difference in speed for 2 versions - in case of 2.6.30.9 if I remove the USB within '5' seconds - I can see the file being created at the destination and some data written, while in case of 2.6.31(onwards), it takes around 20 seconds to get some data to disk. > I am using MIPS at the moment with VIPT(fixes included) > > Please let me know if this information is useful. > > Thanks, > Amit Sahrawat > On Wed, Dec 1, 2010 at 8:25 PM, Eric Sandeen > wrote: > > On 12/1/10 1:14 AM, Amit Sahrawat wrote: > > Dear Member, > > > > I am getting following corruption on XFS formatted disk during a simple copy operation: > > sd 9:0:0:0: Attached scsi removable disk sdc > > sd 9:0:0:0: Attached scsi generic sg2 type 0 > > XFS mounting filesystem sdc2 > > Starting XFS recovery on filesystem: sdc2 (logdev: internal) > > XFS: xlog_recover_process_data: bad transaction > > XFS: log mount/recovery failed: error 5 > > XFS: log mount failed > > hm, that's not a simple copy operation, that is a mount failing; > your log appears to be corrupted. > > offhand I'm going to blame it on having a write cache enabled > on your drive, and having barriers either off, or not working > properly. > > -Eric > > From amit.sahrawat83@gmail.com Wed Dec 1 22:07:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.2 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,J_CHICKENPOX_45,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB247aI5251339 for ; Wed, 1 Dec 2010 22:07:36 -0600 X-ASG-Debug-ID: 1291262959-082d00e60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-qy0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BE4C21B9F2F for ; Wed, 1 Dec 2010 20:09:19 -0800 (PST) Received: from mail-qy0-f181.google.com (mail-qy0-f181.google.com [209.85.216.181]) by cuda.sgi.com with ESMTP id mntLUYW32B51YOtZ for ; Wed, 01 Dec 2010 20:09:19 -0800 (PST) Received: by qyk12 with SMTP id 12so8736908qyk.5 for ; Wed, 01 Dec 2010 20:09:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:cc:content-type; bh=uCP83ARkYvV1ZZoqbtmShdh0PxECl9B3lbsLA8mjFrQ=; b=KPoL3NoOOTRtzI6VwG1rSUKufOGEBQag3jBhwNhXAsOmCt8KgUJyqaMpjM3RCmLwWz UZRXiHqDMQNBkUYTtkcoc5/w4BXPVFV7ety7GXy07h80v0sdb7Z4QEgBm51BDz+8W1K3 nNLjNAKGFiMYloDEcnM+CZISmYIiyLaKrp0PY= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; b=FXIrZ9cXftbKYwGawTwNUC6CKZIbKzSBEaaZY2QivcTrTWgFrwqOSRnFkYyGP1n0Ba ttFIiPmTxX5VhI8cZG2LbKHh04eLAq/8OvI4Dj21kxC+2ZMzzB1Fn8FqiYnqhzXQ8Hes VcSYd+A5vAVrxL0x2xZw9jcxD6zHklzV+udW4= MIME-Version: 1.0 Received: by 10.224.54.72 with SMTP id p8mr8712402qag.126.1291262958762; Wed, 01 Dec 2010 20:09:18 -0800 (PST) Received: by 10.220.194.3 with HTTP; Wed, 1 Dec 2010 20:09:18 -0800 (PST) In-Reply-To: <4CF71907.60803@sandeen.net> References: <4CF661C7.2020103@sandeen.net> <4CF71907.60803@sandeen.net> Date: Thu, 2 Dec 2010 09:39:18 +0530 Message-ID: X-ASG-Orig-Subj: Re: XFS file system corruption(Return Bad Transaction) kernel - 2.6.34 Subject: Re: XFS file system corruption(Return Bad Transaction) kernel - 2.6.34 From: Amit Sahrawat To: Eric Sandeen Cc: xfs@oss.sgi.com, sandeen-xfs@sandeen.net, david@fromorbit.com Content-Type: multipart/alternative; boundary=0015175caa80f7fa6804966595a2 X-Barracuda-Connect: mail-qy0-f181.google.com[209.85.216.181] X-Barracuda-Start-Time: 1291262959 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48227 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --0015175caa80f7fa6804966595a2 Content-Type: text/plain; charset=ISO-8859-1 yes, thats the only approach at the moment which can help. I am doubting the changes related with the disk commit, but I am not sure. Thanks, Amit Sahrawat On Thu, Dec 2, 2010 at 9:26 AM, Eric Sandeen wrote: > On 12/1/10 9:40 PM, Amit Sahrawat wrote: > > While the copy operation is in progress, simply unplug the usb device and > then replug. > > that's not a simple copy operation either ;) > > > The issue can be seen from XFS (2.6.31) onwards, I am trying to figure > out the changes between 2.6.30.9 and 2.6.31. > > If you have a regression, perhaps you can do: > > # git bisect start v2.6.31 v2.6.30 fs/xfs > > and methodically test the changes in between. > > -Eric > > > One thing I noticed is - there is difference in speed for 2 versions - in > case of 2.6.30.9 if I remove the USB within '5' seconds - I can see the file > being created at the destination and some data written, while in case of > 2.6.31(onwards), it takes around 20 seconds to get some data to disk. > > I am using MIPS at the moment with VIPT(fixes included) > > > > Please let me know if this information is useful. > > > > Thanks, > > Amit Sahrawat > > On Wed, Dec 1, 2010 at 8:25 PM, Eric Sandeen sandeen@sandeen.net>> wrote: > > > > On 12/1/10 1:14 AM, Amit Sahrawat wrote: > > > Dear Member, > > > > > > I am getting following corruption on XFS formatted disk during a > simple copy operation: > > > sd 9:0:0:0: Attached scsi removable disk sdc > > > sd 9:0:0:0: Attached scsi generic sg2 type 0 > > > XFS mounting filesystem sdc2 > > > Starting XFS recovery on filesystem: sdc2 (logdev: internal) > > > XFS: xlog_recover_process_data: bad transaction > > > XFS: log mount/recovery failed: error 5 > > > XFS: log mount failed > > > > hm, that's not a simple copy operation, that is a mount failing; > > your log appears to be corrupted. > > > > offhand I'm going to blame it on having a write cache enabled > > on your drive, and having barriers either off, or not working > > properly. > > > > -Eric > > > > > > --0015175caa80f7fa6804966595a2 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
yes, thats the only approach at the moment which can help. I am doubti= ng the changes related with the disk commit, but I=A0am not sure.
=A0
Thanks,
Amit Sahrawat

On Thu, Dec 2, 2010 at 9:26 AM, Eric Sandeen <sandeen@sandeen.n= et> wrote:
On 12/1/10 9:40 PM, Amit Sahrawat wrote:
> While th= e copy operation is in progress, simply unplug the usb device and then repl= ug.

that's not a simple copy operation either ;)

> The issue can be seen from XFS (2.6.31) onwards,= I am trying to figure out the changes between 2.6.30.9 and 2.6.31.

=
If you have a regression, perhaps you can do:

# git bisect sta= rt v2.6.31 v2.6.30 fs/xfs

and methodically test the changes in between.

-Eric

> One thing I noticed is - there is difference in = speed for 2 versions - in case of 2.6.30.9 if I remove the USB within '= 5' seconds - I can see the file being created at the destination and so= me data written, while in case of 2.6.31(onwards), it takes around 20 secon= ds to get some data to disk.
> I am using MIPS at the moment with VIPT(fixes included)
>
>= ; Please let me know if this information is useful.
>
> Thanks,=
> Amit Sahrawat
> On Wed, Dec 1, 2010 at 8:25 PM, Eric Sandeen <sandeen@sandeen.net <mailto:sandeen@sandeen.net>> wrote: >
> =A0 =A0 On 12/1/10 1:14 AM, Amit Sahrawat wrote:
> =A0 = =A0 > Dear Member,
> =A0 =A0 >
> =A0 =A0 > I am gettin= g following corruption on XFS formatted disk during a simple copy operation= :
> =A0 =A0 > sd 9:0:0:0: Attached scsi removable disk sdc
> =A0 =A0 > sd 9:0:0:0: Attached scsi generic sg2 type 0
> =A0 = =A0 > XFS mounting filesystem sdc2
> =A0 =A0 > Starting XFS rec= overy on filesystem: sdc2 (logdev: internal)
> =A0 =A0 > XFS: xlog= _recover_process_data: bad transaction
> =A0 =A0 > XFS: log mount/recovery failed: error 5
> =A0 =A0 &= gt; XFS: log mount failed
>
> =A0 =A0 hm, that's not a simp= le copy operation, that is a mount failing;
> =A0 =A0 your log appear= s to be corrupted.
>
> =A0 =A0 offhand I'm going to blame it on having a write ca= che enabled
> =A0 =A0 on your drive, and having barriers either off, = or not working
> =A0 =A0 properly.
>
> =A0 =A0 -Eric
&= gt;
>


--0015175caa80f7fa6804966595a2-- From SRS0+W+pQ+5+fromorbit.com=david@internode.on.net Wed Dec 1 22:11:50 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB24Bn5c251500 for ; Wed, 1 Dec 2010 22:11:50 -0600 X-ASG-Debug-ID: 1291263211-1da102870000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3867C160B415 for ; Wed, 1 Dec 2010 20:13:31 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id wCGnQxD6bHUsRVZq for ; Wed, 01 Dec 2010 20:13:31 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 48229173-1927428 for multiple; Thu, 02 Dec 2010 14:43:24 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PO0Xg-0006Qu-5j; Thu, 02 Dec 2010 15:13:12 +1100 Date: Thu, 2 Dec 2010 15:13:12 +1100 From: Dave Chinner To: Amit Sahrawat Cc: Eric Sandeen , xfs@oss.sgi.com, sandeen-xfs@sandeen.net X-ASG-Orig-Subj: Re: XFS file system corruption(Return Bad Transaction) kernel - 2.6.34 Subject: Re: XFS file system corruption(Return Bad Transaction) kernel - 2.6.34 Message-ID: <20101202041312.GX16922@dastard> References: <4CF661C7.2020103@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1291263213 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48228 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 02, 2010 at 09:10:08AM +0530, Amit Sahrawat wrote: > While the copy operation is in progress, simply unplug the usb device and > then replug. That's pretty much a guaranteed recipe for data and filesystem corruption regardless of the filesystem you are using. Even if you are lucky enough that there was is no IO being issued while the device is unplugged, what guarantee is there that the device even comes back with the same device name? Further, if the device is usb powered, there is no guarantee that the drive caches were flushed correctly before the unplug so random log and metadata corruptions are definitely possible. Cheers, Dave. -- Dave Chinner david@fromorbit.com From amit.sahrawat83@gmail.com Wed Dec 1 22:37:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB24b6Ds254156 for ; Wed, 1 Dec 2010 22:37:07 -0600 X-ASG-Debug-ID: 1291264730-738d035d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-qy0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9BF711B726B for ; Wed, 1 Dec 2010 20:38:50 -0800 (PST) Received: from mail-qy0-f181.google.com (mail-qy0-f181.google.com [209.85.216.181]) by cuda.sgi.com with ESMTP id ZRaJN3asFSpqn6Ac for ; Wed, 01 Dec 2010 20:38:50 -0800 (PST) Received: by qyk12 with SMTP id 12so8761266qyk.5 for ; Wed, 01 Dec 2010 20:38:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:cc:content-type; bh=7giLKChMisuw7WvE9okr4pVIv3jUNUrYns1QzEBQGUI=; b=p7JWWetSO9JHzm0ughghPpre3ZLJONc0ecPtSJmNCY8Xcgs7YovVfShowSf94N+bFA vrlX0wVNK41B7nTGCf4itbBPB13C077BEqVp7T+QY1SG1kaXv6944QSkA/wkM5OYB477 1GU1A9VFzvoRwMF47CGoM/bnMDAimHohMYAHo= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; b=dMjeilD2oq5U1Bui0QDvUPaW6QEBoFh1PvXb7QtrQtstI8TwKn6HKnTBRqqvODfhJr 6A28sAmAMA8iFNcQ7ifgtKmABROpnjbHf0/ZLeJTrj/PD+zWe7GUlNZ8Y+5gbeCCX6wM 6wwpZpL31XgmDX63qtCG1GMpawMefR3kyIAWY= MIME-Version: 1.0 Received: by 10.224.54.72 with SMTP id p8mr8736042qag.126.1291264729848; Wed, 01 Dec 2010 20:38:49 -0800 (PST) Received: by 10.220.194.3 with HTTP; Wed, 1 Dec 2010 20:38:49 -0800 (PST) In-Reply-To: <20101202041312.GX16922@dastard> References: <4CF661C7.2020103@sandeen.net> <20101202041312.GX16922@dastard> Date: Thu, 2 Dec 2010 10:08:49 +0530 Message-ID: X-ASG-Orig-Subj: Re: XFS file system corruption(Return Bad Transaction) kernel - 2.6.34 Subject: Re: XFS file system corruption(Return Bad Transaction) kernel - 2.6.34 From: Amit Sahrawat To: Dave Chinner Cc: Eric Sandeen , xfs@oss.sgi.com, sandeen-xfs@sandeen.net Content-Type: multipart/alternative; boundary=0015175caa80889cee049665ffdf X-Barracuda-Connect: mail-qy0-f181.google.com[209.85.216.181] X-Barracuda-Start-Time: 1291264730 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48228 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --0015175caa80889cee049665ffdf Content-Type: text/plain; charset=ISO-8859-1 I am not able to reproduce the same behaviour on 2.6.30.9, had it been on all versions - this can safely be termed as behaviour. But from 2.6.31 onwards this is very much reproducable, especially the change in behaviour of writing to disk. I will try more things and update if I can find anything new in this. Thanks, Amit Sahrawat On Thu, Dec 2, 2010 at 9:43 AM, Dave Chinner wrote: > On Thu, Dec 02, 2010 at 09:10:08AM +0530, Amit Sahrawat wrote: > > While the copy operation is in progress, simply unplug the usb device and > > then replug. > > That's pretty much a guaranteed recipe for data and filesystem > corruption regardless of the filesystem you are using. Even if you > are lucky enough that there was is no IO being issued while the > device is unplugged, what guarantee is there that the device even > comes back with the same device name? Further, if the device is usb > powered, there is no guarantee that the drive caches were > flushed correctly before the unplug so random log and metadata > corruptions are definitely possible. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --0015175caa80889cee049665ffdf Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
I am not able to reproduce the same behaviour on 2.6.30.9, had it been= on all versions - this can safely be termed as behaviour. But from 2.6.31 = onwards this is very much reproducable, especially the change in behaviour = of writing to disk.
I will try more things and update if I can find anything new in this.<= /div>
=A0
Thanks,
Amit Sahrawat

On Thu, Dec 2, 2010 at 9:43 AM, Dave Chinner <david@fromorbit.c= om> wrote:
On Thu, Dec 02, 2010 at 09:10:08AM +0530, Amit Sahrawat w= rote:
> While the copy operation is in progress, simply unplug the us= b device and
> then replug.

That's pretty much a gua= ranteed recipe for data and filesystem
corruption regardless of the filesystem you are using. Even if you
are l= ucky enough that there was is no IO being issued while the
device is unp= lugged, what guarantee is there that the device even
comes back with the= same device name? Further, if the device is usb
powered, there is no guarantee that the drive caches were
flushed correc= tly before the unplug so random log and metadata
corruptions are definit= ely possible.

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com

--0015175caa80889cee049665ffdf-- From ajeet.yadav.77@gmail.com Thu Dec 2 00:59:48 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=BAYES_40,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB26xlgh000783 for ; Thu, 2 Dec 2010 00:59:48 -0600 X-ASG-Debug-ID: 1291273290-156901a20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-qw0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 832D2160B6BB for ; Wed, 1 Dec 2010 23:01:31 -0800 (PST) Received: from mail-qw0-f53.google.com (mail-qw0-f53.google.com [209.85.216.53]) by cuda.sgi.com with ESMTP id SygcYnwMAJup1BaK for ; Wed, 01 Dec 2010 23:01:31 -0800 (PST) Received: by qwe5 with SMTP id 5so7837165qwe.26 for ; Wed, 01 Dec 2010 23:01:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:date:message-id :subject:from:to:content-type; bh=xwQuflRrJ83yrtvkZMQVVGu7y3vSBgnWUA9//kXxhBY=; b=DZttjlz/0iZdBUa95YbKPEHNzNcIwOSVFZn8ddaj76m8q+kWhAtF/Ja66YncQ+n0gD qVhwS8WAljpaW3F9v2wZiNmyMCGFpqNgO79vWJQnNPfyCea6sR4y7xewm8bdrkCCle6O qucAXynWeB+b1hIYOqFptM5yomr6c1E8AYwjc= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=MiOH9Y6OjeilQuI0pLocQ/6T8TJUYElN2bWwlyw7CW7FyPpcKZ2pXIlTTqts1d2ul3 NbRfjHmhttqdQGJG8/aifO7rsBDPSVb9F094arI8Ugvmk7cVD9KFEUPTa+YhjwvguqR1 jo8IGhuw23jPHMg2W4w0FGX1timQozib0y1Bg= MIME-Version: 1.0 Received: by 10.224.61.6 with SMTP id r6mr8921746qah.104.1291273290692; Wed, 01 Dec 2010 23:01:30 -0800 (PST) Received: by 10.220.162.69 with HTTP; Wed, 1 Dec 2010 23:01:30 -0800 (PST) Date: Thu, 2 Dec 2010 12:31:30 +0530 Message-ID: X-ASG-Orig-Subj: XFS mount fail: XFS_WANT_CORRUPTED_GOTO fs/xfs/xfs_alloc.c Subject: XFS mount fail: XFS_WANT_CORRUPTED_GOTO fs/xfs/xfs_alloc.c From: Ajeet Yadav To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=0015175cded4ccbab7049667fd60 X-Barracuda-Connect: mail-qw0-f53.google.com[209.85.216.53] X-Barracuda-Start-Time: 1291273291 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48238 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --0015175cded4ccbab7049667fd60 Content-Type: text/plain; charset=ISO-8859-1 Dear all, This is XFS fail mount log on linux 2.6.30.9 XFS mounting filesystem sda2 Starting XFS recovery on filesystem: sda2 (logdev: internal) XFS internal error XFS_WANT_CORRUPTED_GOTO at line 1629 of file fs/xfs/xfs_alloc.c. Caller 0x80129658 Call Trace: [<802dedc8>] dump_stack+0x8/0x34 from[<80127400>] xfs_free_ag_extent+0x128/0x7ac [<80127400>] xfs_free_ag_extent+0x128/0x7ac from[<80129658>] xfs_free_extent+0xb8/0xe8 [<80129658>] xfs_free_extent+0xb8/0xe8 from[<80163978>] xlog_recover_process_efi+0x160/0x214 [<80163978>] xlog_recover_process_efi+0x160/0x214 from[<80163ac4>] xlog_recover_process_efis+0x98/0x11c [<80163ac4>] xlog_recover_process_efis+0x98/0x11c from[<8016663c>] xlog_recover_finish+0x28/0xdc [<8016663c>] xlog_recover_finish+0x28/0xdc from[<8016aec0>] xfs_mountfs+0x4d0/0x610 [<8016aec0>] xfs_mountfs+0x4d0/0x610 from[<80184434>] xfs_fs_fill_super+0x1fc/0x418 [<80184434>] xfs_fs_fill_super+0x1fc/0x418 from[<800bae48>] get_sb_bdev+0x11c/0x1c0 [<800bae48>] get_sb_bdev+0x11c/0x1c0 from[<80181f20>] xfs_fs_get_sb+0x20/0x2c [<80181f20>] xfs_fs_get_sb+0x20/0x2c from[<800b9424>] vfs_kern_mount+0x68/0xd0 [<800b9424>] vfs_kern_mount+0x68/0xd0 from[<800b94f0>] do_kern_mount+0x54/0x118 [<800b94f0>] do_kern_mount+0x54/0x118 from[<800d44e8>] do_mount+0x7b4/0x828 [<800d44e8>] do_mount+0x7b4/0x828 from[<800d45f8>] sys_mount+0x9c/0x194 [<800d45f8>] sys_mount+0x9c/0x194 from[<800102c4>] stack_done+0x20/0x3c Failed to recover EFIs on filesystem: sda2 XFS: log mount finish failed --0015175cded4ccbab7049667fd60 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Dear all,
This is XFS fail mount log on linux 2.6.30.9
=A0
XFS mounting filesystem sda2
Starting XFS recovery on filesystem: s= da2 (logdev: internal)
XFS internal error XFS_WANT_CORRUPTED_GOTO at lin= e 1629 of file fs/xfs/xfs_alloc.c.=A0 Caller 0x80129658
Call Trace:
[<802dedc8>] dump_stack+0x8/0x34 from[<80127400>] xfs_free_ag_e= xtent+0x128/0x7ac
[<80127400>] xfs_free_ag_extent+0x128/0x7ac from= [<80129658>] xfs_free_extent+0xb8/0xe8
[<80129658>] xfs_free= _extent+0xb8/0xe8 from[<80163978>] xlog_recover_process_efi+0x160/0x2= 14
[<80163978>] xlog_recover_process_efi+0x160/0x214 from[<80163ac4&g= t;] xlog_recover_process_efis+0x98/0x11c
[<80163ac4>] xlog_recover= _process_efis+0x98/0x11c from[<8016663c>] xlog_recover_finish+0x28/0x= dc
[<8016663c>] xlog_recover_finish+0x28/0xdc from[<8016aec0>] xfs= _mountfs+0x4d0/0x610
[<8016aec0>] xfs_mountfs+0x4d0/0x610 from[<= ;80184434>] xfs_fs_fill_super+0x1fc/0x418
[<80184434>] xfs_fs_f= ill_super+0x1fc/0x418 from[<800bae48>] get_sb_bdev+0x11c/0x1c0
[<800bae48>] get_sb_bdev+0x11c/0x1c0 from[<80181f20>] xfs_fs_ge= t_sb+0x20/0x2c
[<80181f20>] xfs_fs_get_sb+0x20/0x2c from[<800b9= 424>] vfs_kern_mount+0x68/0xd0
[<800b9424>] vfs_kern_mount+0x68= /0xd0 from[<800b94f0>] do_kern_mount+0x54/0x118
[<800b94f0>] do_kern_mount+0x54/0x118 from[<800d44e8>] do_mount= +0x7b4/0x828
[<800d44e8>] do_mount+0x7b4/0x828 from[<800d45f8&g= t;] sys_mount+0x9c/0x194
[<800d45f8>] sys_mount+0x9c/0x194 from[&l= t;800102c4>] stack_done+0x20/0x3c
=A0
Failed to recover EFIs on filesystem: sda2
XFS: log mount finish = failed
--0015175cded4ccbab7049667fd60-- From michael.monnerie@is.it-management.at Thu Dec 2 05:31:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB2BVTh4014138 for ; Thu, 2 Dec 2010 05:31:30 -0600 X-ASG-Debug-ID: 1291289590-73b3018f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CA99E1C883BB for ; Thu, 2 Dec 2010 03:33:11 -0800 (PST) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id eHYkEGr4gWzzTT4h for ; Thu, 02 Dec 2010 03:33:11 -0800 (PST) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 2609F609; Thu, 2 Dec 2010 12:33:09 +0100 (CET) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 86303401C3D; Thu, 2 Dec 2010 12:33:07 +0100 (CET) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair of critical volume Subject: Re: xfs_repair of critical volume Date: Thu, 2 Dec 2010 12:33:02 +0100 User-Agent: KMail/1.13.5 (Linux/2.6.34.7-0.5-desktop; KDE/4.4.4; x86_64; ; ) Cc: Eli Morris , Dave Chinner References: <75C248E3-2C99-426E-AE7D-9EC543726796@ucsc.edu> <20101117074708.GP22876@dastard> In-Reply-To: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart2592691.X4ZIO1cIyr"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201012021233.07213@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1291289591 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48257 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart2592691.X4ZIO1cIyr Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Dienstag, 30. November 2010 Eli Morris wrote: > Thanks for your help with this. I wrote the program and ran it > through and it looks like we have we able to preserve 44 TB of valid > data, while removing the corrupted files, which is a great result, > considering the circumstances.=20 Eli, could you post the relevant program here so others can use it if=20 needed? There are requests from time to time, and it would be good if=20 such a program were available (like I'm sure you'd been happy if it=20 already existed the time you needed it). Thanks, and wow: what an amazing filesystem can recover such an event! =2D-=20 mit freundlichen Gr=FCssen, Michael Monnerie, Ing. BSc it-management Internet Services: Prot=E9ger http://proteger.at [gesprochen: Prot-e-schee] Tel: +43 660 / 415 6531 // ****** Radiointerview zum Thema Spam ****** // http://www.it-podcast.at/archiv.html#podcast-100716 //=20 // Haus zu verkaufen: http://zmi.at/langegg/ --nextPart2592691.X4ZIO1cIyr Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.15 (GNU/Linux) iEYEABECAAYFAkz3g/MACgkQzhSR9xwSCbSqfACg3RkCYB+j5dLKRL3PTvGvmA7H Rw8An24uOFEeD0Kgzxb6Wug0hvbNuJXi =wvwl -----END PGP SIGNATURE----- --nextPart2592691.X4ZIO1cIyr-- From BATV+5c8b8fc841e426a1fab9+2657+infradead.org+hch@bombadil.srs.infradead.org Thu Dec 2 05:37:11 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB2Bb8WJ014392 for ; Thu, 2 Dec 2010 05:37:10 -0600 X-ASG-Debug-ID: 1291289931-0a0400850000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A0FBE1404F6A for ; Thu, 2 Dec 2010 03:38:52 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id qm1feOlqniwCKSQC for ; Thu, 02 Dec 2010 03:38:52 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PO7Uv-0005ai-Bx; Thu, 02 Dec 2010 11:38:49 +0000 Date: Thu, 2 Dec 2010 06:38:49 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/8] xfs: Pull EFI/EFD handling out from under the AIL lock Subject: Re: [PATCH 1/8] xfs: Pull EFI/EFD handling out from under the AIL lock Message-ID: <20101202113849.GA21365@infradead.org> References: <1290993152-20999-1-git-send-email-david@fromorbit.com> <1290993152-20999-2-git-send-email-david@fromorbit.com> <20101130201734.GA16079@infradead.org> <20101202012841.GL16922@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101202012841.GL16922@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[18.85.46.34] X-Barracuda-Start-Time: 1291289932 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 02, 2010 at 12:28:41PM +1100, Dave Chinner wrote: > > - there is a behaviour change about the xfs_trans_del_item call > > in xfs_efi_item_unpin - before it was protected by the > > XFS_EFI_CANCELED which was never set, and now it's not. > > XFS_EFI_CANCELED has not been set in the code base since > xfs_efi_cancel() was removed back in 2006 by commit > 065d312e15902976d256ddaf396a7950ec0350a8 ("[XFS] Remove unused > iop_abort log item operation), and even then xfs_efi_cancel() was > never called. I haven't tracked it back further than that (beyond > git history), but handling of efis in cancelled transactions has > been broken for a long time. > > Basically, when we get an IOP_UNPIN(lip, 1); call from > xfs_trans_uncommit() (i.e. remove == 1), if we don't free the log > item descriptor we leak it. IOWs, the new behaviour introduced in > this patch is actually the correct behaviour. Maybe fix this issue first in a separate patch, instead of hiding it in a bigger one. From BATV+5c8b8fc841e426a1fab9+2657+infradead.org+hch@bombadil.srs.infradead.org Thu Dec 2 05:39:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB2Bd6Hq014506 for ; Thu, 2 Dec 2010 05:39:06 -0600 X-ASG-Debug-ID: 1291290050-739201ed0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9C5581C888FB for ; Thu, 2 Dec 2010 03:40:50 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 5sagJsvC2a0Yp2Lj for ; Thu, 02 Dec 2010 03:40:50 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PO7Ws-0006Gn-19; Thu, 02 Dec 2010 11:40:50 +0000 Date: Thu, 2 Dec 2010 06:40:50 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 02/14] xfs: clean up log space grant functions Subject: Re: [PATCH 02/14] xfs: clean up log space grant functions Message-ID: <20101202114049.GB21365@infradead.org> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-3-git-send-email-david@fromorbit.com> <20101201123032.GA20378@infradead.org> <20101202014833.GN16922@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101202014833.GN16922@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[18.85.46.34] X-Barracuda-Start-Time: 1291290050 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 02, 2010 at 12:48:33PM +1100, Dave Chinner wrote: > Ok, so your main objection is the needless addition to the queue? > That can be avoided easily enough via a local variable. Would that > be sufficient to alleviate your concerns? The main objection is that the new code might be a bit shorted, but is a lot less readable. If you really want it go with it and an updated changelog mentioning the behaviour change, but I don't really feel too good about it. From BATV+5c8b8fc841e426a1fab9+2657+infradead.org+hch@bombadil.srs.infradead.org Thu Dec 2 05:45:43 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB2BjhAX014925 for ; Thu, 2 Dec 2010 05:45:43 -0600 X-ASG-Debug-ID: 1291290447-1619001a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 67668140521E for ; Thu, 2 Dec 2010 03:47:27 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id N3Shda6FvUSZqRSW for ; Thu, 02 Dec 2010 03:47:27 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PO7dG-00079U-Iu; Thu, 02 Dec 2010 11:47:26 +0000 Date: Thu, 2 Dec 2010 06:47:26 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 03/14] xfs: convert log grant heads to LSN notation Subject: Re: [PATCH 03/14] xfs: convert log grant heads to LSN notation Message-ID: <20101202114726.GC21365@infradead.org> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-4-git-send-email-david@fromorbit.com> <20101201130504.GA18379@infradead.org> <20101202020132.GP16922@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101202020132.GP16922@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[18.85.46.34] X-Barracuda-Start-Time: 1291290447 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 02, 2010 at 01:01:32PM +1100, Dave Chinner wrote: > On Wed, Dec 01, 2010 at 08:05:04AM -0500, Christoph Hellwig wrote: > > > -STATIC int xlog_space_left(xlog_t *log, int cycle, int bytes); > > > +STATIC int xlog_space_left(int logsize, xfs_lsn_t tail_lsn, > > > + xfs_lsn_t head); > > > > Looking further through the series I have to say I really hate > > passing in the logsize instead of the log structure. Passing the > > log pointer from higher level functions just makes a lot more sense. > > > > Also in this case passing the tail_lsn explicitly doesn't make any sense > > - it becomes atomic later and thus there is no locking requirement for > > it. > > What I wanted to make clear is that the calculation works on fixed > values and doesn't sample values internally itself. I guess that's > not important for the log size, but for stuff like the tail lsn > it avoids needing to sample inside xlog_space_left() before we > crack it. i.e. something like this is wrong: > > cycle = CYCLE_LSN(atomic64_read(&log->l_tail_lsn)); > block = BLOCK_LSN(atomic64_read(&log->l_tail_lsn)); > > and this is correct: > > tail_lsn = atomic64_read(&log->l_tail_lsn); > cycle = CYCLE_LSN(tail_lsn); > block = BLOCK_LSN(tail_lsn); > > So it makes sense to me to have the value of of the tail lsn and > other variables that should only be sampled once passed into the > function. That avoids misunderstandings further down the track > because it is obvious that the calculation works on constant values. > Perhaps I should add "const" to the parameter declarations to help > make my intentions clear... I don't think obsfucating the code is a good idea to reach this goal. What might be better is a helper like: static inline void xlog_crack_lsn(atomic64_t *lsn, int *cycle, int *block) { xfs_lsn_t = atomic64_read(lsn); *cycle = CYCLE_LSN(tail_lsn); *block = BLOCK_LSN(tail_lsn); } and a long comment explaining how it needs to be used. > I thought about that - my first version even did this. I thought it > was easier to understand the changes if I didn't change the calling > conventions for modifying the grant heads. As such, I'd prefer to > make this change to the wrappers in a separate patch. Heh, when looking at the patch I actually found this part pretty hard to read already. So moving the factoring of the helpers out into a separate patch might indeed be a good idea, and that patch can also remove the wrappers. From BATV+5c8b8fc841e426a1fab9+2657+infradead.org+hch@bombadil.srs.infradead.org Thu Dec 2 05:46:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_TICKET autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB2BkNHF014979 for ; Thu, 2 Dec 2010 05:46:23 -0600 X-ASG-Debug-ID: 1291290487-166f00210000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8B5981405227 for ; Thu, 2 Dec 2010 03:48:07 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id H6v1SpJnSIoNaLOG for ; Thu, 02 Dec 2010 03:48:07 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PO7du-0007Bg-QT; Thu, 02 Dec 2010 11:48:06 +0000 Date: Thu, 2 Dec 2010 06:48:06 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 09/14] xfs: introduce new locks for the log grant ticket wait queues Subject: Re: [PATCH 09/14] xfs: introduce new locks for the log grant ticket wait queues Message-ID: <20101202114806.GD21365@infradead.org> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-10-git-send-email-david@fromorbit.com> <20101201131208.GA22455@infradead.org> <20101202021031.GT16922@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101202021031.GT16922@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[18.85.46.34] X-Barracuda-Start-Time: 1291290487 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 02, 2010 at 01:10:31PM +1100, Dave Chinner wrote: > On Wed, Dec 01, 2010 at 08:12:08AM -0500, Christoph Hellwig wrote: > > > + /* co-ordinate with xfs_log_force_shutdown */ > > > + if (XLOG_FORCED_SHUTDOWN(log)) { > > > + spin_unlock(&log->l_grant_reserve_lock); > > > + goto error_return; > > > + } > > > > Where is this coming from? Otherwise the patch looks good to me. > > To handles the race condition between xfs_log_force_shutdown() clearing > all the tickets off the queue and a racing log reserve that had > already checked the shutdown flag and was spinning waiting for the > reserve lock to add the ticket to the queue. The race condition is > documented in xfs_log_force_shutdown()... Ok. Please add something like that to the patch description. From denny.priebe@googlemail.com Thu Dec 2 06:18:59 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB2CIwqS016629 for ; Thu, 2 Dec 2010 06:18:59 -0600 X-ASG-Debug-ID: 1291292440-06c5029a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-wy0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8F117160B89E for ; Thu, 2 Dec 2010 04:20:40 -0800 (PST) Received: from mail-wy0-f181.google.com (mail-wy0-f181.google.com [74.125.82.181]) by cuda.sgi.com with ESMTP id gYCpgYZwl0MZ8qKW for ; Thu, 02 Dec 2010 04:20:40 -0800 (PST) Received: by wyf22 with SMTP id 22so8783778wyf.26 for ; Thu, 02 Dec 2010 04:20:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:cc:content-type; bh=Pgb3z0h1KXD7mIDBiGuSEQfxpAJQMRLgy/Ask3kLJHA=; b=gtv/RmcLEw0aUmHOj6EQ+/1yoM9LwcNUkUaNyFnsfHIiD6+BStiot7EXxAmzL+LEnx +gPtRKspLR+5Tkmkb3/YBCwIKcDz5Y1aoWku5+bSsk9tgkAxhIX0SZd3O9f88wvUsZKK BeRW9cOt4aumpG5Xj7dOB2kLeHrsIBZg4KE/E= DomainKey-Signature: a=rsa-sha1; c=nofws; d=googlemail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; b=dLRkvnVyZVkxCaTuPwdibbMza68X2RWRS9sxEGZ0lgEPfY/nFJfTk+4FwQu9359L3m wFPjKVK9EkROpCCjlErwHzCdY29eyhve7Q0GM3Gkb9pbMchMC8QYx57U/ZG3663QM7eI xxSJup9IZNnsagDRk5IAjL9EiE0Tcg4FIW6Ys= MIME-Version: 1.0 Received: by 10.216.48.138 with SMTP id v10mr31687web.66.1291292439423; Thu, 02 Dec 2010 04:20:39 -0800 (PST) Received: by 10.216.18.137 with HTTP; Thu, 2 Dec 2010 04:20:39 -0800 (PST) In-Reply-To: <20101026225839.GZ32255@dastard> References: <20101026225839.GZ32255@dastard> Date: Thu, 2 Dec 2010 12:20:39 +0000 Message-ID: X-ASG-Orig-Subj: Re: Possible deadlock when deleting from realtime section Subject: Re: Possible deadlock when deleting from realtime section From: Denny Priebe To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-wy0-f181.google.com[74.125.82.181] X-Barracuda-Start-Time: 1291292442 X-Barracuda-Bayes: INNOCENT GLOBAL 0.3748 1.0000 -0.0706 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.43 X-Barracuda-Spam-Status: No, SCORE=0.43 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48260 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_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Oct 26, 2010 at 10:58 PM, Dave Chinner wrote: > Hmmm. Looks like we broke recursive inode locking in > xfs_trans_iget() in commit aa72a5cf00001d0b952c7c755be404b9118ceb2e > ("xfs: simplify xfs_trans_iget"). > What we didn't take into account is multiple RT allocator calls in > the same transaction context. Let me think about the best way to fix > this. Is there any news on this? Maybe some patch I could try out? Regards, Denny From amit.sahrawat83@gmail.com Thu Dec 2 06:21:53 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.2 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,J_CHICKENPOX_83,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB2CLrrG016765 for ; Thu, 2 Dec 2010 06:21:53 -0600 X-ASG-Debug-ID: 1291292615-67f2011c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-qw0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C8D811BC14D for ; Thu, 2 Dec 2010 04:23:35 -0800 (PST) Received: from mail-qw0-f53.google.com (mail-qw0-f53.google.com [209.85.216.53]) by cuda.sgi.com with ESMTP id h3IOyiltgDKwAChJ for ; Thu, 02 Dec 2010 04:23:35 -0800 (PST) Received: by qwe5 with SMTP id 5so8157860qwe.26 for ; Thu, 02 Dec 2010 04:23:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:cc:content-type; bh=KtjGyAF3BXwyLH8vhsDPunhw5Fs3LPRDTPxIIQTQK9E=; b=PvdVRoz0C6xPQXDZYvkTyYW5/8tjqN4G6+89FW3C1zGL4p1Ntj2oLDnFYxutb61U1/ qwU0OLBmE7OP2stMvDgQbUKDTAc3YGSiIePpbdGcq7da1qLgDHFQ2ItApFr9gGqEU8Ej EsrRnmIqeGXEiOoKeBP5lhpwogVusuo33Tu2Q= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; b=c+E28sYntqcphII+xzBTu3uRgrfLuO/pQawK4N1STyu6eRC8XqhO2QSQmQrvJE/cVg CA4IE2UU6X9nAl5HyC0o6xlFXXPgFhoUgX2Fe0wOGTwC54aaxbqp1cb7JaWwJP07idTX E/pD3psGCkeQ3aG0JZHxUW9J2fVFQtBpbgLSw= MIME-Version: 1.0 Received: by 10.224.37.141 with SMTP id x13mr1954749qad.76.1291292614166; Thu, 02 Dec 2010 04:23:34 -0800 (PST) Received: by 10.220.194.3 with HTTP; Thu, 2 Dec 2010 04:23:34 -0800 (PST) In-Reply-To: References: <4CF661C7.2020103@sandeen.net> <20101202041312.GX16922@dastard> Date: Thu, 2 Dec 2010 17:53:34 +0530 Message-ID: X-ASG-Orig-Subj: Re: XFS file system corruption(Return Bad Transaction) kernel - 2.6.34 Subject: Re: XFS file system corruption(Return Bad Transaction) kernel - 2.6.34 From: Amit Sahrawat To: Dave Chinner Cc: Eric Sandeen , xfs@oss.sgi.com, sandeen-xfs@sandeen.net Content-Type: multipart/alternative; boundary=0015175cddbe918a5304966c7de2 X-Barracuda-Connect: mail-qw0-f53.google.com[209.85.216.53] X-Barracuda-Start-Time: 1291292615 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48260 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --0015175cddbe918a5304966c7de2 Content-Type: text/plain; charset=ISO-8859-1 By tracing back to find the cause of the issue: http://git.kernel.org/?p=linux/kernel/git/stable/linux-2.6.31.y.git;a=commitdiff;h=f95022161d23ee661a48af8f280472209f513a67 This patch results in generating different behaviour for write. - it makes dependency on xfssyncd(for which default time out value is 3000centisecs - cat /proc/sys/fs/xfs/xfssyncd_centisecs) - 30secs is too large for committing to disc. So, either this value can be lowered or this patch can be reverted so that pdflush takes care of all this. Removing the changes from this patch seems viable solution at this moment. What do you suggest? Thanks, Amit Sahrawat On Thu, Dec 2, 2010 at 10:08 AM, Amit Sahrawat wrote: > I am not able to reproduce the same behaviour on 2.6.30.9, had it been on > all versions - this can safely be termed as behaviour. But from 2.6.31 > onwards this is very much reproducable, especially the change in behaviour > of writing to disk. > I will try more things and update if I can find anything new in this. > > Thanks, > Amit Sahrawat > > On Thu, Dec 2, 2010 at 9:43 AM, Dave Chinner wrote: > >> On Thu, Dec 02, 2010 at 09:10:08AM +0530, Amit Sahrawat wrote: >> > While the copy operation is in progress, simply unplug the usb device >> and >> > then replug. >> >> That's pretty much a guaranteed recipe for data and filesystem >> corruption regardless of the filesystem you are using. Even if you >> are lucky enough that there was is no IO being issued while the >> device is unplugged, what guarantee is there that the device even >> comes back with the same device name? Further, if the device is usb >> powered, there is no guarantee that the drive caches were >> flushed correctly before the unplug so random log and metadata >> corruptions are definitely possible. >> >> Cheers, >> >> Dave. >> -- >> Dave Chinner >> david@fromorbit.com >> > > --0015175cddbe918a5304966c7de2 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
By tracing back to find the cause of the issue:
This patch results in generating different behaviour for write. - it m= akes dependency on xfssyncd(for which default time out value is 3000centise= cs - cat /proc/sys/fs/xfs/xfssyncd_centisecs) - 30secs is too large for com= mitting to disc.
So, either this value can be lowered or this patch can be reverted so = that pdflush takes care of all this.
Removing the changes from this patch seems viable solution at this mom= ent.
=A0
What do you suggest?
=A0
Thanks,
Amit Sahrawat


=A0
On Thu, Dec 2, 2010 at 10:08 AM, Amit Sahrawat <= span dir=3D"ltr"><amit.sahr= awat83@gmail.com> wrote:
I am not able to reproduce the same behaviour on 2.6.30.9, had it been= on all versions - this can safely be termed as behaviour. But from 2.6.31 = onwards this is very much reproducable, especially the change in behaviour = of writing to disk.
I will try more things and update if I can find anything new in this.<= /div>
=A0
Thanks,
Amit Sahrawat

On Thu, Dec 2, 2010 at 9:43 AM, Dave Chinner <david@fromorbit.com> wrote:
On Thu, Dec 02, 2010 at 09:10:08AM +0530, Amit Sahrawat wrote:
>= While the copy operation is in progress, simply unplug the usb device and<= br>> then replug.

That's pretty much a guaranteed recip= e for data and filesystem
corruption regardless of the filesystem you are using. Even if you
are l= ucky enough that there was is no IO being issued while the
device is unp= lugged, what guarantee is there that the device even
comes back with the= same device name? Further, if the device is usb
powered, there is no guarantee that the drive caches were
flushed correc= tly before the unplug so random log and metadata
corruptions are definit= ely possible.

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com


--0015175cddbe918a5304966c7de2-- From spelic@shiftmail.org Thu Dec 2 07:54:58 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB2Dsv5p021141 for ; Thu, 2 Dec 2010 07:54:58 -0600 X-ASG-Debug-ID: 1291298200-1a3200810000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from BLADE3.ISTI.CNR.IT (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 18A831C88DF7 for ; Thu, 2 Dec 2010 05:56:40 -0800 (PST) Received: from BLADE3.ISTI.CNR.IT (blade3.isti.cnr.it [194.119.192.19]) by cuda.sgi.com with ESMTP id 68BrRAf1qEQrmksx for ; Thu, 02 Dec 2010 05:56:40 -0800 (PST) Received: from SCRIPT-SPFWL-DAEMON.mx.isti.cnr.it by mx.isti.cnr.it (PMDF V6.5 #31825) id <01NUY6C6IIV4LS7885@mx.isti.cnr.it> for xfs@oss.sgi.com; Thu, 02 Dec 2010 14:55:09 +0100 (MET) Received: from conversionlocal.isti.cnr.it by mx.isti.cnr.it (PMDF V6.5 #31825) id <01NUY6C3HEJKLVVT6P@mx.isti.cnr.it> for xfs@oss.sgi.com; Thu, 02 Dec 2010 14:55:05 +0100 (MET) Received: from [192.168.7.52] (firewall.itb.cnr.it [155.253.6.254]) by mx.isti.cnr.it (PMDF V6.5 #31826) with ESMTPSA id <01NUY6C2UEEWLX52AX@mx.isti.cnr.it>; Thu, 02 Dec 2010 14:55:02 +0100 (MET) Date: Thu, 02 Dec 2010 14:55:05 +0100 From: Spelic X-ASG-Orig-Subj: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram Subject: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram To: "linux-kernel@vger.kernel.org" , xfs@oss.sgi.com, linux-lvm@redhat.com Message-id: <4CF7A539.1050206@shiftmail.org> MIME-version: 1.0 Content-type: text/plain; format=flowed; charset=ISO-8859-1 Content-transfer-encoding: 7bit User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.11) Gecko/20100713 Thunderbird/3.0.6 X-INSM-ip-source: 155.253.6.254 Auth Done X-Barracuda-Connect: blade3.isti.cnr.it[194.119.192.19] X-Barracuda-Start-Time: 1291298201 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.12 X-Barracuda-Spam-Status: No, SCORE=-1.12 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, BSF_SC0_SA085b X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48267 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M 0.40 BSF_SC0_SA085b Custom Rule SA085b X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hello all I noticed what seem to be 4 bugs. (kernel v2.6.37-rc4 but probably also before) First two are one in mkfs.xfs and one in device mapper (lvm mailing list I suppose, otherwise pls forward it): Steps to reproduce: Boot with a large ramdisk, like ramdisk_size=2097152 (actually I had 14GB ramdisk when I tried this but I don't think it will make a difference) Now partition it with a 1GB partition: fdisk /dev/ram0 n p 1 1 +1G w (only one 1GB physical partition) Make a devmapper mapping for the partition kpartx -av /dev/ram0 mkfs.xfs -f /dev/mapper/ram0p1 meta-data=/dev/mapper/ram0p1 isize=256 agcount=4, agsize=66266 blks = sectsz=512 attr=2 data = bsize=4096 blocks=265064, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 Now, lo and behold, partition is gone! fdisk /dev/ram0 p will show no partitions! you can also check with dd if=/dev/ram bs=1M count=1 | hexdump -C All first MB of /dev/ram is zeroed!! also mount /dev/ram0p1 /mnt will fail. Unknown filesystem I think this shows 2 bugs: firstly mkfs.xfs dares to do stuff before the beginning of the device on which it should work. Secondly, device mapper does not constrain access within the boundaries of the device, which I think it should do. Then I have 2 more bugs for you. Please see my thread in linux-rdma called: "NFS-RDMA hangs: connection closed (-103)" in particular this post http://www.mail-archive.com/linux-rdma@vger.kernel.org/msg06632.html with NFS over over Infiniband over XFS over ramdisk it is possible to write a file (2.3GB) which is larger than the size of the device (1.5GB): one bug I think is for XFS people (because I think XFS should check if the space on the filesystem is finished), and another one I think is for /dev/ram people (what mailing list? I am adding lkml), because I think the device should check if someone is writing beyond the end of it. Thank you PS: I am not subscribed to lkml so please do not reply ONLY to lkml. From BATV+5c8b8fc841e426a1fab9+2657+infradead.org+hch@bombadil.srs.infradead.org Thu Dec 2 08:09:54 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB2E9qbN021898 for ; Thu, 2 Dec 2010 08:09:54 -0600 X-ASG-Debug-ID: 1291299096-125b03cd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5E6231BCA70 for ; Thu, 2 Dec 2010 06:11:36 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id ECjlYSBqnqp1Vghw for ; Thu, 02 Dec 2010 06:11:36 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PO9sk-0006VT-9U; Thu, 02 Dec 2010 14:11:34 +0000 Date: Thu, 2 Dec 2010 09:11:34 -0500 From: Christoph Hellwig To: Spelic Cc: "linux-kernel@vger.kernel.org" , xfs@oss.sgi.com, linux-lvm@redhat.com X-ASG-Orig-Subj: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram Subject: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram Message-ID: <20101202141134.GA22012@infradead.org> References: <4CF7A539.1050206@shiftmail.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4CF7A539.1050206@shiftmail.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291299096 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean I'm pretty sure you have CONFIG_DEBUG_BLOCK_EXT_DEVT enabled. This option must never be enabled, as it causes block devices to be randomly renumered. Together with the ramdisk driver overloading the BLKFLSBUF ioctl to discard all data it guarantees you to get data loss like yours. From spelic@shiftmail.org Thu Dec 2 08:14:09 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB2EE9TX022176 for ; Thu, 2 Dec 2010 08:14:09 -0600 X-ASG-Debug-ID: 1291299351-12cd01d70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.isti.cnr.it (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 505351E94300 for ; Thu, 2 Dec 2010 06:15:51 -0800 (PST) Received: from mx2.isti.cnr.it (mx2.isti.cnr.it [194.119.192.4]) by cuda.sgi.com with ESMTP id qxG8AlpsczvgWYoB for ; Thu, 02 Dec 2010 06:15:51 -0800 (PST) Received: from SCRIPT-SPFWL-DAEMON.mx.isti.cnr.it by mx.isti.cnr.it (PMDF V6.5 #31825) id <01NUY70BGTDSLVVTNA@mx.isti.cnr.it> for xfs@oss.sgi.com; Thu, 02 Dec 2010 15:14:39 +0100 (MET) Received: from conversionlocal.isti.cnr.it by mx.isti.cnr.it (PMDF V6.5 #31825) id <01NUY706M72OLS71Q6@mx.isti.cnr.it> for xfs@oss.sgi.com; Thu, 02 Dec 2010 15:14:32 +0100 (MET) Received: from [192.168.7.52] (firewall.itb.cnr.it [155.253.6.254]) by mx.isti.cnr.it (PMDF V6.5 #31826) with ESMTPSA id <01NUY704GITULX4XXJ@mx.isti.cnr.it>; Thu, 02 Dec 2010 15:14:26 +0100 (MET) Date: Thu, 02 Dec 2010 15:14:28 +0100 From: Spelic X-ASG-Orig-Subj: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram Subject: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram In-reply-to: <20101202141134.GA22012@infradead.org> To: Christoph Hellwig Cc: "linux-kernel@vger.kernel.org" , xfs@oss.sgi.com, linux-lvm@redhat.com Message-id: <4CF7A9C4.2040607@shiftmail.org> MIME-version: 1.0 Content-type: text/plain; format=flowed; charset=ISO-8859-1 Content-transfer-encoding: 7bit User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.11) Gecko/20100713 Thunderbird/3.0.6 X-INSM-ip-source: 155.253.6.254 Auth Done References: <4CF7A539.1050206@shiftmail.org> <20101202141134.GA22012@infradead.org> X-Barracuda-Connect: mx2.isti.cnr.it[194.119.192.4] X-Barracuda-Start-Time: 1291299353 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48267 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 12/02/2010 03:11 PM, Christoph Hellwig wrote: > I'm pretty sure you have CONFIG_DEBUG_BLOCK_EXT_DEVT enabled. This > option must never be enabled, as it causes block devices to be > randomly renumered. Together with the ramdisk driver overloading > the BLKFLSBUF ioctl to discard all data it guarantees you to get > data loss like yours. > Nope... # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set From spelic@shiftmail.org Thu Dec 2 08:14:10 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB2EE9hc022179 for ; Thu, 2 Dec 2010 08:14:09 -0600 X-ASG-Debug-ID: 1291299351-681602a70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.isti.cnr.it (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8F1211405B41 for ; Thu, 2 Dec 2010 06:15:52 -0800 (PST) Received: from mx2.isti.cnr.it (mx2.isti.cnr.it [194.119.192.4]) by cuda.sgi.com with ESMTP id VPu7M0CINZM8zeM8 for ; Thu, 02 Dec 2010 06:15:52 -0800 (PST) Received: from SCRIPT-SPFWL-DAEMON.mx.isti.cnr.it by mx.isti.cnr.it (PMDF V6.5 #31825) id <01NUY70IQ3Q8LS7BA9@mx.isti.cnr.it> for xfs@oss.sgi.com; Thu, 02 Dec 2010 15:15:00 +0100 (MET) Received: from conversionlocal.isti.cnr.it by mx.isti.cnr.it (PMDF V6.5 #31825) id <01NUY70FXFGGLS76YD@mx.isti.cnr.it> for xfs@oss.sgi.com; Thu, 02 Dec 2010 15:14:41 +0100 (MET) Received: from [192.168.7.52] (firewall.itb.cnr.it [155.253.6.254]) by mx.isti.cnr.it (PMDF V6.5 #31826) with ESMTPSA id <01NUY70CQOTKLX4XXJ@mx.isti.cnr.it>; Thu, 02 Dec 2010 15:14:36 +0100 (MET) Date: Thu, 02 Dec 2010 15:14:39 +0100 From: Spelic X-ASG-Orig-Subj: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram Subject: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram In-reply-to: <4CF7A539.1050206@shiftmail.org> To: Spelic Cc: "linux-kernel@vger.kernel.org" , xfs@oss.sgi.com, linux-lvm@redhat.com Message-id: <4CF7A9CF.2020904@shiftmail.org> MIME-version: 1.0 Content-type: text/plain; format=flowed; charset=ISO-8859-1 Content-transfer-encoding: 7bit User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.11) Gecko/20100713 Thunderbird/3.0.6 X-INSM-ip-source: 155.253.6.254 Auth Done References: <4CF7A539.1050206@shiftmail.org> X-Barracuda-Connect: mx2.isti.cnr.it[194.119.192.4] X-Barracuda-Start-Time: 1291299353 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA_TO_FROM_ADDR_MATCH X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48268 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Sorry for replying to my own email already one more thing on the 3rd bug: On 12/02/2010 02:55 PM, Spelic wrote: > Hello all > [CUT] > ....... > with NFS over over Infiniband over XFS over ramdisk it > is possible to write a file (2.3GB) which is larger than This is also reproducible with: NFS over TCP over Ethernet over XFS over ramdisk. You don't need infiniband for this. With ethernet it doesn't hang (that's another bug, for RDMA people, in the othter thread) but the file is still 1.9GB, i.e. larger than the device. Look, after running the test over ethernet, at server side: # ll -h /mnt/ram total 1.5G drwxr-xr-x 2 root root 21 2010-12-02 12:54 ./ drwxr-xr-x 3 root root 4.0K 2010-11-29 23:51 ../ -rw-r--r-- 1 root root 1.9G 2010-12-02 15:04 zerofile # mount rpc_pipefs on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw) /dev/sda1 on / type ext4 (rw,errors=remount-ro) proc on /proc type proc (rw,noexec,nosuid,nodev) none on /sys type sysfs (rw,noexec,nosuid,nodev) none on /sys/fs/fuse/connections type fusectl (rw) none on /sys/kernel/debug type debugfs (rw) none on /sys/kernel/security type securityfs (rw) devtmpfs on /dev type devtmpfs (rw,mode=0755) none on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620) none on /dev/shm type tmpfs (rw,nosuid,nodev) none on /var/run type tmpfs (rw,nosuid,mode=0755) none on /var/lock type tmpfs (rw,noexec,nosuid,nodev) none on /lib/init/rw type tmpfs (rw,nosuid,mode=0755) nfsd on /proc/fs/nfsd type nfsd (rw) binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,noexec,nosuid,nodev) /dev/ram0 on /mnt/ram type xfs (rw) # blockdev --getsize64 /dev/ram0 1610612736 # dd if=/mnt/ram/zerofile | wc -c 1985937408 3878784+0 records in 3878784+0 records out 1985937408 bytes (2.0 GB) copied, 6.57081 s, 302 MB/s Feel free to forward to NFS mailing list also if you think it's appropriate. Thank you From BATV+5c8b8fc841e426a1fab9+2657+infradead.org+hch@bombadil.srs.infradead.org Thu Dec 2 08:15:55 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB2EFsZ9022289 for ; Thu, 2 Dec 2010 08:15:55 -0600 X-ASG-Debug-ID: 1291299458-206601370000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DA7AD1E94327 for ; Thu, 2 Dec 2010 06:17:38 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id OjZJoT8GMQJtNhkQ for ; Thu, 02 Dec 2010 06:17:38 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PO9yb-0007om-6Q; Thu, 02 Dec 2010 14:17:37 +0000 Date: Thu, 2 Dec 2010 09:17:37 -0500 From: Christoph Hellwig To: Spelic Cc: Christoph Hellwig , "linux-kernel@vger.kernel.org" , xfs@oss.sgi.com, linux-lvm@redhat.com X-ASG-Orig-Subj: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram Subject: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram Message-ID: <20101202141737.GA29799@infradead.org> References: <4CF7A539.1050206@shiftmail.org> <20101202141134.GA22012@infradead.org> <4CF7A9C4.2040607@shiftmail.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4CF7A9C4.2040607@shiftmail.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291299458 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 02, 2010 at 03:14:28PM +0100, Spelic wrote: > On 12/02/2010 03:11 PM, Christoph Hellwig wrote: > >I'm pretty sure you have CONFIG_DEBUG_BLOCK_EXT_DEVT enabled. This > >option must never be enabled, as it causes block devices to be > >randomly renumered. Together with the ramdisk driver overloading > >the BLKFLSBUF ioctl to discard all data it guarantees you to get > >data loss like yours. > > Nope... > > # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set Hmm, I suspect dm-linear's dumb forwarding of ioctls has the same effect. From aelder@sgi.com Thu Dec 2 10:41:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB2GfNXO029777 for ; Thu, 2 Dec 2010 10:41:23 -0600 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5F451AC006; Thu, 2 Dec 2010 08:43:04 -0800 (PST) Received: from stout.americas.sgi.com (localhost6.localdomain6 [127.0.0.1]) by stout.americas.sgi.com (8.14.4/8.14.2) with ESMTP id oB2Gh3r9006179; Thu, 2 Dec 2010 10:43:03 -0600 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.4/8.14.4/Submit) id oB2Gh3JL006178; Thu, 2 Dec 2010 10:43:03 -0600 From: Alex Elder Message-Id: <201012021643.oB2Gh3JL006178@stout.americas.sgi.com> Date: Thu, 02 Dec 2010 10:43:03 -0600 To: torvalds@linux-foundation.org Subject: [GIT PULL] XFS update for 2.6.37-rc5 Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org User-Agent: Heirloom mailx 12.5 7/5/10 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Linus, please pull the following five XFS bug fixes for 2.6.37. -Alex The following changes since commit 22a5b566c8c442b0b35b3b106795e2f2b3578096: Merge branch 'for_linus' of git://github.com/at91linux/linux-2.6-at91 (2010-11-30 17:57:57 -0800) are available in the git repository at: git://oss.sgi.com/xfs/xfs for-linus Dave Chinner (5): xfs: fix failed write truncation handling. xfs: push stale, pinned buffers on trylock failures xfs: delayed alloc blocks beyond EOF are valid after writeback xfs: avoid moving stale inodes in the AIL xfs: only run xfs_error_test if error injection is active fs/xfs/linux-2.6/xfs_aops.c | 94 ++++++++++++++++++------------------------ fs/xfs/linux-2.6/xfs_buf.c | 35 +++++++--------- fs/xfs/xfs_bmap.c | 85 ++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_bmap.h | 5 ++ fs/xfs/xfs_dfrag.c | 13 ++++++ fs/xfs/xfs_error.c | 3 + fs/xfs/xfs_error.h | 5 +- fs/xfs/xfs_inode_item.c | 31 +++++++++++--- 8 files changed, 188 insertions(+), 83 deletions(-) From msnitzer@redhat.com Thu Dec 2 15:21:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB2LL2Jg041167 for ; Thu, 2 Dec 2010 15:21:03 -0600 X-ASG-Debug-ID: 1291324966-1fd003610000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 414491BE224 for ; Thu, 2 Dec 2010 13:22:46 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id yDVCpbiFyUxs9S6S for ; Thu, 02 Dec 2010 13:22:46 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation 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.13.8/8.13.8) with ESMTP id oB2LMYvk030630 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 2 Dec 2010 16:22:34 -0500 Received: from localhost (dhcp-100-19-150.bos.redhat.com [10.16.19.150]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id oB2LMS4R002275 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Thu, 2 Dec 2010 16:22:28 -0500 Date: Thu, 2 Dec 2010 16:22:27 -0500 From: Mike Snitzer To: LVM general discussion and development Cc: Spelic , Christoph Hellwig , "linux-kernel@vger.kernel.org" , xfs@oss.sgi.com, npiggin@kernel.dk, dm-devel@redhat.com X-ASG-Orig-Subj: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram Subject: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram Message-ID: <20101202212227.GA22703@redhat.com> References: <4CF7A539.1050206@shiftmail.org> <20101202141134.GA22012@infradead.org> <4CF7A9C4.2040607@shiftmail.org> <20101202141737.GA29799@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101202141737.GA29799@infradead.org> 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: 1291324967 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 02 2010 at 9:17am -0500, Christoph Hellwig wrote: > On Thu, Dec 02, 2010 at 03:14:28PM +0100, Spelic wrote: > > On 12/02/2010 03:11 PM, Christoph Hellwig wrote: > > >I'm pretty sure you have CONFIG_DEBUG_BLOCK_EXT_DEVT enabled. This > > >option must never be enabled, as it causes block devices to be > > >randomly renumered. Together with the ramdisk driver overloading > > >the BLKFLSBUF ioctl to discard all data it guarantees you to get > > >data loss like yours. > > > > Nope... > > > > # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set > > Hmm, I suspect dm-linear's dumb forwarding of ioctls has the same > effect. For the benefit of others: - mkfs.xfs will avoid sending BLKFLSBUF to any device whose major is ramdisk's major, this dates back to 2004: http://oss.sgi.com/archives/xfs/2004-08/msg00463.html - but because a kpartx partition overlay (linear DM mapping) is used for the /dev/ram0p1 device, mkfs.xfs only sees a device with DM's major - so mkfs.xfs sends BLKFLSBUF to the DM device blissfully unaware that the backing device (behind the DM linear target) is a brd device - DM will forward the BLKFLSBUF ioctl to brd, which triggers drivers/block/brd.c:brd_ioctl (nuking the entire ramdisk in the process) So coming full circle this is what hch was referring to when he mentioned: 1) "ramdisk driver overloading the BLKFLSBUF ioctl ..." 2) "dm-linear's dumb forwarding of ioctls ..." I really can't see DM adding a specific check for ramdisk's major when forwarding the BLKFLSBUF ioctl. brd has direct partition support (see commit d7853d1f8932c) so maybe kpartx should just blacklist /dev/ram devices? Alternatively, what about switching brd away from overloading BLKFLSBUF to a real implementation of (overloaded) BLKDISCARD support in brd.c? One that doesn't blindly nuke the entire device but that properly processes the discard request. Mike From msnitzer@redhat.com Thu Dec 2 16:06:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB2M6Ybd043219 for ; Thu, 2 Dec 2010 16:06:35 -0600 X-ASG-Debug-ID: 1291327698-6ba800bf0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 84B431BE190 for ; Thu, 2 Dec 2010 14:08:18 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id bKZwh1D1QxYAFsAm for ; Thu, 02 Dec 2010 14:08:18 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation 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.13.8/8.13.8) with ESMTP id oB2M8CQX024459 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 2 Dec 2010 17:08:12 -0500 Received: from localhost (dhcp-100-19-150.bos.redhat.com [10.16.19.150]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id oB2M85VB020026 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Thu, 2 Dec 2010 17:08:06 -0500 Date: Thu, 2 Dec 2010 17:08:05 -0500 From: Mike Snitzer To: LVM general discussion and development Cc: Spelic , Christoph Hellwig , "linux-kernel@vger.kernel.org" , xfs@oss.sgi.com, npiggin@kernel.dk, dm-devel@redhat.com, tytso@mit.edu X-ASG-Orig-Subj: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram Subject: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram Message-ID: <20101202220805.GA23388@redhat.com> References: <4CF7A539.1050206@shiftmail.org> <20101202141134.GA22012@infradead.org> <4CF7A9C4.2040607@shiftmail.org> <20101202141737.GA29799@infradead.org> <20101202212227.GA22703@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101202212227.GA22703@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1291327699 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 02 2010 at 4:22pm -0500, Mike Snitzer wrote: > On Thu, Dec 02 2010 at 9:17am -0500, > Christoph Hellwig wrote: > > > On Thu, Dec 02, 2010 at 03:14:28PM +0100, Spelic wrote: > > > On 12/02/2010 03:11 PM, Christoph Hellwig wrote: > > > >I'm pretty sure you have CONFIG_DEBUG_BLOCK_EXT_DEVT enabled. This > > > >option must never be enabled, as it causes block devices to be > > > >randomly renumered. Together with the ramdisk driver overloading > > > >the BLKFLSBUF ioctl to discard all data it guarantees you to get > > > >data loss like yours. > > > > > > Nope... > > > > > > # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set > > > > Hmm, I suspect dm-linear's dumb forwarding of ioctls has the same > > effect. > > For the benefit of others: > - mkfs.xfs will avoid sending BLKFLSBUF to any device whose major is > ramdisk's major, this dates back to 2004: > http://oss.sgi.com/archives/xfs/2004-08/msg00463.html > - but because a kpartx partition overlay (linear DM mapping) is used for > the /dev/ram0p1 device, mkfs.xfs only sees a device with DM's major > - so mkfs.xfs sends BLKFLSBUF to the DM device blissfully unaware that > the backing device (behind the DM linear target) is a brd device > - DM will forward the BLKFLSBUF ioctl to brd, which triggers > drivers/block/brd.c:brd_ioctl (nuking the entire ramdisk in the > process) > > So coming full circle this is what hch was referring to when he > mentioned: > 1) "ramdisk driver overloading the BLKFLSBUF ioctl ..." > 2) "dm-linear's dumb forwarding of ioctls ..." > > I really can't see DM adding a specific check for ramdisk's major when > forwarding the BLKFLSBUF ioctl. > > brd has direct partition support (see commit d7853d1f8932c) so maybe > kpartx should just blacklist /dev/ram devices? > > Alternatively, what about switching brd away from overloading BLKFLSBUF > to a real implementation of (overloaded) BLKDISCARD support in brd.c? > One that doesn't blindly nuke the entire device but that properly > processes the discard request. Hmm, any chance we could revisit this approach? http://lkml.indiana.edu/hypermail/linux/kernel/0405.3/0998.html From SRS0+MKu5+5+fromorbit.com=david@internode.on.net Thu Dec 2 16:43:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB2MhROQ044750 for ; Thu, 2 Dec 2010 16:43:28 -0600 X-ASG-Debug-ID: 1291329908-409402ba0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 51346137A73E for ; Thu, 2 Dec 2010 14:45:09 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id eWZXz8OSPff13P7d for ; Thu, 02 Dec 2010 14:45:09 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 48357133-1927428 for multiple; Fri, 03 Dec 2010 09:15:07 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1POHti-0007hj-6h; Fri, 03 Dec 2010 09:45:06 +1100 Date: Fri, 3 Dec 2010 09:45:06 +1100 From: Dave Chinner To: Ajeet Yadav Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS mount fail: XFS_WANT_CORRUPTED_GOTO fs/xfs/xfs_alloc.c Subject: Re: XFS mount fail: XFS_WANT_CORRUPTED_GOTO fs/xfs/xfs_alloc.c Message-ID: <20101202224506.GY16922@dastard> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1291329911 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48302 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 02, 2010 at 12:31:30PM +0530, Ajeet Yadav wrote: > Dear all, > This is XFS fail mount log on linux 2.6.30.9 > > XFS mounting filesystem sda2 > Starting XFS recovery on filesystem: sda2 (logdev: internal) > XFS internal error XFS_WANT_CORRUPTED_GOTO at line 1629 of file > fs/xfs/xfs_alloc.c. Caller 0x80129658 > Call Trace: > [<802dedc8>] dump_stack+0x8/0x34 from[<80127400>] > xfs_free_ag_extent+0x128/0x7ac > [<80127400>] xfs_free_ag_extent+0x128/0x7ac from[<80129658>] > xfs_free_extent+0xb8/0xe8 > [<80129658>] xfs_free_extent+0xb8/0xe8 from[<80163978>] > xlog_recover_process_efi+0x160/0x214 > [<80163978>] xlog_recover_process_efi+0x160/0x214 from[<80163ac4>] > xlog_recover_process_efis+0x98/0x11c > [<80163ac4>] xlog_recover_process_efis+0x98/0x11c from[<8016663c>] > xlog_recover_finish+0x28/0xdc > [<8016663c>] xlog_recover_finish+0x28/0xdc from[<8016aec0>] > xfs_mountfs+0x4d0/0x610 > [<8016aec0>] xfs_mountfs+0x4d0/0x610 from[<80184434>] > xfs_fs_fill_super+0x1fc/0x418 > [<80184434>] xfs_fs_fill_super+0x1fc/0x418 from[<800bae48>] > get_sb_bdev+0x11c/0x1c0 > [<800bae48>] get_sb_bdev+0x11c/0x1c0 from[<80181f20>] > xfs_fs_get_sb+0x20/0x2c > [<80181f20>] xfs_fs_get_sb+0x20/0x2c from[<800b9424>] > vfs_kern_mount+0x68/0xd0 > [<800b9424>] vfs_kern_mount+0x68/0xd0 from[<800b94f0>] > do_kern_mount+0x54/0x118 > [<800b94f0>] do_kern_mount+0x54/0x118 from[<800d44e8>] do_mount+0x7b4/0x828 > [<800d44e8>] do_mount+0x7b4/0x828 from[<800d45f8>] sys_mount+0x9c/0x194 > [<800d45f8>] sys_mount+0x9c/0x194 from[<800102c4>] stack_done+0x20/0x3c > > Failed to recover EFIs on filesystem: sda2 > XFS: log mount finish failed You corrupted a free space btree. Care to tell uswhat test you were running that caused this? Did you pull the plug on the device during a copy again? Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+Ztt8+5+fromorbit.com=david@internode.on.net Thu Dec 2 17:06:17 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB2N6GOW045850 for ; Thu, 2 Dec 2010 17:06:16 -0600 X-ASG-Debug-ID: 1291331278-1d6f013e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 643181BE568 for ; Thu, 2 Dec 2010 15:07:59 -0800 (PST) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id XcfMHcds7sDUAg62 for ; Thu, 02 Dec 2010 15:07:59 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 48608204-1927428 for multiple; Fri, 03 Dec 2010 09:37:45 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1POIFb-0007jg-U3; Fri, 03 Dec 2010 10:07:43 +1100 Date: Fri, 3 Dec 2010 10:07:43 +1100 From: Dave Chinner To: Spelic Cc: "linux-kernel@vger.kernel.org" , xfs@oss.sgi.com, linux-lvm@redhat.com X-ASG-Orig-Subj: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram Subject: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram Message-ID: <20101202230743.GZ16922@dastard> References: <4CF7A539.1050206@shiftmail.org> <4CF7A9CF.2020904@shiftmail.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4CF7A9CF.2020904@shiftmail.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1291331280 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48303 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 02, 2010 at 03:14:39PM +0100, Spelic wrote: > Sorry for replying to my own email already > one more thing on the 3rd bug: > > On 12/02/2010 02:55 PM, Spelic wrote: > >Hello all > >[CUT] > >....... > >with NFS over over Infiniband over XFS over > >ramdisk it is possible to write a file (2.3GB) which is larger > >than > > This is also reproducible with: > NFS over TCP over Ethernet over XFS over ramdisk. > You don't need infiniband for this. > With ethernet it doesn't hang (that's another bug, for RDMA people, > in the othter thread) but the file is still 1.9GB, i.e. larger than > the device. > > > Look, after running the test over ethernet, > at server side: > > # ll -h /mnt/ram > total 1.5G > drwxr-xr-x 2 root root 21 2010-12-02 12:54 ./ > drwxr-xr-x 3 root root 4.0K 2010-11-29 23:51 ../ > -rw-r--r-- 1 root root 1.9G 2010-12-02 15:04 zerofile This is a classic ENOSPC vs NFS client writeback overcommit caching issue. Have a look at the block map output - I bet theres holes in the file and it's only consuming 1.5GB of disk space. use xfs_bmap to check this. du should tell you the same thing. Basically, the NFS client overcommits the server filesystem space by doing local writeback caching. Hence it caches 1.9GB of data before it gets the first ENOSPC error back from the server at around 1.5GB of written data. At that point, the data that gets ENOSPC errors is tossed by the NFS client, and a ENOSPC error is placed on the address space to be reported to the next write/sync call. That gets to the dd process when it's 1.9GB into the write. However, there is still (in this case) 400MB of dirty data in the NFS client cache that it will try to write to the server. Because XFS uses speculative preallocation and reserves some space for metadata allocation during delayed allocation, it's handling of the initial ENOSPC condition can result in some space being freed up again as unused reserved metadata space is returned to the free pool as delalloc occurs during server writeback. This usually takes a second or two to complete. As a result, shortly after the first ENOSPC has been reported and subsequent writes have also ENOSPC, we can have space freed up and another write will succeed. At that point, the write that succeeds will be a different offset to the last one that succeeded, leaving a hole in the file and moving the EOF well past 1.5GB. That will go on until there really is no space left at all or the NFS client has no more dirty data to send. Basically, what you see it not a bug in XFS, it is a result of NFS clients being able to overcommit server filesystem space and the interaction that has with the way the filesystem on the NFS server handles ENOSPC. Cheers, Dave. -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Thu Dec 2 18:56:59 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB30uwMC050877 for ; Thu, 2 Dec 2010 18:56:59 -0600 X-ASG-Debug-ID: 1291337922-5645009a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 21307140C06B for ; Thu, 2 Dec 2010 16:58:42 -0800 (PST) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id VVFDpcpLI1pvjkKH for ; Thu, 02 Dec 2010 16:58:42 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 935C16C0B9 for ; Thu, 2 Dec 2010 18:58:41 -0600 (CST) Message-ID: <4CF840C1.1030301@hardwarefreak.com> Date: Thu, 02 Dec 2010 18:58:41 -0600 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2.12) Gecko/20101027 Thunderbird/3.1.6 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair of critical volume Subject: Re: xfs_repair of critical volume References: <75C248E3-2C99-426E-AE7D-9EC543726796@ucsc.edu> <20101117074708.GP22876@dastard> <201012021233.07213@zmi.at> In-Reply-To: <201012021233.07213@zmi.at> 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: 1291337923 X-Barracuda-Bayes: INNOCENT GLOBAL 0.1492 1.0000 -1.1057 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.51 X-Barracuda-Spam-Status: No, SCORE=-0.51 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48309 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Michael Monnerie put forth on 12/2/2010 5:33 AM: > Thanks, and wow: what an amazing filesystem can recover such an event! FSVO "recover". It's definitely amazing that he didn't lose all of his data as a result of his hardware failures and storage configuration. -- Stan From SRS0+srf8+6+fromorbit.com=dave@internode.on.net Thu Dec 2 19:54:14 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_63, J_CHICKENPOX_74 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB31sDh9054378 for ; Thu, 2 Dec 2010 19:54:14 -0600 X-ASG-Debug-ID: 1291341355-5efc015d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8A5D8140CC45 for ; Thu, 2 Dec 2010 17:55:55 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id 01ZTFtFKyjewlBqd for ; Thu, 02 Dec 2010 17:55:55 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 48527034-1927428 for ; Fri, 03 Dec 2010 12:25:54 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1POKsK-0007wk-QZ for xfs@oss.sgi.com; Fri, 03 Dec 2010 12:55:52 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1POKrj-00089z-L9 for xfs@oss.sgi.com; Fri, 03 Dec 2010 12:55:15 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: prevent NMI timeouts in cmn_err Subject: [PATCH] xfs: prevent NMI timeouts in cmn_err Date: Fri, 3 Dec 2010 12:55:15 +1100 Message-Id: <1291341315-31338-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1291341357 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48313 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner We currently have a global error message buffer in cmn_err that is protected by a spin lock that disables interrupts. Recently there have been reports of NMI timeouts occurring when the console is being flooded by SCSI error reports due to cmn_err() getting stuck trying to print to the console while holding this lock (i.e. with interrupts disabled). The NMI watchdog is seeing this CPU as non-responding and so is triggering a panic. While the trigger for the reported case is SCSI errors, pretty much anything that spams the kernel log could cause this to occur. Realistically the only reason that we have the intemediate message buffer is to prepend the correct kernel log level prefix to the log message. The only reason we have the lock is to protect the global message buffer and the only reason the message buffer is global is to keep it off the stack. Hence if we can avoid needing a global message buffer we avoid needing the lock, and we can do this with a small amount of cleanup and some preprocessor tricks: 1. clean up xfs_cmn_err() panic mask functionality to avoid needing debug code in xfs_cmn_err() 2. remove the couple of "!" message prefixes that still exist that the existing cmn_err() code steps over. 3. redefine CE_* levels directly to KERN_* 4. redefine cmn_err() and friends to use printk() directly via variable argument length macros. By doing this, we can completely remove the cmn_err() code and the lock that is causing the problems, and rely solely on printk() serialisation to ensure that we don't get garbled messages. A series of followup patches is really needed to clean up all the cmn_err() calls and related messages properly, but that results in a series that is not easily back portable to enterprise kernels. Hence this initial fix is only to address the direct problem in the lowest impact way possible. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_sysctl.c | 22 +++++++++++- fs/xfs/support/debug.c | 76 ----------------------------------------- fs/xfs/support/debug.h | 40 +++++++++++++++++----- fs/xfs/xfs_error.c | 31 ----------------- fs/xfs/xfs_error.h | 14 ++----- fs/xfs/xfs_log.c | 2 +- fs/xfs/xfs_log_recover.c | 2 +- 7 files changed, 58 insertions(+), 129 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_sysctl.c b/fs/xfs/linux-2.6/xfs_sysctl.c index 7bb5092..768acd8 100644 --- a/fs/xfs/linux-2.6/xfs_sysctl.c +++ b/fs/xfs/linux-2.6/xfs_sysctl.c @@ -51,6 +51,26 @@ xfs_stats_clear_proc_handler( return ret; } + +STATIC int +xfs_panic_mask_proc_handler( + ctl_table *ctl, + int write, + void __user *buffer, + size_t *lenp, + loff_t *ppos) +{ + int ret, *valp = ctl->data; + + ret = proc_dointvec_minmax(ctl, write, buffer, lenp, ppos); + if (!ret && write) { + xfs_panic_mask = *valp; +#ifdef DEBUG + xfs_panic_mask |= (XFS_PTAG_SHUTDOWN_CORRUPT | XFS_PTAG_LOGRES); +#endif + } + return ret; +} #endif /* CONFIG_PROC_FS */ static ctl_table xfs_table[] = { @@ -77,7 +97,7 @@ static ctl_table xfs_table[] = { .data = &xfs_params.panic_mask.val, .maxlen = sizeof(int), .mode = 0644, - .proc_handler = proc_dointvec_minmax, + .proc_handler = xfs_panic_mask_proc_handler, .extra1 = &xfs_params.panic_mask.min, .extra2 = &xfs_params.panic_mask.max }, diff --git a/fs/xfs/support/debug.c b/fs/xfs/support/debug.c index 975aa10..fa39e98 100644 --- a/fs/xfs/support/debug.c +++ b/fs/xfs/support/debug.c @@ -25,82 +25,6 @@ #include "xfs_mount.h" #include "xfs_error.h" -static char message[1024]; /* keep it off the stack */ -static DEFINE_SPINLOCK(xfs_err_lock); - -/* Translate from CE_FOO to KERN_FOO, err_level(CE_FOO) == KERN_FOO */ -#define XFS_MAX_ERR_LEVEL 7 -#define XFS_ERR_MASK ((1 << 3) - 1) -static const char * const err_level[XFS_MAX_ERR_LEVEL+1] = - {KERN_EMERG, KERN_ALERT, KERN_CRIT, - KERN_ERR, KERN_WARNING, KERN_NOTICE, - KERN_INFO, KERN_DEBUG}; - -void -cmn_err(register int level, char *fmt, ...) -{ - char *fp = fmt; - int len; - ulong flags; - va_list ap; - - level &= XFS_ERR_MASK; - if (level > XFS_MAX_ERR_LEVEL) - level = XFS_MAX_ERR_LEVEL; - spin_lock_irqsave(&xfs_err_lock,flags); - va_start(ap, fmt); - if (*fmt == '!') fp++; - len = vsnprintf(message, sizeof(message), fp, ap); - if (len >= sizeof(message)) - len = sizeof(message) - 1; - if (message[len-1] == '\n') - message[len-1] = 0; - printk("%s%s\n", err_level[level], message); - va_end(ap); - spin_unlock_irqrestore(&xfs_err_lock,flags); - BUG_ON(level == CE_PANIC); -} - -void -xfs_fs_vcmn_err( - int level, - struct xfs_mount *mp, - char *fmt, - va_list ap) -{ - unsigned long flags; - int len = 0; - - level &= XFS_ERR_MASK; - if (level > XFS_MAX_ERR_LEVEL) - level = XFS_MAX_ERR_LEVEL; - - spin_lock_irqsave(&xfs_err_lock,flags); - - if (mp) { - len = sprintf(message, "Filesystem \"%s\": ", mp->m_fsname); - - /* - * Skip the printk if we can't print anything useful - * due to an over-long device name. - */ - if (len >= sizeof(message)) - goto out; - } - - len = vsnprintf(message + len, sizeof(message) - len, fmt, ap); - if (len >= sizeof(message)) - len = sizeof(message) - 1; - if (message[len-1] == '\n') - message[len-1] = 0; - - printk("%s%s\n", err_level[level], message); - out: - spin_unlock_irqrestore(&xfs_err_lock,flags); - - BUG_ON(level == CE_PANIC); -} - void assfail(char *expr, char *file, int line) { diff --git a/fs/xfs/support/debug.h b/fs/xfs/support/debug.h index d2d2046..f659bd0 100644 --- a/fs/xfs/support/debug.h +++ b/fs/xfs/support/debug.h @@ -20,15 +20,37 @@ #include -#define CE_DEBUG 7 /* debug */ -#define CE_CONT 6 /* continuation */ -#define CE_NOTE 5 /* notice */ -#define CE_WARN 4 /* warning */ -#define CE_ALERT 1 /* alert */ -#define CE_PANIC 0 /* panic */ - -extern void cmn_err(int, char *, ...) - __attribute__ ((format (printf, 2, 3))); +#define CE_DEBUG KERN_DEBUG +#define CE_CONT KERN_INFO +#define CE_NOTE KERN_NOTICE +#define CE_WARN KERN_WARNING +#define CE_ALERT KERN_ALERT +#define CE_PANIC KERN_EMERG + +#define cmn_err(lvl, fmt, args...) \ + do { \ + printk(lvl fmt, ## args); \ + BUG_ON(strncmp(lvl, KERN_EMERG, strlen(KERN_EMERG)) == 0); \ + } while (0) + +#define xfs_fs_cmn_err(lvl, mp, fmt, args...) \ + do { \ + printk(lvl "Filesystem %s: " fmt, (mp)->m_fsname, ## args); \ + BUG_ON(strncmp(lvl, KERN_EMERG, strlen(KERN_EMERG)) == 0); \ + } while (0) + +/* All callers to xfs_cmn_err use CE_ALERT, so don't bother testing lvl */ +#define xfs_cmn_err(panic_tag, lvl, mp, fmt, args...) \ + do { \ + int panic = 0; \ + if (xfs_panic_mask && (xfs_panic_mask & panic_tag)) { \ + printk(KERN_ALERT "XFS: Transforming an alert into a BUG."); \ + panic = 1; \ + } \ + printk(KERN_ALERT "Filesystem %s: " fmt, (mp)->m_fsname, ## args); \ + BUG_ON(panic); \ + } while (0) + extern void assfail(char *expr, char *f, int l); #define ASSERT_ALWAYS(expr) \ diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c index c78cc6a..4c7db74 100644 --- a/fs/xfs/xfs_error.c +++ b/fs/xfs/xfs_error.c @@ -152,37 +152,6 @@ xfs_errortag_clearall(xfs_mount_t *mp, int loud) } #endif /* DEBUG */ - -void -xfs_fs_cmn_err(int level, xfs_mount_t *mp, char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - xfs_fs_vcmn_err(level, mp, fmt, ap); - va_end(ap); -} - -void -xfs_cmn_err(int panic_tag, int level, xfs_mount_t *mp, char *fmt, ...) -{ - va_list ap; - -#ifdef DEBUG - xfs_panic_mask |= (XFS_PTAG_SHUTDOWN_CORRUPT | XFS_PTAG_LOGRES); -#endif - - if (xfs_panic_mask && (xfs_panic_mask & panic_tag) - && (level & CE_ALERT)) { - level &= ~CE_ALERT; - level |= CE_PANIC; - cmn_err(CE_ALERT, "XFS: Transforming an alert into a BUG."); - } - va_start(ap, fmt); - xfs_fs_vcmn_err(level, mp, fmt, ap); - va_end(ap); -} - void xfs_error_report( const char *tag, diff --git a/fs/xfs/xfs_error.h b/fs/xfs/xfs_error.h index f338847..6b518d2 100644 --- a/fs/xfs/xfs_error.h +++ b/fs/xfs/xfs_error.h @@ -162,21 +162,15 @@ extern int xfs_errortag_clearall(xfs_mount_t *mp, int loud); struct xfs_mount; -extern void xfs_fs_vcmn_err(int level, struct xfs_mount *mp, - char *fmt, va_list ap) - __attribute__ ((format (printf, 3, 0))); -extern void xfs_cmn_err(int panic_tag, int level, struct xfs_mount *mp, - char *fmt, ...) - __attribute__ ((format (printf, 4, 5))); -extern void xfs_fs_cmn_err(int level, struct xfs_mount *mp, char *fmt, ...) - __attribute__ ((format (printf, 3, 4))); - extern void xfs_hex_dump(void *p, int length); #define xfs_fs_repair_cmn_err(level, mp, fmt, args...) \ xfs_fs_cmn_err(level, mp, fmt " Unmount and run xfs_repair.", ## args) #define xfs_fs_mount_cmn_err(f, fmt, args...) \ - ((f & XFS_MFSI_QUIET)? (void)0 : cmn_err(CE_WARN, "XFS: " fmt, ## args)) + do { \ + if (!(f & XFS_MFSI_QUIET)) \ + cmn_err(CE_WARN, "XFS: " fmt, ## args); \ + } while (0) #endif /* __XFS_ERROR_H__ */ diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index abdcbd0..2209035 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -431,7 +431,7 @@ xfs_log_mount( cmn_err(CE_NOTE, "XFS mounting filesystem %s", mp->m_fsname); else { cmn_err(CE_NOTE, - "!Mounting filesystem \"%s\" in no-recovery mode. Filesystem will be inconsistent.", + "Mounting filesystem \"%s\" in no-recovery mode. Filesystem will be inconsistent.", mp->m_fsname); ASSERT(mp->m_flags & XFS_MOUNT_RDONLY); } diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 6e7dfbb..411f3a9 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3934,7 +3934,7 @@ xlog_recover_finish( log->l_flags &= ~XLOG_RECOVERY_NEEDED; } else { cmn_err(CE_DEBUG, - "!Ending clean XFS mount for filesystem: %s\n", + "Ending clean XFS mount for filesystem: %s\n", log->l_mp->m_fsname); } return 0; -- 1.7.2.3 From lmcilroy@redhat.com Thu Dec 2 21:50:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_63, J_CHICKENPOX_74 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB33o0Rw059397 for ; Thu, 2 Dec 2010 21:50:01 -0600 X-ASG-Debug-ID: 1291348304-6039002c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx3-phx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 86E4C140D133 for ; Thu, 2 Dec 2010 19:51:44 -0800 (PST) Received: from mx3-phx2.redhat.com (mx3-phx2.redhat.com [209.132.183.24]) by cuda.sgi.com with ESMTP id C8aEQCkSdAmJ8kZ3 for ; Thu, 02 Dec 2010 19:51:44 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation Received: from mail05.corp.redhat.com (zmail05.collab.prod.int.phx2.redhat.com [10.5.5.46]) by mx3-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id oB33pW0H003246; Thu, 2 Dec 2010 22:51:32 -0500 Date: Thu, 2 Dec 2010 22:51:32 -0500 (EST) From: Lachlan McIlroy Reply-To: Lachlan McIlroy To: Dave Chinner Cc: xfs@oss.sgi.com Message-ID: <275948151.359301291348292101.JavaMail.root@zmail05.collab.prod.int.phx2.redhat.com> In-Reply-To: <121488966.359171291347997519.JavaMail.root@zmail05.collab.prod.int.phx2.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: prevent NMI timeouts in cmn_err Subject: Re: [PATCH] xfs: prevent NMI timeouts in cmn_err MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.5.5.71] X-Mailer: Zimbra 5.0.21_GA_3150.RHEL4_64 (ZimbraWebClient - FF3.0 (Linux)/5.0.21_GA_3150.RHEL4_64) X-Barracuda-Connect: mx3-phx2.redhat.com[209.132.183.24] X-Barracuda-Start-Time: 1291348305 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dave, overall it looks good - just a few minor points below. Thanks for doing this. ----- "Dave Chinner" wrote: > From: Dave Chinner > > We currently have a global error message buffer in cmn_err that is > protected by a spin lock that disables interrupts. Recently there > have been reports of NMI timeouts occurring when the console is > being flooded by SCSI error reports due to cmn_err() getting stuck > trying to print to the console while holding this lock (i.e. with > interrupts disabled). The NMI watchdog is seeing this CPU as > non-responding and so is triggering a panic. While the trigger for > the reported case is SCSI errors, pretty much anything that spams > the kernel log could cause this to occur. > > Realistically the only reason that we have the intemediate message > buffer is to prepend the correct kernel log level prefix to the log > message. The only reason we have the lock is to protect the global > message buffer and the only reason the message buffer is global is > to keep it off the stack. Hence if we can avoid needing a global > message buffer we avoid needing the lock, and we can do this with a > small amount of cleanup and some preprocessor tricks: > > 1. clean up xfs_cmn_err() panic mask functionality to avoid > needing debug code in xfs_cmn_err() > 2. remove the couple of "!" message prefixes that still exist that > the existing cmn_err() code steps over. > 3. redefine CE_* levels directly to KERN_* > 4. redefine cmn_err() and friends to use printk() directly > via variable argument length macros. > > By doing this, we can completely remove the cmn_err() code and the > lock that is causing the problems, and rely solely on printk() > serialisation to ensure that we don't get garbled messages. > > A series of followup patches is really needed to clean up all the > cmn_err() calls and related messages properly, but that results in a > series that is not easily back portable to enterprise kernels. Hence > this initial fix is only to address the direct problem in the lowest > impact way possible. > > Signed-off-by: Dave Chinner > --- > fs/xfs/linux-2.6/xfs_sysctl.c | 22 +++++++++++- > fs/xfs/support/debug.c | 76 > ----------------------------------------- > fs/xfs/support/debug.h | 40 +++++++++++++++++----- > fs/xfs/xfs_error.c | 31 ----------------- > fs/xfs/xfs_error.h | 14 ++----- > fs/xfs/xfs_log.c | 2 +- > fs/xfs/xfs_log_recover.c | 2 +- > 7 files changed, 58 insertions(+), 129 deletions(-) > > diff --git a/fs/xfs/linux-2.6/xfs_sysctl.c > b/fs/xfs/linux-2.6/xfs_sysctl.c > index 7bb5092..768acd8 100644 > --- a/fs/xfs/linux-2.6/xfs_sysctl.c > +++ b/fs/xfs/linux-2.6/xfs_sysctl.c > @@ -51,6 +51,26 @@ xfs_stats_clear_proc_handler( > > return ret; > } > + > +STATIC int > +xfs_panic_mask_proc_handler( > + ctl_table *ctl, > + int write, > + void __user *buffer, > + size_t *lenp, > + loff_t *ppos) > +{ > + int ret, *valp = ctl->data; > + > + ret = proc_dointvec_minmax(ctl, write, buffer, lenp, ppos); > + if (!ret && write) { > + xfs_panic_mask = *valp; > +#ifdef DEBUG > + xfs_panic_mask |= (XFS_PTAG_SHUTDOWN_CORRUPT | XFS_PTAG_LOGRES); > +#endif > + } > + return ret; > +} > #endif /* CONFIG_PROC_FS */ > > static ctl_table xfs_table[] = { > @@ -77,7 +97,7 @@ static ctl_table xfs_table[] = { > .data = &xfs_params.panic_mask.val, > .maxlen = sizeof(int), > .mode = 0644, > - .proc_handler = proc_dointvec_minmax, > + .proc_handler = xfs_panic_mask_proc_handler, > .extra1 = &xfs_params.panic_mask.min, > .extra2 = &xfs_params.panic_mask.max > }, > diff --git a/fs/xfs/support/debug.c b/fs/xfs/support/debug.c > index 975aa10..fa39e98 100644 > --- a/fs/xfs/support/debug.c > +++ b/fs/xfs/support/debug.c > @@ -25,82 +25,6 @@ > #include "xfs_mount.h" > #include "xfs_error.h" > > -static char message[1024]; /* keep it off the stack */ > -static DEFINE_SPINLOCK(xfs_err_lock); > - > -/* Translate from CE_FOO to KERN_FOO, err_level(CE_FOO) == KERN_FOO > */ > -#define XFS_MAX_ERR_LEVEL 7 > -#define XFS_ERR_MASK ((1 << 3) - 1) > -static const char * const err_level[XFS_MAX_ERR_LEVEL+1] = > - {KERN_EMERG, KERN_ALERT, KERN_CRIT, > - KERN_ERR, KERN_WARNING, KERN_NOTICE, > - KERN_INFO, KERN_DEBUG}; > - > -void > -cmn_err(register int level, char *fmt, ...) > -{ > - char *fp = fmt; > - int len; > - ulong flags; > - va_list ap; > - > - level &= XFS_ERR_MASK; > - if (level > XFS_MAX_ERR_LEVEL) > - level = XFS_MAX_ERR_LEVEL; > - spin_lock_irqsave(&xfs_err_lock,flags); > - va_start(ap, fmt); > - if (*fmt == '!') fp++; > - len = vsnprintf(message, sizeof(message), fp, ap); > - if (len >= sizeof(message)) > - len = sizeof(message) - 1; > - if (message[len-1] == '\n') > - message[len-1] = 0; > - printk("%s%s\n", err_level[level], message); > - va_end(ap); > - spin_unlock_irqrestore(&xfs_err_lock,flags); > - BUG_ON(level == CE_PANIC); > -} > - > -void > -xfs_fs_vcmn_err( > - int level, > - struct xfs_mount *mp, > - char *fmt, > - va_list ap) > -{ > - unsigned long flags; > - int len = 0; > - > - level &= XFS_ERR_MASK; > - if (level > XFS_MAX_ERR_LEVEL) > - level = XFS_MAX_ERR_LEVEL; > - > - spin_lock_irqsave(&xfs_err_lock,flags); > - > - if (mp) { > - len = sprintf(message, "Filesystem \"%s\": ", mp->m_fsname); > - > - /* > - * Skip the printk if we can't print anything useful > - * due to an over-long device name. > - */ > - if (len >= sizeof(message)) > - goto out; > - } > - > - len = vsnprintf(message + len, sizeof(message) - len, fmt, ap); > - if (len >= sizeof(message)) > - len = sizeof(message) - 1; > - if (message[len-1] == '\n') > - message[len-1] = 0; > - > - printk("%s%s\n", err_level[level], message); > - out: > - spin_unlock_irqrestore(&xfs_err_lock,flags); > - > - BUG_ON(level == CE_PANIC); > -} > - > void > assfail(char *expr, char *file, int line) > { > diff --git a/fs/xfs/support/debug.h b/fs/xfs/support/debug.h > index d2d2046..f659bd0 100644 > --- a/fs/xfs/support/debug.h > +++ b/fs/xfs/support/debug.h > @@ -20,15 +20,37 @@ > > #include > > -#define CE_DEBUG 7 /* debug */ > -#define CE_CONT 6 /* continuation */ > -#define CE_NOTE 5 /* notice */ > -#define CE_WARN 4 /* warning */ > -#define CE_ALERT 1 /* alert */ > -#define CE_PANIC 0 /* panic */ > - > -extern void cmn_err(int, char *, ...) > - __attribute__ ((format (printf, 2, 3))); > +#define CE_DEBUG KERN_DEBUG > +#define CE_CONT KERN_INFO > +#define CE_NOTE KERN_NOTICE > +#define CE_WARN KERN_WARNING > +#define CE_ALERT KERN_ALERT > +#define CE_PANIC KERN_EMERG > + > +#define cmn_err(lvl, fmt, args...) \ > + do { \ > + printk(lvl fmt, ## args); \ The old cmn_err() routine would append a newline if one was not supplied. As far as I know printk() will not do the same so either we need to fix all calls to cmn_err() to supply a '\n' or add it here (at the risk of having two newlines) - maybe: printk(lvl fmt "\n", ## args); > + BUG_ON(strncmp(lvl, KERN_EMERG, strlen(KERN_EMERG)) == 0); \ > + } while (0) > + > +#define xfs_fs_cmn_err(lvl, mp, fmt, args...) \ > + do { \ > + printk(lvl "Filesystem %s: " fmt, (mp)->m_fsname, ## args); \ printk(lvl "Filesystem %s: " fmt "\n", (mp)->m_fsname, ## args); > + BUG_ON(strncmp(lvl, KERN_EMERG, strlen(KERN_EMERG)) == 0); \ > + } while (0) > + > +/* All callers to xfs_cmn_err use CE_ALERT, so don't bother testing > lvl */ > +#define xfs_cmn_err(panic_tag, lvl, mp, fmt, args...) \ > + do { \ > + int panic = 0; \ > + if (xfs_panic_mask && (xfs_panic_mask & panic_tag)) { \ > + printk(KERN_ALERT "XFS: Transforming an alert into a BUG."); \ > + panic = 1; \ > + } \ > + printk(KERN_ALERT "Filesystem %s: " fmt, (mp)->m_fsname, ## args); > \ > + BUG_ON(panic); \ > + } while (0) I think we can simplify this case a bit and remove the panic variable, like this: do { \ printk(KERN_ALERT "Filesystem %s: " fmt "\n", (mp)->m_fsname, ## args); if (xfs_panic_mask && (xfs_panic_mask & panic_tag)) { \ printk(KERN_ALERT "XFS: Transforming an alert into a BUG.\n"); \ BUG_ON(1); \ } \ } while (0) This also reorders the messages which I think makes more sense. > + > extern void assfail(char *expr, char *f, int l); > > #define ASSERT_ALWAYS(expr) \ > diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c > index c78cc6a..4c7db74 100644 > --- a/fs/xfs/xfs_error.c > +++ b/fs/xfs/xfs_error.c > @@ -152,37 +152,6 @@ xfs_errortag_clearall(xfs_mount_t *mp, int loud) > } > #endif /* DEBUG */ > > - > -void > -xfs_fs_cmn_err(int level, xfs_mount_t *mp, char *fmt, ...) > -{ > - va_list ap; > - > - va_start(ap, fmt); > - xfs_fs_vcmn_err(level, mp, fmt, ap); > - va_end(ap); > -} > - > -void > -xfs_cmn_err(int panic_tag, int level, xfs_mount_t *mp, char *fmt, > ...) > -{ > - va_list ap; > - > -#ifdef DEBUG > - xfs_panic_mask |= (XFS_PTAG_SHUTDOWN_CORRUPT | XFS_PTAG_LOGRES); > -#endif > - > - if (xfs_panic_mask && (xfs_panic_mask & panic_tag) > - && (level & CE_ALERT)) { > - level &= ~CE_ALERT; > - level |= CE_PANIC; > - cmn_err(CE_ALERT, "XFS: Transforming an alert into a BUG."); > - } > - va_start(ap, fmt); > - xfs_fs_vcmn_err(level, mp, fmt, ap); > - va_end(ap); > -} > - > void > xfs_error_report( > const char *tag, > diff --git a/fs/xfs/xfs_error.h b/fs/xfs/xfs_error.h > index f338847..6b518d2 100644 > --- a/fs/xfs/xfs_error.h > +++ b/fs/xfs/xfs_error.h > @@ -162,21 +162,15 @@ extern int xfs_errortag_clearall(xfs_mount_t > *mp, int loud); > > struct xfs_mount; > > -extern void xfs_fs_vcmn_err(int level, struct xfs_mount *mp, > - char *fmt, va_list ap) > - __attribute__ ((format (printf, 3, 0))); > -extern void xfs_cmn_err(int panic_tag, int level, struct xfs_mount > *mp, > - char *fmt, ...) > - __attribute__ ((format (printf, 4, 5))); > -extern void xfs_fs_cmn_err(int level, struct xfs_mount *mp, char > *fmt, ...) > - __attribute__ ((format (printf, 3, 4))); > - > extern void xfs_hex_dump(void *p, int length); > > #define xfs_fs_repair_cmn_err(level, mp, fmt, args...) \ > xfs_fs_cmn_err(level, mp, fmt " Unmount and run xfs_repair.", ## > args) > > #define xfs_fs_mount_cmn_err(f, fmt, args...) \ > - ((f & XFS_MFSI_QUIET)? (void)0 : cmn_err(CE_WARN, "XFS: " fmt, ## > args)) > + do { \ > + if (!(f & XFS_MFSI_QUIET)) \ > + cmn_err(CE_WARN, "XFS: " fmt, ## args); \ > + } while (0) > > #endif /* __XFS_ERROR_H__ */ > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > index abdcbd0..2209035 100644 > --- a/fs/xfs/xfs_log.c > +++ b/fs/xfs/xfs_log.c > @@ -431,7 +431,7 @@ xfs_log_mount( > cmn_err(CE_NOTE, "XFS mounting filesystem %s", mp->m_fsname); > else { > cmn_err(CE_NOTE, > - "!Mounting filesystem \"%s\" in no-recovery mode. Filesystem will > be inconsistent.", > + "Mounting filesystem \"%s\" in no-recovery mode. Filesystem will > be inconsistent.", > mp->m_fsname); > ASSERT(mp->m_flags & XFS_MOUNT_RDONLY); > } > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > index 6e7dfbb..411f3a9 100644 > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -3934,7 +3934,7 @@ xlog_recover_finish( > log->l_flags &= ~XLOG_RECOVERY_NEEDED; > } else { > cmn_err(CE_DEBUG, > - "!Ending clean XFS mount for filesystem: %s\n", > + "Ending clean XFS mount for filesystem: %s\n", > log->l_mp->m_fsname); > } > return 0; > -- > 1.7.2.3 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From SRS0+ohoZ+6+fromorbit.com=david@internode.on.net Thu Dec 2 22:37:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_32, J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB34b6w1061885 for ; Thu, 2 Dec 2010 22:37:07 -0600 X-ASG-Debug-ID: 1291351129-1ebd00650000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 939671BF14B for ; Thu, 2 Dec 2010 20:38:49 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id wXxizzRzz70u7Hqv for ; Thu, 02 Dec 2010 20:38:49 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 48350448-1927428 for ; Fri, 03 Dec 2010 15:08:48 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PONPy-00087q-VW for xfs@oss.sgi.com; Fri, 03 Dec 2010 15:38:47 +1100 Date: Fri, 3 Dec 2010 15:38:46 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: prevent NMI timeouts in cmn_err Subject: Re: [PATCH] xfs: prevent NMI timeouts in cmn_err Message-ID: <20101203043846.GB23339@dastard> References: <1291341315-31338-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1291341315-31338-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1291351130 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48324 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, Dec 03, 2010 at 12:55:15PM +1100, Dave Chinner wrote: > From: Dave Chinner > > We currently have a global error message buffer in cmn_err that is > protected by a spin lock that disables interrupts. Recently there > have been reports of NMI timeouts occurring when the console is > being flooded by SCSI error reports due to cmn_err() getting stuck > trying to print to the console while holding this lock (i.e. with > interrupts disabled). The NMI watchdog is seeing this CPU as > non-responding and so is triggering a panic. While the trigger for > the reported case is SCSI errors, pretty much anything that spams > the kernel log could cause this to occur. > > Realistically the only reason that we have the intemediate message > buffer is to prepend the correct kernel log level prefix to the log > message. The only reason we have the lock is to protect the global > message buffer and the only reason the message buffer is global is > to keep it off the stack. Hence if we can avoid needing a global > message buffer we avoid needing the lock, and we can do this with a > small amount of cleanup and some preprocessor tricks: > > 1. clean up xfs_cmn_err() panic mask functionality to avoid > needing debug code in xfs_cmn_err() > 2. remove the couple of "!" message prefixes that still exist that > the existing cmn_err() code steps over. > 3. redefine CE_* levels directly to KERN_* > 4. redefine cmn_err() and friends to use printk() directly > via variable argument length macros. > > By doing this, we can completely remove the cmn_err() code and the > lock that is causing the problems, and rely solely on printk() > serialisation to ensure that we don't get garbled messages. > > A series of followup patches is really needed to clean up all the > cmn_err() calls and related messages properly, but that results in a > series that is not easily back portable to enterprise kernels. Hence > this initial fix is only to address the direct problem in the lowest > impact way possible. FWIW, while these macros are the best way to make a simple backport is possible, I just discovered that mainline has a %pV format operator that allows an implementation like: void xfs_fs_cmn_err( const char *lvl, struct xfs_mount *mp, const char *fmt, ...) { struct va_format vaf; va_list args; va_start(args, fmt); vaf.fmt = fmt; vaf.va = &args; printk("%sFilesystem %s: %pV", lvl, mp->m_fsname, &vaf); va_end(args); BUG_ON(strncmp(lvl, KERN_EMERG, strlen(KERN_EMERG)) == 0); } Would this be a preferable method for replacing the existing implementations, or are the macros good enough as the first step of a mainline cleanup? Cheers,,, Dave. -- Dave Chinner david@fromorbit.com From SRS0+BQCf+6+fromorbit.com=david@internode.on.net Thu Dec 2 23:23:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB35N6WR063608 for ; Thu, 2 Dec 2010 23:23:06 -0600 X-ASG-Debug-ID: 1291353888-1bf302450000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6328F1BF58E for ; Thu, 2 Dec 2010 21:24:48 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id 8cf0E186evYVNFKT for ; Thu, 02 Dec 2010 21:24:48 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 48410981-1927428 for multiple; Fri, 03 Dec 2010 15:54:47 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1POO8T-0008Ab-Dr; Fri, 03 Dec 2010 16:24:45 +1100 Date: Fri, 3 Dec 2010 16:24:45 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/8] xfs: Pull EFI/EFD handling out from under the AIL lock Subject: Re: [PATCH 1/8] xfs: Pull EFI/EFD handling out from under the AIL lock Message-ID: <20101203052445.GC23339@dastard> References: <1290993152-20999-1-git-send-email-david@fromorbit.com> <1290993152-20999-2-git-send-email-david@fromorbit.com> <20101130201734.GA16079@infradead.org> <20101202012841.GL16922@dastard> <20101202113849.GA21365@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101202113849.GA21365@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1291353890 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 02, 2010 at 06:38:49AM -0500, Christoph Hellwig wrote: > On Thu, Dec 02, 2010 at 12:28:41PM +1100, Dave Chinner wrote: > > > - there is a behaviour change about the xfs_trans_del_item call > > > in xfs_efi_item_unpin - before it was protected by the > > > XFS_EFI_CANCELED which was never set, and now it's not. > > > > XFS_EFI_CANCELED has not been set in the code base since > > xfs_efi_cancel() was removed back in 2006 by commit > > 065d312e15902976d256ddaf396a7950ec0350a8 ("[XFS] Remove unused > > iop_abort log item operation), and even then xfs_efi_cancel() was > > never called. I haven't tracked it back further than that (beyond > > git history), but handling of efis in cancelled transactions has > > been broken for a long time. > > > > Basically, when we get an IOP_UNPIN(lip, 1); call from > > xfs_trans_uncommit() (i.e. remove == 1), if we don't free the log > > item descriptor we leak it. IOWs, the new behaviour introduced in > > this patch is actually the correct behaviour. > > Maybe fix this issue first in a separate patch, instead of hiding it > in a bigger one. Ok, I'll split it out. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+EuKW+6+fromorbit.com=david@internode.on.net Fri Dec 3 00:44:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB36i8iw068839 for ; Fri, 3 Dec 2010 00:44:08 -0600 X-ASG-Debug-ID: 1291358751-6aa0011c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EE5041BBBA4 for ; Thu, 2 Dec 2010 22:45:51 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id R0JAypqSAnXnyy86 for ; Thu, 02 Dec 2010 22:45:51 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 48057601-1927428 for multiple; Fri, 03 Dec 2010 17:15:50 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1POPOu-0008FY-N7; Fri, 03 Dec 2010 17:45:48 +1100 Date: Fri, 3 Dec 2010 17:45:48 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 02/14] xfs: clean up log space grant functions Subject: Re: [PATCH 02/14] xfs: clean up log space grant functions Message-ID: <20101203064548.GD23339@dastard> References: <1290994712-21376-1-git-send-email-david@fromorbit.com> <1290994712-21376-3-git-send-email-david@fromorbit.com> <20101201123032.GA20378@infradead.org> <20101202014833.GN16922@dastard> <20101202114049.GB21365@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101202114049.GB21365@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1291358752 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0003 1.0000 -2.0194 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48332 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 02, 2010 at 06:40:50AM -0500, Christoph Hellwig wrote: > On Thu, Dec 02, 2010 at 12:48:33PM +1100, Dave Chinner wrote: > > Ok, so your main objection is the needless addition to the queue? > > That can be avoided easily enough via a local variable. Would that > > be sufficient to alleviate your concerns? > > The main objection is that the new code might be a bit shorted, > but is a lot less readable. If you really want it go with it and > an updated changelog mentioning the behaviour change, but I don't > really feel too good about it. OK, I'll drop it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+QyiU+6+fromorbit.com=david@internode.on.net Fri Dec 3 02:35:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_63 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB38ZJOl073215 for ; Fri, 3 Dec 2010 02:35:20 -0600 X-ASG-Debug-ID: 1291365421-03da01220000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7A74C1E90C16 for ; Fri, 3 Dec 2010 00:37:01 -0800 (PST) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id Ullid87kvhgdvJIZ for ; Fri, 03 Dec 2010 00:37:01 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 48679845-1927428 for multiple; Fri, 03 Dec 2010 19:07:00 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1POR8V-0008Lx-4j; Fri, 03 Dec 2010 19:36:59 +1100 Date: Fri, 3 Dec 2010 19:36:59 +1100 From: Dave Chinner To: Lachlan McIlroy Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: prevent NMI timeouts in cmn_err Subject: Re: [PATCH] xfs: prevent NMI timeouts in cmn_err Message-ID: <20101203083659.GE23339@dastard> References: <121488966.359171291347997519.JavaMail.root@zmail05.collab.prod.int.phx2.redhat.com> <275948151.359301291348292101.JavaMail.root@zmail05.collab.prod.int.phx2.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <275948151.359301291348292101.JavaMail.root@zmail05.collab.prod.int.phx2.redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1291365423 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48340 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 02, 2010 at 10:51:32PM -0500, Lachlan McIlroy wrote: > Dave, overall it looks good - just a few minor points below. > Thanks for doing this. > > ----- "Dave Chinner" wrote: [snip] > > -void > > -cmn_err(register int level, char *fmt, ...) > > -{ > > - char *fp = fmt; > > - int len; > > - ulong flags; > > - va_list ap; > > - > > - level &= XFS_ERR_MASK; > > - if (level > XFS_MAX_ERR_LEVEL) > > - level = XFS_MAX_ERR_LEVEL; > > - spin_lock_irqsave(&xfs_err_lock,flags); > > - va_start(ap, fmt); > > - if (*fmt == '!') fp++; > > - len = vsnprintf(message, sizeof(message), fp, ap); > > - if (len >= sizeof(message)) > > - len = sizeof(message) - 1; > > - if (message[len-1] == '\n') > > - message[len-1] = 0; ^^^^^^^^^^^^^^^^^^^^^^^^^^^ > > - printk("%s%s\n", err_level[level], message); > > - va_end(ap); > > - spin_unlock_irqrestore(&xfs_err_lock,flags); > > - BUG_ON(level == CE_PANIC); > > -} [snip] > > +#define CE_DEBUG KERN_DEBUG > > +#define CE_CONT KERN_INFO > > +#define CE_NOTE KERN_NOTICE > > +#define CE_WARN KERN_WARNING > > +#define CE_ALERT KERN_ALERT > > +#define CE_PANIC KERN_EMERG > > + > > +#define cmn_err(lvl, fmt, args...) \ > > + do { \ > > + printk(lvl fmt, ## args); \ > > The old cmn_err() routine would append a newline if one was not supplied. > As far as I know printk() will not do the same so either we need to fix > all calls to cmn_err() to supply a '\n' or add it here (at the risk of > having two newlines) - maybe: See above - I think you have it the wrong way around - it looks to me like the old cmn_err() stripped the newline character if it existed, then added one itself. > printk(lvl fmt "\n", ## args); printk() is actually pretty tolerant of missing newlines - if it detects the previous printk() was not newline terminated and the next one starts with a log level that is not KERN_CONT, it will print the new message on a new line automatically. This is the code in vprintk() that handles it: /* Do we have a loglevel in the string? */ if (p[0] == '<') { unsigned char c = p[1]; if (c && p[2] == '>') { switch (c) { case '0' ... '7': /* loglevel */ current_log_level = c - '0'; /* Fallthrough - make sure we're on a new line */ case 'd': /* KERN_DEFAULT */ if (!new_text_line) { emit_log_char('\n'); new_text_line = 1; } /* Fallthrough - skip the loglevel */ case 'c': /* KERN_CONT */ p += 3; break; } } } So we are probably OK not to need additional newlines. Indeed, I didn't notice the output being screwed up without them. ;) I can add them if you want, though. > > > + BUG_ON(strncmp(lvl, KERN_EMERG, strlen(KERN_EMERG)) == 0); \ > > + } while (0) > > + > > +#define xfs_fs_cmn_err(lvl, mp, fmt, args...) \ > > + do { \ > > + printk(lvl "Filesystem %s: " fmt, (mp)->m_fsname, ## args); \ > > printk(lvl "Filesystem %s: " fmt "\n", (mp)->m_fsname, ## args); > > > + BUG_ON(strncmp(lvl, KERN_EMERG, strlen(KERN_EMERG)) == 0); \ > > + } while (0) > > + > > +/* All callers to xfs_cmn_err use CE_ALERT, so don't bother testing > > lvl */ > > +#define xfs_cmn_err(panic_tag, lvl, mp, fmt, args...) \ > > + do { \ > > + int panic = 0; \ > > + if (xfs_panic_mask && (xfs_panic_mask & panic_tag)) { \ > > + printk(KERN_ALERT "XFS: Transforming an alert into a BUG."); \ > > + panic = 1; \ > > + } \ > > + printk(KERN_ALERT "Filesystem %s: " fmt, (mp)->m_fsname, ## args); > > \ > > + BUG_ON(panic); \ > > + } while (0) > > I think we can simplify this case a bit and remove the panic variable, > like this: > > do { \ > printk(KERN_ALERT "Filesystem %s: " fmt "\n", (mp)->m_fsname, ## args); > if (xfs_panic_mask && (xfs_panic_mask & panic_tag)) { \ > printk(KERN_ALERT "XFS: Transforming an alert into a BUG.\n"); \ > BUG_ON(1); \ > } \ > } while (0) > > This also reorders the messages which I think makes more sense. Definitely. That's a vast improvement. ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From spelic@shiftmail.org Fri Dec 3 08:06:46 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB3E6kdo090363 for ; Fri, 3 Dec 2010 08:06:46 -0600 X-ASG-Debug-ID: 1291385309-312b012f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from BLADE3.ISTI.CNR.IT (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4A59B1C90452 for ; Fri, 3 Dec 2010 06:08:29 -0800 (PST) Received: from BLADE3.ISTI.CNR.IT (blade3.isti.cnr.it [194.119.192.19]) by cuda.sgi.com with ESMTP id emKIeuHBESkn19E5 for ; Fri, 03 Dec 2010 06:08:29 -0800 (PST) Received: from SCRIPT-SPFWL-DAEMON.mx.isti.cnr.it by mx.isti.cnr.it (PMDF V6.5 #31825) id <01NUZL2FI08GLS7MS1@mx.isti.cnr.it> for xfs@oss.sgi.com; Fri, 03 Dec 2010 15:07:57 +0100 (MET) Received: from conversionlocal.isti.cnr.it by mx.isti.cnr.it (PMDF V6.5 #31825) id <01NUZL2E915SLS7X2C@mx.isti.cnr.it> for xfs@oss.sgi.com; Fri, 03 Dec 2010 15:07:54 +0100 (MET) Received: from [192.168.7.52] (firewall.itb.cnr.it [155.253.6.254]) by mx.isti.cnr.it (PMDF V6.5 #31826) with ESMTPSA id <01NUZL2CKKJ8LX5R9L@mx.isti.cnr.it>; Fri, 03 Dec 2010 15:07:52 +0100 (MET) Date: Fri, 03 Dec 2010 15:07:58 +0100 From: Spelic X-ASG-Orig-Subj: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram Subject: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram In-reply-to: <20101202230743.GZ16922@dastard> To: Dave Chinner Cc: "linux-kernel@vger.kernel.org" , xfs@oss.sgi.com, linux-lvm@redhat.com Message-id: <4CF8F9BE.6000604@shiftmail.org> MIME-version: 1.0 Content-type: text/plain; format=flowed; charset=ISO-8859-1 Content-transfer-encoding: 7bit User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.11) Gecko/20100713 Thunderbird/3.0.6 X-INSM-ip-source: 155.253.6.254 Auth Done References: <4CF7A539.1050206@shiftmail.org> <4CF7A9CF.2020904@shiftmail.org> <20101202230743.GZ16922@dastard> X-Barracuda-Connect: blade3.isti.cnr.it[194.119.192.19] X-Barracuda-Start-Time: 1291385310 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48361 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 12/03/2010 12:07 AM, Dave Chinner wrote: > This is a classic ENOSPC vs NFS client writeback overcommit caching > issue. Have a look at the block map output - I bet theres holes in > the file and it's only consuming 1.5GB of disk space. use xfs_bmap > to check this. du should tell you the same thing. > > Yes you are right! root@server:/mnt/ram# ll -h total 1.5G drwxr-xr-x 2 root root 21 2010-12-02 12:54 ./ drwxr-xr-x 3 root root 4.0K 2010-11-29 23:51 ../ -rw-r--r-- 1 root root 1.9G 2010-12-02 15:04 zerofile root@server:/mnt/ram# ls -lsh total 1.5G 1.5G -rw-r--r-- 1 root root 1.9G 2010-12-02 15:04 zerofile (it's a sparse file) root@server:/mnt/ram# xfs_bmap zerofile zerofile: 0: [0..786367]: 786496..1572863 1: [786368..1572735]: 2359360..3145727 2: [1572736..2232319]: 1593408..2252991 3: [2232320..2529279]: 285184..582143 4: [2529280..2531327]: hole 5: [2531328..2816407]: 96..285175 6: [2816408..2971511]: 582144..737247 7: [2971512..2971647]: hole 8: [2971648..2975183]: 761904..765439 9: [2975184..2975743]: hole 10: [2975744..2975751]: 765440..765447 11: [2975752..2977791]: hole 12: [2977792..2977799]: 765480..765487 13: [2977800..2979839]: hole 14: [2979840..2979847]: 765448..765455 15: [2979848..2981887]: hole 16: [2981888..2981895]: 765472..765479 17: [2981896..2983935]: hole 18: [2983936..2983943]: 765456..765463 19: [2983944..2985983]: hole 20: [2985984..2985991]: 765464..765471 21: [2985992..3202903]: hole 22: [3202904..3215231]: 737248..749575 23: [3215232..3239767]: hole 24: [3239768..3252095]: 774104..786431 25: [3252096..3293015]: hole 26: [3293016..3305343]: 749576..761903 27: [3305344..3370839]: hole 28: [3370840..3383167]: 2252992..2265319 29: [3383168..3473239]: hole 30: [3473240..3485567]: 2265328..2277655 31: [3485568..3632983]: hole 32: [3632984..3645311]: 2277656..2289983 33: [3645312..3866455]: hole 34: [3866456..3878783]: 2289984..2302311 (many delayed allocation extents cannot be filled because space on device is finished) However ... > Basically, the NFS client overcommits the server filesystem space by > doing local writeback caching. Hence it caches 1.9GB of data before > it gets the first ENOSPC error back from the server at around 1.5GB > of written data. At that point, the data that gets ENOSPC errors is > tossed by the NFS client, and a ENOSPC error is placed on the > address space to be reported to the next write/sync call. That gets > to the dd process when it's 1.9GB into the write. > I'm no great expert but isn't this a design flaw in NFS? Ok in this case we were lucky it was all zeroes so XFS made a sparse file and could fit a 1.9GB into 1.5GB device size. In general with nonzero data it seems to me you will get data corruption because the NFS client thinks it has written the data while the NFS server really can't write more data than the device size. It's nice that the NFS server does local writeback caching but it should also cache the filesystem's free space (and check it periodically, since nfs-server is presumably not the only process writing in that filesystem) so that it doesn't accept more data than it can really write. Alternatively, when free space drops below 1GB (or a reasonable size based on network speed), nfs-server should turn off filesystem writeback caching. I can't repeat the test with urandom because it's too slow (8MB/sec !?). How come Linux hasn't got an "uurandom" device capable of e.g. 400MB/sec with only very weak randomness? But I have repeated the test over ethernet with a bunch of symlinks to a 100MB file created from urandom: At client side: # time cat randfile{001..020} | pv -b > /mnt/nfsram/randfile 1.95GB real 0m22.978s user 0m0.310s sys 0m5.360s At server side: # ls -lsh ram total 1.5G 1.5G -rw-r--r-- 1 root root 1.7G 2010-12-03 14:43 randfile # xfs_bmap ram/randfile ram/randfile: 0: [0..786367]: 786496..1572863 1: [786368..790527]: 96..4255 2: [790528..1130495]: hole 3: [1130496..1916863]: 2359360..3145727 4: [1916864..2682751]: 1593408..2359295 5: [2682752..3183999]: 285184..786431 6: [3184000..3387207]: 4256..207463 7: [3387208..3387391]: hole 8: [3387392..3391567]: 207648..211823 9: [3391568..3393535]: hole 10: [3393536..3393543]: 211824..211831 11: [3393544..3395583]: hole 12: [3395584..3395591]: 211832..211839 13: [3395592..3397631]: hole 14: [3397632..3397639]: 211856..211863 15: [3397640..3399679]: hole 16: [3399680..3399687]: 211848..211855 17: [3399688..3401727]: hole 18: [3401728..3409623]: 221984..229879 # dd if=/mnt/ram/randfile | wc -c 3409624+0 records in 3409624+0 records out 1745727488 1745727488 bytes (1.7 GB) copied, 5.72443 s, 305 MB/s The file is still sparse, and this time it certainly has data corruption (holes will be read as zeroes). I understand that the client receives Input/output error when this condition is hit, but the file written at server side has apparent size 1.8GB but the valid data in it is not 1.8GB. Is it good semantics? Wouldn't it be better for nfs-server to turn off writeback caching when it approaches a disk-full situation? And then I see another problem: As you see, xfs_fsr shows lots of holes, even with randomfile (this is taken from urandom so you can be sure it hasn't got many zeroes) already from offset 790528 sectors which is far from the disk full situation... First I checked that this does not happen by pushing less than 1.5GB of data. Ok it does not. Then I tried with exactly 15*100MB (files are 100MB, are symliks to a file which was created with dd if=/dev/urandom of=randfile.rnd bs=1M count=100) and this happened: client side: # time cat randfile{001..015} | pv -b > /mnt/nfsram/randfile 1.46GB real 0m18.265s user 0m0.260s sys 0m4.460s (please note: no I/O error at client side! blockdev --getsize64 /dev/ram0 == 1610612736) server side: # ls -ls ram total 1529676 1529676 -rw-r--r-- 1 root root 1571819520 2010-12-03 14:51 randfile # dd if=/mnt/ram/randfile | wc -c 3069960+0 records in 3069960+0 records out 1571819520 1571819520 bytes (1.6 GB) copied, 5.30442 s, 296 MB/s # xfs_bmap ram/randfile ram/randfile: 0: [0..112639]: 96..112735 1: [112640..208895]: 114784..211039 2: [208896..399359]: 285184..475647 3: [399360..401407]: 112736..114783 4: [401408..573439]: 475648..647679 5: [573440..937983]: 786496..1151039 6: [937984..1724351]: 2359360..3145727 7: [1724352..2383871]: 1593408..2252927 8: [2383872..2805695]: 1151040..1572863 9: [2805696..2944447]: 647680..786431 10: [2944448..2949119]: 211040..215711 11: [2949120..3055487]: 2252928..2359295 12: [3055488..3058871]: 215712..219095 13: [3058872..3059711]: hole 14: [3059712..3060143]: 219936..220367 15: [3060144..3061759]: hole 16: [3061760..3061767]: 220368..220375 17: [3061768..3063807]: hole 18: [3063808..3063815]: 220376..220383 19: [3063816..3065855]: hole 20: [3065856..3065863]: 220384..220391 21: [3065864..3067903]: hole 22: [3067904..3067911]: 220392..220399 23: [3067912..3069951]: hole 24: [3069952..3069959]: 220400..220407 Holes in a random file! This is data corruption, and nobody is notified of this data corruption: no error at client side or server side! Is it good semantics? How could client get notified of this? Some kind of fsync maybe? Thank you From npiggin@kernel.dk Fri Dec 3 11:10:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB3HA1aU097359 for ; Fri, 3 Dec 2010 11:10:01 -0600 X-ASG-Debug-ID: 1291396304-53c503dc0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail06.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B86801C90E6A for ; Fri, 3 Dec 2010 09:11:44 -0800 (PST) Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 8UMxFbXCxpE4bMxN for ; Fri, 03 Dec 2010 09:11:44 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvsEAPuy+Ex5LdV4/2dsb2JhbACjNXLDJ4VIBA Received: from ppp121-45-213-120.lns20.cbr1.internode.on.net (HELO laptop.local0.net) ([121.45.213.120]) by ipmail06.adl6.internode.on.net with ESMTP; 04 Dec 2010 03:41:42 +1030 Received: by laptop.local0.net (Postfix, from userid 1000) id B58542981A; Sat, 4 Dec 2010 04:11:40 +1100 (EST) Date: Sat, 4 Dec 2010 04:11:40 +1100 From: Nick Piggin To: Mike Snitzer Cc: LVM general discussion and development , Spelic , Christoph Hellwig , "linux-kernel@vger.kernel.org" , xfs@oss.sgi.com, npiggin@kernel.dk, dm-devel@redhat.com X-ASG-Orig-Subj: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram Subject: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram Message-ID: <20101203171140.GA11889@amd> References: <4CF7A539.1050206@shiftmail.org> <20101202141134.GA22012@infradead.org> <4CF7A9C4.2040607@shiftmail.org> <20101202141737.GA29799@infradead.org> <20101202212227.GA22703@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101202212227.GA22703@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1291396305 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48373 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 02, 2010 at 04:22:27PM -0500, Mike Snitzer wrote: > On Thu, Dec 02 2010 at 9:17am -0500, > Christoph Hellwig wrote: > > > On Thu, Dec 02, 2010 at 03:14:28PM +0100, Spelic wrote: > > > On 12/02/2010 03:11 PM, Christoph Hellwig wrote: > > > >I'm pretty sure you have CONFIG_DEBUG_BLOCK_EXT_DEVT enabled. This > > > >option must never be enabled, as it causes block devices to be > > > >randomly renumered. Together with the ramdisk driver overloading > > > >the BLKFLSBUF ioctl to discard all data it guarantees you to get > > > >data loss like yours. > > > > > > Nope... > > > > > > # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set > > > > Hmm, I suspect dm-linear's dumb forwarding of ioctls has the same > > effect. > > For the benefit of others: > - mkfs.xfs will avoid sending BLKFLSBUF to any device whose major is > ramdisk's major, this dates back to 2004: > http://oss.sgi.com/archives/xfs/2004-08/msg00463.html > - but because a kpartx partition overlay (linear DM mapping) is used for > the /dev/ram0p1 device, mkfs.xfs only sees a device with DM's major > - so mkfs.xfs sends BLKFLSBUF to the DM device blissfully unaware that > the backing device (behind the DM linear target) is a brd device > - DM will forward the BLKFLSBUF ioctl to brd, which triggers > drivers/block/brd.c:brd_ioctl (nuking the entire ramdisk in the > process) > > So coming full circle this is what hch was referring to when he > mentioned: > 1) "ramdisk driver overloading the BLKFLSBUF ioctl ..." > 2) "dm-linear's dumb forwarding of ioctls ..." > > I really can't see DM adding a specific check for ramdisk's major when > forwarding the BLKFLSBUF ioctl. > > brd has direct partition support (see commit d7853d1f8932c) so maybe > kpartx should just blacklist /dev/ram devices? > > Alternatively, what about switching brd away from overloading BLKFLSBUF > to a real implementation of (overloaded) BLKDISCARD support in brd.c? > One that doesn't blindly nuke the entire device but that properly > processes the discard request. Yeah the situation really sucks (mkfs.jfs doesn't work on ramdisk for the same reason). I want to unfortunately keep ioctl for compatibility, but adding new saner ones would be welcome. Also, having a non-default config or load time parameter for brd, to skip the special case, if that would help testing on older userspace. DISCARD is actually a problem for rd. To actually get proper correctness, you need to preload brd with pages, otherwise when doing stress tests, IO can require memory allocations and deadlock. If we add a discard that frees pages, that introduces the same problem. If you find any option useful for testing, however, patches are fine -- brd pretty much is only useful for testing nowadays. From tytso@thunk.org Fri Dec 3 12:13:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB3IDi4H099887 for ; Fri, 3 Dec 2010 12:13:45 -0600 X-ASG-Debug-ID: 1291400128-03b802b50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from thunker.thunk.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1A6261C91433 for ; Fri, 3 Dec 2010 10:15:28 -0800 (PST) Received: from thunker.thunk.org (thunk.org [69.25.196.29]) by cuda.sgi.com with ESMTP id lrOSMBAjqamrdbsI for ; Fri, 03 Dec 2010 10:15:28 -0800 (PST) Received: from root (helo=tytso-glaptop) by thunker.thunk.org with local-esmtp (Exim 4.50 #1 (Debian)) id 1POaAD-0001bK-S2; Fri, 03 Dec 2010 13:15:21 -0500 Received: from tytso by tytso-glaptop with local (Exim 4.71) (envelope-from ) id 1POaAC-00072v-GP; Fri, 03 Dec 2010 13:15:20 -0500 Date: Fri, 3 Dec 2010 13:15:20 -0500 From: "Ted Ts'o" To: Nick Piggin Cc: Mike Snitzer , LVM general discussion and development , Spelic , Christoph Hellwig , "linux-kernel@vger.kernel.org" , xfs@oss.sgi.com, dm-devel@redhat.com X-ASG-Orig-Subj: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram Subject: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram Message-ID: <20101203181520.GA26906@thunk.org> Mail-Followup-To: Ted Ts'o , Nick Piggin , Mike Snitzer , LVM general discussion and development , Spelic , Christoph Hellwig , "linux-kernel@vger.kernel.org" , xfs@oss.sgi.com, dm-devel@redhat.com References: <4CF7A539.1050206@shiftmail.org> <20101202141134.GA22012@infradead.org> <4CF7A9C4.2040607@shiftmail.org> <20101202141737.GA29799@infradead.org> <20101202212227.GA22703@redhat.com> <20101203171140.GA11889@amd> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101203171140.GA11889@amd> User-Agent: Mutt/1.5.20 (2009-06-14) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on thunker.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: thunk.org[69.25.196.29] X-Barracuda-Start-Time: 1291400129 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48377 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, Dec 04, 2010 at 04:11:40AM +1100, Nick Piggin wrote: > > Alternatively, what about switching brd away from overloading BLKFLSBUF > > to a real implementation of (overloaded) BLKDISCARD support in brd.c? > > One that doesn't blindly nuke the entire device but that properly > > processes the discard request. > > Yeah the situation really sucks (mkfs.jfs doesn't work on ramdisk > for the same reason). > > I want to unfortunately keep ioctl for compatibility, but adding new > saner ones would be welcome. Also, having a non-default config or > load time parameter for brd, to skip the special case, if that would > help testing on older userspace. How many programs actually depend on BLKFLSBUF dropping the pages used in /dev/ram? The fact that it did this at all was a historical accident of how the original /dev/ram was implemented (in the buffer cache directly), and not anything that was intended. I think that's something that we should be able to fix, since the number of programs that knowly operate on the ramdisk is quite small. Just a few system programs used by distributions in their early boot scripts.... So I would argue for dropping the "special" behavior of BLKFLSBUF for /dev/ram. - Ted From ermorris@ucsc.edu Fri Dec 3 18:41:43 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,HTML_MESSAGE autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB40fgiI114194 for ; Fri, 3 Dec 2010 18:41:42 -0600 X-ASG-Debug-ID: 1291423404-085803700000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ucsc.edu (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 32E021410F8D for ; Fri, 3 Dec 2010 16:43:24 -0800 (PST) Received: from ucsc.edu (email-prod-out-1.ucsc.edu [128.114.129.85]) by cuda.sgi.com with ESMTP id ZSEDVQmgV7tOxMTi for ; Fri, 03 Dec 2010 16:43:24 -0800 (PST) X-UCSC-EDU-Sender: X-UCSC-EDU-Scanned-By: email-prod-out-1 X-UCSC-EDU-Submitted-Via: SMTP [128.114.125.121] X-UCSC-EDU-ClamAVCheck: not spam, ClamAV(signaure=none) X-UCSC-EDU-SpamCheck: No, score=-1.439 required=5 tests=ALL_TRUSTED, HTML_MESSAGE X-UCSC-EDU-SpamScore: X-UCSC-EDU-SpamFlag: NO X-UCSC-EDU-SpamReport: -1.4 ALL_TRUSTED Passed through trusted hosts only via SMTP X-UCSC-EDU-SpamReport: 0.0 HTML_MESSAGE BODY: HTML included in message Received: from [128.114.125.121] (HELO ucsc.edu) by email-prod-out-1.ucsc.edu (CommuniGate Pro SMTP 5.2.13) with ESMTPS id 28624895; Fri, 03 Dec 2010 16:43:25 -0800 Received: by email-prod-fe-2.ucsc.edu (CommuniGate Pro PIPE 5.2.13) with PIPE id 405752112; Fri, 03 Dec 2010 16:43:22 -0800 X-UCSC-EDU-ClamAVCheck: not spam, ClamAV(signaure=none) Received: from [128.114.25.84] (account ermorris@ucsc.edu HELO dhcp-25-84.ucsc.edu) by email-prod-fe-2.ucsc.edu (CommuniGate Pro SMTP 5.2.13) with ESMTPSA id 405752076; Fri, 03 Dec 2010 16:43:08 -0800 X-ASG-Orig-Subj: Re: xfs_repair of critical volume Subject: Re: xfs_repair of critical volume Mime-Version: 1.0 (Apple Message framework v1082) Content-Type: multipart/alternative; boundary=Apple-Mail-2--416424039 From: Eli Morris In-Reply-To: <201012021233.07213@zmi.at> Date: Fri, 3 Dec 2010 16:43:08 -0800 Cc: xfs@oss.sgi.com, Dave Chinner Message-Id: <86C6F4CD-B39B-4702-80E7-350A363D5F55@ucsc.edu> References: <75C248E3-2C99-426E-AE7D-9EC543726796@ucsc.edu> <20101117074708.GP22876@dastard> <201012021233.07213@zmi.at> To: Michael Monnerie X-Mailer: Apple Mail (2.1082) X-Barracuda-Connect: email-prod-out-1.ucsc.edu[128.114.129.85] X-Barracuda-Start-Time: 1291423405 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0003 1.0000 -2.0192 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48404 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --Apple-Mail-2--416424039 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=iso-8859-1 On Dec 2, 2010, at 3:33 AM, Michael Monnerie wrote: > On Dienstag, 30. November 2010 Eli Morris wrote: >> Thanks for your help with this. I wrote the program and ran it >> through and it looks like we have we able to preserve 44 TB of valid >> data, while removing the corrupted files, which is a great result, >> considering the circumstances.=20 >=20 > Eli, could you post the relevant program here so others can use it if=20= > needed? There are requests from time to time, and it would be good if=20= > such a program were available (like I'm sure you'd been happy if it=20 > already existed the time you needed it). >=20 > Thanks, and wow: what an amazing filesystem can recover such an event! >=20 > --=20 > mit freundlichen Gr=FCssen, > Michael Monnerie, Ing. BSc >=20 > it-management Internet Services: Prot=E9ger > http://proteger.at [gesprochen: Prot-e-schee] > Tel: +43 660 / 415 6531 >=20 > // ****** Radiointerview zum Thema Spam ****** > // http://www.it-podcast.at/archiv.html#podcast-100716 > //=20 > // Haus zu verkaufen: http://zmi.at/langegg/ Good idea, here is the program: Eli #!/bin/bash #=20 # Copyright 2010 Eli Morris, Travis O'Brien, University of California=20= #=20 # remove_bad.sh is free software: you can redistribute it under the = terms # of the GNU General Public License as published by the Free Software # Foundation, either version 3 of the License, or (at your option) = any later # version.=20 #=20 # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of = MERCHANTABILITY # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public = License # for more details.=20 #=20 # You should have received a copy of the GNU General Public License = along # with this program. If not, see .=20 # # #remove_bad.sh: A script to determine whether any part of a file falls = within a #set of blocks (indicated by arguments 1 and 2). This script is #originally written with the intent to find files on a file system that #exist(ed) on a corrupt section of the file system. It generates a list = of files #that are potentially bad, so that they can be removed by another = script. # #Check command line arguments; grab arguments 1 and 2 if [ $# -eq 2 ]; then BAD_BLOCK_BEGINNING=3D$1 BAD_BLOCK_END=3D$2 echo "bad block beginning $BAD_BLOCK_BEGINNING" echo "bad block ending $BAD_BLOCK_END" #if there aren't exactly 2 arguments then print the usage to the user else echo "usage: remove_bad.sh beginning_block ending_block" exit fi remove file from last run if ( test -e "./naughty_list.txt")=20 then echo "removing the previous naughty list" rm "./naughty_list.txt" fi IFS=3D$'\n' #set the field separator to the carriage return character ALL_FILES=3D(`find /export/vol5 -type f`) #A list of all files on the = volume, SUBSTITUTE NAME OF YOUR VOLUME NUM_FILES=3D${#ALL_FILES[@]} #The number of files on the volume echo "number of files is $NUM_FILES" #Report the number of files to the = user # for each of the file in vol5 for (( COUNT=3D0; COUNT<$NUM_FILES; COUNT++)) do #Report which file is being worked on echo "file number: $COUNT is ${ALL_FILES[$COUNT]}" # report number of files to go FILES_TO_GO=3D$((NUM_FILES-COUNT)) echo "files left: $FILES_TO_GO"=20 #Run xfs_bmap to get the blocks that the file lives within OUTPUT=3D(`xfs_bmap ${ALL_FILES[$COUNT]}`) # output looks like this # vol5dump: # 0: [0..1053271]: 5200578944..5201632215 BAD_FILE=3D0 #Initialize the bad file flag NUM_LINES=3D${#OUTPUT[@]} #The number of lines from xfs_bmap # echo "number of lines for file: $NUM_LINES" #Report the number = of lines to the user #Loop through each line for (( LINE=3D1; LINE < $NUM_LINES; LINE++)) do # echo "line number $LINE: output: ${OUTPUT[$LINE]}" = #Report the current working line # get the block range from the line BLOCKS=3D`echo ${OUTPUT[$LINE]} | cut -d':' -f3` #Report the number of blocks occupied # echo "blocks after cut: '$BLOCKS'"=20 #Use cut to get the first and last block for the file FIRST_BLOCK=3D`echo $BLOCKS | cut -d'.' -f1`=20 LAST_BLOCK=3D`echo $BLOCKS | cut -d'.' -f3` =09 #Report these to the user # echo "beginning block: $FIRST_BLOCK" # echo "ending block: $LAST_BLOCK" #TODO: I'm not sure what exactly 'hole' means, but I get = the impression that it has something #to do with XFS's way of avoiding file fragmentation. = TAO if [ "$BLOCKS" !=3D " hole" ]; then #Don't deal with = lines that report 'hole' # compare to bad block region #For now, check whether the blocks for the file = fall within the user-given block range #if any of the blocks do, then mark this file as = bad. if ( (( "$BAD_BLOCK_BEGINNING" <=3D = "$FIRST_BLOCK")) && (( "$FIRST_BLOCK" <=3D "$BAD_BLOCK_END")) ); then # echo "hit first criterium" BAD_FILE=3D1 break elif ( (( "$BAD_BLOCK_BEGINNING" <=3D = "$LAST_BLOCK")) && (( "$LAST_BLOCK" <=3D "$BAD_BLOCK_END")) ); then # echo "hit second criterium" BAD_FILE=3D1 break fi fi done # add the file to the list of bad files if (($BAD_FILE =3D=3D 1)); then #Report to the user that the current file is bad echo "putting file: ${ALL_FILES[$COUNT]} on the naughty = list" #Write the file's name to the list echo "${ALL_FILES[$COUNT]}" >> naughty_list.txt fi done echo "program_ended_succesfully" >> naughty_list.txt --Apple-Mail-2--416424039 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=iso-8859-1
On Dienstag, 30. November 2010 Eli Morris = wrote:
Thanks for your help with this. I = wrote the program and ran it
through and it looks like we have we able to preserve 44 = TB of valid
data, while = removing the corrupted files, which is a great = result,
considering the = circumstances.

Eli, could you post the relevant = program here so others can use it if
needed? There are requests from = time to time, and it would be good if
such a program were available = (like I'm sure you'd been happy if it
already existed the time you = needed it).

Thanks, and wow: what an amazing filesystem can = recover such an event!

--
mit freundlichen = Gr=FCssen,
Michael Monnerie, Ing. BSc

it-management Internet = Services: Prot=E9ger
http://proteger.at [gesprochen: = Prot-e-schee]
Tel: +43 660 / 415 6531

// ****** Radiointerview = zum Thema Spam ******
// http://www.it= -podcast.at/archiv.html#podcast-100716
//
// Haus zu = verkaufen: http://zmi.at/langegg/


Good idea, here is the = program:

Eli

#!/bin/bash
#    Copyright = 2010 Eli Morris, Travis O'Brien, University of = California 
#    remove_bad.sh is free software: you can = redistribute it under the  terms
#  =   of the GNU General Public License as published by the Free = Software
#    Foundation, = either version 3 of the License, or (at your option) any later
#    version. 
#    = This program is distributed in the hope that it will be useful, = but
#    WITHOUT ANY = WARRANTY; without even the implied warranty of MERCHANTABILITY
#    or FITNESS FOR A PARTICULAR = PURPOSE.  See the GNU General Public License
#    for more details. 
#    = You should have received a copy of the GNU General Public License = along
#    with this = program.  If not, see <http://www.gnu.org/licenses/>. 
#
#
#remove_bad.sh: A script to determine whether any part = of a file falls within a
#set of blocks = (indicated by arguments 1 and 2).  This script is
#originally written with the intent to find files on a = file system that
#exist(ed) on a corrupt = section of the file system.  It generates a list of files
#that are potentially bad, so that they can be removed = by another script.
#

#Check command = line arguments; grab arguments 1 and 2
if [ $# -eq 2 ]; = then
BAD_BLOCK_BEGINNING=3D$1
BAD_BLOCK_END=3D$2
echo "bad block beginning = $BAD_BLOCK_BEGINNING"
= echo "bad block ending $BAD_BLOCK_END"
#if there aren't exactly 2 arguments then print the = usage to the user
else
echo = "usage: remove_bad.sh beginning_block ending_block"
= exit
fi

remove file from last run
if ( test -e "./naughty_list.txt"
= echo "removing the previous naughty list"
rm = "./naughty_list.txt"
fi

IFS=3D$'\n' #set the = field separator to the carriage return character
ALL_FILES=3D(`find /export/vol5 -type f`) #A list of all files on the volume, = SUBSTITUTE NAME OF YOUR VOLUME
NUM_FILES=3D${#ALL_FILES[@]} #The number = of files on the volume
echo "number of files is = $NUM_FILES" #Report the = number of files to the user

# for each of the file in vol5
for (( COUNT=3D0; COUNT<$NUM_FILES; COUNT++))
do
    #Report which file is = being worked on
= echo "file number: $COUNT is = ${ALL_FILES[$COUNT]}"

# report number of files = to go
= FILES_TO_GO=3D$((NUM_FILES-COUNT))
echo "files left: = $FILES_TO_GO" 

    #Run xfs_bmap to get the = blocks that the file lives within
OUTPUT=3D(`xfs_bmap = ${ALL_FILES[$COUNT]}`)
# = output looks like this
= # vol5dump:
# 0: [0..1053271]: = 5200578944..5201632215

BAD_FILE=3D0 = #Initialize the bad file flag
NUM_LINES=3D${#OUTPUT[@]} = #The number of lines from xfs_bmap

# = echo "number of lines for file: $NUM_LINES" #Report the number of lines = to the user
    #Loop through each = line
for (( LINE=3D1; = LINE < $NUM_LINES; LINE++))
do
= # echo "line number $LINE: output: ${OUTPUT[$LINE]}" = #Report the current working line

= # get the block range from the line
= BLOCKS=3D`echo ${OUTPUT[$LINE]} | cut -d':' -f3`

        = #Report the number of blocks occupied
= # echo "blocks after cut: '$BLOCKS'" 
      =   = #Use cut to get the first and last block for the = file
= FIRST_BLOCK=3D`echo $BLOCKS | cut -d'.' -f1` 
LAST_BLOCK=3D`echo = $BLOCKS | cut -d'.' -f3`

=

      =   = #Report these to the user
# echo "beginning = block: $FIRST_BLOCK"
= # echo "ending block: $LAST_BLOCK"

#TODO: I'm not = sure what exactly 'hole' means, but I get the impression that it has = something
= #to do with XFS's way of avoiding file fragmentation. = TAO
= if [ "$BLOCKS" !=3D = " hole" ]; then  #Don't deal with lines that = report 'hole'
= # compare to bad block region
= #For now, check whether the blocks for the file fall = within the user-given block range
#if any of = the blocks do, then mark this file as bad.
=   = if ( (( "$BAD_BLOCK_BEGINNING" <=3D "$FIRST_BLOCK")) && (( "$FIRST_BLOCK" <=3D "$BAD_BLOCK_END")) ); then
=   # echo "hit first = criterium"
  = BAD_FILE=3D1
=   break
=   = elif ( (( "$BAD_BLOCK_BEGINNING" <=3D "$LAST_BLOCK")) && (( "$LAST_BLOCK" <=3D "$BAD_BLOCK_END")) ); then
=   # echo "hit second = criterium"
  = BAD_FILE=3D1
=   break
=   = fi
= fi
= done
= # add the file to the list of bad files
if (($BAD_FILE =3D=3D 1)); then
                = #Report to the user that the current file is bad
= echo "putting file: ${ALL_FILES[$COUNT]} on the naughty = list"
                = #Write the file's name to the list
echo "${ALL_FILES[$COUNT]}" >> = naughty_list.txt
= fi
done
echo = "program_ended_succesfully" = >> naughty_list.txt
Umount -> run xfs_repair -> mount Mount fails -> try xfs_repair -> xfs_repair fails -> finally xfs_repair -L -> mount Adding above mount + xfs_repair procedure to script makes file system stable. But other member of my team do not agree as it increases mount time. On Fri, Dec 3, 2010 at 4:15 AM, Dave Chinner wrote: > On Thu, Dec 02, 2010 at 12:31:30PM +0530, Ajeet Yadav wrote: > > Dear all, > > This is XFS fail mount log on linux 2.6.30.9 > > > > XFS mounting filesystem sda2 > > Starting XFS recovery on filesystem: sda2 (logdev: internal) > > XFS internal error XFS_WANT_CORRUPTED_GOTO at line 1629 of file > > fs/xfs/xfs_alloc.c. Caller 0x80129658 > > Call Trace: > > [<802dedc8>] dump_stack+0x8/0x34 from[<80127400>] > > xfs_free_ag_extent+0x128/0x7ac > > [<80127400>] xfs_free_ag_extent+0x128/0x7ac from[<80129658>] > > xfs_free_extent+0xb8/0xe8 > > [<80129658>] xfs_free_extent+0xb8/0xe8 from[<80163978>] > > xlog_recover_process_efi+0x160/0x214 > > [<80163978>] xlog_recover_process_efi+0x160/0x214 from[<80163ac4>] > > xlog_recover_process_efis+0x98/0x11c > > [<80163ac4>] xlog_recover_process_efis+0x98/0x11c from[<8016663c>] > > xlog_recover_finish+0x28/0xdc > > [<8016663c>] xlog_recover_finish+0x28/0xdc from[<8016aec0>] > > xfs_mountfs+0x4d0/0x610 > > [<8016aec0>] xfs_mountfs+0x4d0/0x610 from[<80184434>] > > xfs_fs_fill_super+0x1fc/0x418 > > [<80184434>] xfs_fs_fill_super+0x1fc/0x418 from[<800bae48>] > > get_sb_bdev+0x11c/0x1c0 > > [<800bae48>] get_sb_bdev+0x11c/0x1c0 from[<80181f20>] > > xfs_fs_get_sb+0x20/0x2c > > [<80181f20>] xfs_fs_get_sb+0x20/0x2c from[<800b9424>] > > vfs_kern_mount+0x68/0xd0 > > [<800b9424>] vfs_kern_mount+0x68/0xd0 from[<800b94f0>] > > do_kern_mount+0x54/0x118 > > [<800b94f0>] do_kern_mount+0x54/0x118 from[<800d44e8>] > do_mount+0x7b4/0x828 > > [<800d44e8>] do_mount+0x7b4/0x828 from[<800d45f8>] sys_mount+0x9c/0x194 > > [<800d45f8>] sys_mount+0x9c/0x194 from[<800102c4>] stack_done+0x20/0x3c > > > > Failed to recover EFIs on filesystem: sda2 > > XFS: log mount finish failed > > You corrupted a free space btree. Care to tell uswhat test you were > running that caused this? Did you pull the plug on the device > during a copy again? > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --0015175cded4cc681904968df599 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Our test case is automated:
1. Create large number of file of 6KB sizes = ( 6KB is taken, we wanted to increase journal load, and file size not in mu= ltiple of file system block size)
2. Set target to reboot at random sec= onds seconds.
3. Next boot do "ls" of all files in XFS partition.
4. Remove = all files in XFS.
5. Go back to step 1

The purpose of this test i= s to test journal and stability of XFS filestem.

Do you think, we sh= ould consider this test case ?

Other is when we should run xfs_repair ? because if mount fails and jou= rnal contain dirty logs then xfs_repair does not run, we are forced to use = (-L) option but its description say that (-L) can corrupt the file system.<= br>
Other case even if xfs mount successfully, even in that case accessing = some files give IO input/ output error.

1. I recommend the following= usage for xfs_repair so that we do not come accross these problem
=A0 = =A0 Mount Success -> Umount -> run xfs_repair -> mount
=A0 =A0 Mount fails -> try xfs_repair -> xfs_repair fails -> final= ly xfs_repair -L -> mount

Adding above mount + xfs_repair procedu= re to script makes file system stable. But other member of my team do not a= gree as it increases mount time.

=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0=A0 =A0

On Fri, Dec 3, 2= 010 at 4:15 AM, Dave Chinner <david@fromorbit.com> wrote:
<= div class=3D"h5">On Thu, Dec 02, 2010 at 12:31:30PM +0530, Ajeet Yadav wrot= e:
> Dear all,
> This is XFS fail mount log on linux 2.6.30.9
>
> XFS mounting filesystem sda2
> Starting XFS recovery on filesystem: sda2 (logdev: internal)
> XFS internal error XFS_WANT_CORRUPTED_GOTO at line 1629 of file
> fs/xfs/xfs_alloc.c. =A0Caller 0x80129658
> Call Trace:
> [<802dedc8>] dump_stack+0x8/0x34 from[<80127400>]
> xfs_free_ag_extent+0x128/0x7ac
> [<80127400>] xfs_free_ag_extent+0x128/0x7ac from[<80129658>= ;]
> xfs_free_extent+0xb8/0xe8
> [<80129658>] xfs_free_extent+0xb8/0xe8 from[<80163978>] > xlog_recover_process_efi+0x160/0x214
> [<80163978>] xlog_recover_process_efi+0x160/0x214 from[<80163= ac4>]
> xlog_recover_process_efis+0x98/0x11c
> [<80163ac4>] xlog_recover_process_efis+0x98/0x11c from[<80166= 63c>]
> xlog_recover_finish+0x28/0xdc
> [<8016663c>] xlog_recover_finish+0x28/0xdc from[<8016aec0>= ]
> xfs_mountfs+0x4d0/0x610
> [<8016aec0>] xfs_mountfs+0x4d0/0x610 from[<80184434>]
> xfs_fs_fill_super+0x1fc/0x418
> [<80184434>] xfs_fs_fill_super+0x1fc/0x418 from[<800bae48>= ]
> get_sb_bdev+0x11c/0x1c0
> [<800bae48>] get_sb_bdev+0x11c/0x1c0 from[<80181f20>]
> xfs_fs_get_sb+0x20/0x2c
> [<80181f20>] xfs_fs_get_sb+0x20/0x2c from[<800b9424>]
> vfs_kern_mount+0x68/0xd0
> [<800b9424>] vfs_kern_mount+0x68/0xd0 from[<800b94f0>]
> do_kern_mount+0x54/0x118
> [<800b94f0>] do_kern_mount+0x54/0x118 from[<800d44e8>] do_= mount+0x7b4/0x828
> [<800d44e8>] do_mount+0x7b4/0x828 from[<800d45f8>] sys_mou= nt+0x9c/0x194
> [<800d45f8>] sys_mount+0x9c/0x194 from[<800102c4>] stack_d= one+0x20/0x3c
>
> Failed to recover EFIs on filesystem: sda2
> XFS: log mount finish failed

You corrupted a free space btree. Care to tell uswhat test you = were
running that caused this? =A0Did you pull the plug on the device
during a copy again?

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com

--0015175cded4cc681904968df599-- From Martin@lichtvoll.de Sat Dec 4 04:28:40 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB4ASeKR146814 for ; Sat, 4 Dec 2010 04:28:40 -0600 X-ASG-Debug-ID: 1291458623-37f903e40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.lichtvoll.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D355C1C95399 for ; Sat, 4 Dec 2010 02:30:23 -0800 (PST) Received: from mail.lichtvoll.de (mondschein.lichtvoll.de [194.150.191.11]) by cuda.sgi.com with ESMTP id LDMgRWJzaTBo1yFs for ; Sat, 04 Dec 2010 02:30:23 -0800 (PST) Received: from shambhala.localnet (ppp-93-104-153-33.dynamic.mnet-online.de [93.104.153.33]) by mail.lichtvoll.de (Postfix) with ESMTPSA id 08D22BA for ; Sat, 4 Dec 2010 11:30:22 +0100 (CET) From: Martin Steigerwald To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair of critical volume Subject: Re: xfs_repair of critical volume Date: Sat, 4 Dec 2010 11:30:19 +0100 User-Agent: KMail/1.13.5 (Linux/2.6.37-rc3-tp42; KDE/4.5.3; i686; ; ) References: <75C248E3-2C99-426E-AE7D-9EC543726796@ucsc.edu> <201011121422.28993@zmi.at> <4CDDBC5C.7020708@hardwarefreak.com> (sfid-20101113_121516_584378_2321CE16) In-Reply-To: <4CDDBC5C.7020708@hardwarefreak.com> MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201012041130.20344.Martin@lichtvoll.de> X-Barracuda-Connect: mondschein.lichtvoll.de[194.150.191.11] X-Barracuda-Start-Time: 1291458624 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48443 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Am Freitag 12 November 2010 schrieb Stan Hoeppner: > Michael Monnerie put forth on 11/12/2010 7:22 AM: > > I find the robustness of XFS amazing: You overwrote 1/5th of the disk > > with zeroes, and it still works :-) > > This isn't "robustness" Michael. If anything it's a serious problem. > XFS is reporting that hundreds or thousands of files that have been > physically removed still exist. Regardless of how he arrived at this > position, how is this "robust"? Most people would consider this > inconsistency of state a "corruption" situation, not "robustness". I think its necessary to differentiate here: 1) It appears to be robustness - or pure luck - regarding metadata consistency of the filesystem. I tend to believe its pure luck and that XFS just stored the metadata on the other RAID arrays. 2) XFS does not seem to have a way to detect whether file contents are still valid and consistent. It shares that with I think every other Linux filesystem instead BTRFS which uses checksumming for files. (Maybe NILFS as well, I don't know, and the FUSE or the other ZFS port). Ciao, -- Martin 'Helios' Steigerwald - http://www.Lichtvoll.de GPG: 03B0 0D6C 0040 0710 4AFA B82F 991B EAAC A599 84C7 From 3h8L6TBcKA5EA3xvDvHzwv6wF7D-89CzA6J19916z.x97I0D9DD.D13.x97@photos-server.bounces.google.com Sat Dec 4 16:35:12 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.3 required=5.0 tests=BAYES_99,MIME_8BIT_HEADER, T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB4MZB4K234869 for ; Sat, 4 Dec 2010 16:35:11 -0600 X-ASG-Debug-ID: 1291502215-31b603d40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-gx0-f201.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5098614143CA for ; Sat, 4 Dec 2010 14:36:55 -0800 (PST) Received: from mail-gx0-f201.google.com (mail-gx0-f201.google.com [209.85.161.201]) by cuda.sgi.com with ESMTP id nYXxlxkEr99bHmMz for ; Sat, 04 Dec 2010 14:36:55 -0800 (PST) Received: by gxk23 with SMTP id 23so1670722gxk.2 for ; Sat, 04 Dec 2010 14:36:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=beta; h=domainkey-signature:mime-version:received:reply-to:message-id:date :subject:from:to:content-type; bh=agowN8JAnRlfFmi9Hdq5PZdZN2CAD1MUCisW4OLeL6k=; b=FZwdFQ0r38iPCJxnBPRZRhhcKIm9n+/h+jkex0CYRSUGSBjA3LDk9lALwHtBFzG3Fc AVaYYoVCDzKR6cdCko9g== DomainKey-Signature: a=rsa-sha1; c=nofws; d=google.com; s=beta; h=mime-version:reply-to:message-id:date:subject:from:to:content-type; b=SPAIEKISSfNvPoqV6iniEj9bSrN0caYDM18iUVuMcpgM3kyN8WFddAXcVB0MqpdC51 6l0+LUR5dnRYjb0veUmg== MIME-Version: 1.0 Received: by 10.90.86.12 with SMTP id j12mt1797696agb.29.1291502215101; Sat, 04 Dec 2010 14:36:55 -0800 (PST) Reply-To: forest lin <247440785@qq.com> Message-ID: <0016364c5d15c1fd6904969d4adf@google.com> Date: Sat, 04 Dec 2010 22:36:55 +0000 X-ASG-Orig-Subj: =?GB2312?B?tci0/crHtv7I/cH3tcS/zbuno6zW97avssXT0NPF1sq/zQ==?= =?GB2312?B?u6c=?= Subject: =?GB2312?B?tci0/crHtv7I/cH3tcS/zbuno6zW97avssXT0NPF1sq/zQ==?= =?GB2312?B?u6c=?= From: Picasa Web Albums To: xfs@oss.sgi.com Content-Type: multipart/mixed; boundary=0016364c5d15c4385004969d4af6 X-Barracuda-Connect: mail-gx0-f201.google.com[209.85.161.201] X-Barracuda-Start-Time: 1291502216 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0209 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.50 X-Barracuda-Spam-Status: No, SCORE=-1.50 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED, MIME_BASE64_TEXT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48492 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.52 MIME_BASE64_TEXT RAW: Message text disguised using base64 encoding X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --0016364c5d15c4385004969d4af6 Content-Type: text/plain; charset=GB2312; format=flowed; delsp=yes Content-Transfer-Encoding: base64 ytCzob661fm086OszeLDs7K7xNzU2bXItP0NCsj9tPNCMkLGvcyoo6ywosDvsM2wzaGi1tC5+tbG 1Oyhoru3x/LXytS0oaO2vMrUuf3By8Lwo78NCruot9HBy7bgydnIy8Gmo7/K1bvxw/fP1MLwo78N CrK71/bStc7x1LHDu7WluPqjrNf2wcvItLvYsaiyu7TzoaMNCsv5zr21xKGwvKbA36GxyOe6zs2o uf3I7bz+sO/W+r+qt6K/zbuno78NCg0KUVE6IDEzNjQ2NTQwNTSjqNHdyr7V5sq10Ke5+6OpDQq1 57uwOiAxMzc1MTE0NyAxODQNCsGqz7XIy6O6wdbQob3jDQo= --0016364c5d15c4385004969d4af6 Content-Type: image/jpeg; name="=?GB2312?B?v827p7e0wKEwMDAuanBn?=" Content-Disposition: attachment; filename="=?GB2312?B?v827p7e0wKEwMDAuanBn?=" Content-Transfer-Encoding: base64 /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCADdAL0DASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD7f1nx zqFt8THgk1FNJt/sKMmlPqcLSyyxqJPLeFYZmDytcLGFiIdhC7Lv+QVR8I+MfEcXhTUL1bzzbm00 mEyQajbSOsN5GRC3mPJMkg3mNw7eWsKMjkuTHKX9I1vwteatLpl/Hqn2TWLGJovMjhP2abc8TuHj Dh9u6FSFEg9GLqWU0rT4cCy1OS6i1zUQtxbyQ3ar5cTzs0yyb90aKEOPMX5QMea7qUkZ3fPknfc+ YlhsV7VtSbjrbVK1169H5fjY5bw3rGt6/wD2NFY6zPYxLd3kwn12xlaW4l+YfZHAaJWZN8rsqgKp jRY/MEMjDbi+Iial4S0OaHUrGPX7n+yprqygkRpI0nntxJ+7JLKpWbAJ6bhznBrSsPBl5pOnkWVz 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 6d36n3tPI8PLLo4vlvZSk2p9uiXs2t0+rtfd2PR9Z8dS6d4jm0Wx8N6trt1BaQ3kz2D2qJGkryog JmnjJJMEnQHHHPNY/iX4o6t4c8Oarq0nw+18R2FpLdMZrrT1TCIWO4rdOwHHJVWPopPFc58TtPuN T8SeKILaxvdRk+yeGJDbaa5juHRdWuWfY4ZdhCqx37l24yWUDIx/Eui31j4c+IV23h7X7DTZfCN7 FHP4h1WO+e2lVHLLE32qdwJlZCw+RR9lT7xYbaw2CwslT51FtuOjbu7qDf21/M7Wj06srB5dgpKl 7SMW24qzbTd405P/AJex/ndrQ2ju3oev+NfFtv4N0NryQRzXs0i2un2UkwiN7dvxDbqxBwXbAzjC jLHCqSMe6+MHh6wiWS5h1+3jaRIg8vhrUlBd2CIuTb9WZlUDuSAOTR8VNBsb3wZ4onkeO31C80af SYLm4MjhDMpVURFDHLyNGCI1LyFYxhiqAfMugQWdz4g8GCHR47DUrvWbN4rT+yo4rgGC7iN0oZNG gBMIVxJsnAXa2Sw+VqyrKcNmGHdWXN7rd7WXS/Z6JJ6/N9C8jyHCZrhHWnzXg3zNWWlr9U1ZJN36 at6WPqzxV4zi8K+EZNXubbyr54CbTSbmdEnuboxlktEKlg0rFdoCb8n7u6ptV8Y2enS6NHBHJqja pqTaXEbF42EcqLK0pcs6gCMQS7gMsCuApPFc38W4Li7uvBVvbafZatJNrMsRstSmMVvMjabfB1dh HJxtLcbDnocA5HIfDHwG9xp0bajouk6no9zqWqaXPoxhV7XSoI7+5lUxb8BwZo1RgI13AWx2r9nO /gpYPDPCRxNR2eul9781la99OW625r2vex5dHL8G8DHF1nZ3btfe/OkkuZP3eS6vbmu4817HtVre W9/E0ltPHcRrI8ReJwwDoxR1yO6srKR2IIPIqauK+D9nb6d4NmtLSCO1tYNZ1eKKCFAiRoupXIVV UcAAAAAdK7WvFxNJUa86UXdRbX3Ox85jKMcNialGDuoyaT72dgooormOQKKKKACiiigAooooAKKK KACiiigAooooAztV0G31e+0a7meRZNKu2vIQhADOYJYSGyDkbZmPGOQOcZBzYvCM3/CfyeJbjWLm 5hSxaytNMaKJYrXzGjaZg4UO24wQ4DE7SH5IYBec8S/F5NA+IUHh6PTL6/URpDLHb2bmaW6nSWW1 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 FFABRRRQAUUUUAFFFFAH/9k= --0016364c5d15c4385004969d4af6-- From stan@hardwarefreak.com Sat Dec 4 22:48:04 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB54m4tx033800 for ; Sat, 4 Dec 2010 22:48:04 -0600 X-ASG-Debug-ID: 1291524566-5bd5026b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A13D31DB6B2D for ; Sat, 4 Dec 2010 20:49:26 -0800 (PST) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id MvkYblPvNLbb9WWS for ; Sat, 04 Dec 2010 20:49:26 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 770C36C161 for ; Sat, 4 Dec 2010 22:49:25 -0600 (CST) Message-ID: <4CFB19D5.7010301@hardwarefreak.com> Date: Sat, 04 Dec 2010 22:49:25 -0600 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2.12) Gecko/20101027 Thunderbird/3.1.6 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair of critical volume Subject: Re: xfs_repair of critical volume References: <75C248E3-2C99-426E-AE7D-9EC543726796@ucsc.edu> <201011121422.28993@zmi.at> <4CDDBC5C.7020708@hardwarefreak.com> (sfid-20101113_121516_584378_2321CE16) <201012041130.20344.Martin@lichtvoll.de> In-Reply-To: <201012041130.20344.Martin@lichtvoll.de> 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: 1291524566 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48516 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Martin Steigerwald put forth on 12/4/2010 4:30 AM: > Am Freitag 12 November 2010 schrieb Stan Hoeppner: >> Michael Monnerie put forth on 11/12/2010 7:22 AM: >>> I find the robustness of XFS amazing: You overwrote 1/5th of the disk >>> with zeroes, and it still works :-) >> >> This isn't "robustness" Michael. If anything it's a serious problem. >> XFS is reporting that hundreds or thousands of files that have been >> physically removed still exist. Regardless of how he arrived at this >> position, how is this "robust"? Most people would consider this >> inconsistency of state a "corruption" situation, not "robustness". > > I think its necessary to differentiate here: > > 1) It appears to be robustness - or pure luck - regarding metadata > consistency of the filesystem. I tend to believe its pure luck and that XFS > just stored the metadata on the other RAID arrays. > > 2) XFS does not seem to have a way to detect whether file contents are > still valid and consistent. It shares that with I think every other Linux > filesystem instead BTRFS which uses checksumming for files. (Maybe NILFS as > well, I don't know, and the FUSE or the other ZFS port). After re-reading my own words above again, I feel I a need to clarify something: I took exception merely to the description of "robustness" being used in this situation. I was not and am not being derogatory of XFS in any way. I love XFS. Of all available filesystems (on any OS) I feel it is the best. That's why I use it. :) In this scenario, other filesystems may have left the OP empty handed. So, I guess XFS deserves deserves a positive attribution for this. But, again, I don't think "robustness" is the correct attribution here. -- Stan From roger@filmlight.ltd.uk Sun Dec 5 03:43:21 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB59hK9R065211 for ; Sun, 5 Dec 2010 03:43:21 -0600 X-ASG-Debug-ID: 1291542305-690801f80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from a.mx.filmlight.ltd.uk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id A3B931DB7045 for ; Sun, 5 Dec 2010 01:45:05 -0800 (PST) Received: from a.mx.filmlight.ltd.uk (a.mx.filmlight.ltd.uk [77.107.81.250]) by cuda.sgi.com with SMTP id NkjptsbVyKdMLHEs for ; Sun, 05 Dec 2010 01:45:05 -0800 (PST) Received: (dqd 6921 invoked from network); 5 Dec 2010 09:45:00 -0000 Received: from 50c553bc.flatrate.dk (HELO ?192.168.2.36?) (roger@80.197.83.188) by a.mx.filmlight.ltd.uk with SMTP; 5 Dec 2010 09:45:00 -0000 X-ASG-Orig-Subj: Re: xfs_repair of critical volume Subject: Re: xfs_repair of critical volume Mime-Version: 1.0 (Apple Message framework v1081) Content-Type: text/plain; charset=us-ascii From: Roger Willcocks In-Reply-To: <4CFB19D5.7010301@hardwarefreak.com> Date: Sun, 5 Dec 2010 09:44:59 +0000 Cc: xfs@oss.sgi.com Content-Transfer-Encoding: quoted-printable Message-Id: References: <75C248E3-2C99-426E-AE7D-9EC543726796@ucsc.edu> <201011121422.28993@zmi.at> <4CDDBC5C.7020708@hardwarefreak.com> (sfid-20101113_121516_584378_2321CE16) <201012041130.20344.Martin@lichtvoll.de> <4CFB19D5.7010301@hardwarefreak.com> To: Stan Hoeppner X-Mailer: Apple Mail (2.1081) X-Barracuda-Connect: a.mx.filmlight.ltd.uk[77.107.81.250] X-Barracuda-Start-Time: 1291542306 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48534 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 5 Dec 2010, at 04:49, Stan Hoeppner wrote: > Martin Steigerwald put forth on 12/4/2010 4:30 AM: >> Am Freitag 12 November 2010 schrieb Stan Hoeppner: >>> Michael Monnerie put forth on 11/12/2010 7:22 AM: >>>> I find the robustness of XFS amazing: You overwrote 1/5th of the = disk >>>> with zeroes, and it still works :-) >>>=20 >>> This isn't "robustness" Michael. If anything it's a serious = problem. >>> XFS is reporting that hundreds or thousands of files that have been >>> physically removed still exist. Regardless of how he arrived at = this >>> position, how is this "robust"? Most people would consider this >>> inconsistency of state a "corruption" situation, not "robustness". >>=20 >> I think its necessary to differentiate here: >>=20 >> 1) It appears to be robustness - or pure luck - regarding metadata=20 >> consistency of the filesystem. I tend to believe its pure luck and = that XFS=20 >> just stored the metadata on the other RAID arrays. >>=20 >> 2) XFS does not seem to have a way to detect whether file contents = are=20 >> still valid and consistent. It shares that with I think every other = Linux=20 >> filesystem instead BTRFS which uses checksumming for files. (Maybe = NILFS as=20 >> well, I don't know, and the FUSE or the other ZFS port). >=20 > After re-reading my own words above again, I feel I a need to clarify > something: I took exception merely to the description of "robustness" > being used in this situation. I was not and am not being derogatory = of > XFS in any way. I love XFS. Of all available filesystems (on any OS) = I > feel it is the best. That's why I use it. :) >=20 > In this scenario, other filesystems may have left the OP empty handed. > So, I guess XFS deserves deserves a positive attribution for this. = But, > again, I don't think "robustness" is the correct attribution here. I think 'lucky' is probably a more appropriate term. The chances are = that due to the size of the array, all the inodes and the inline extent = lists were on the first volume. If' he'd lost that instead, everything = would be gone. -- Roger From 3kwn8TBcKA-UWPJHZHdLIHSIbTZ-UVYLWSfNVVNSL.JVTeMZVZZ.ZNP.JVT@photos-server.bounces.google.com Sun Dec 5 15:50:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.3 required=5.0 tests=BAYES_99,MIME_8BIT_HEADER, T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB5LoYab147153 for ; Sun, 5 Dec 2010 15:50:35 -0600 X-ASG-Debug-ID: 1291585939-387103960000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-vw0-f73.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 71CD71C980DC for ; Sun, 5 Dec 2010 13:52:19 -0800 (PST) Received: from mail-vw0-f73.google.com (mail-vw0-f73.google.com [209.85.212.73]) by cuda.sgi.com with ESMTP id rgpocFMC4DM4rKbt for ; Sun, 05 Dec 2010 13:52:19 -0800 (PST) Received: by vws2 with SMTP id 2so1155784vws.2 for ; Sun, 05 Dec 2010 13:52:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=beta; h=domainkey-signature:mime-version:received:reply-to:message-id:date :subject:from:to:content-type; bh=xsVrjduy13Yo+k4KSE/HeK9dU/ReA+/JkQcKoVYMEeI=; b=lmeZQj/+AI6JZD4/9Sykv5yJGEQnNPgcSTc+xIhEQRI+D2bUYGyukRgvpQRZfRDo06 U0Ks694/vAZayjKnVGiw== DomainKey-Signature: a=rsa-sha1; c=nofws; d=google.com; s=beta; h=mime-version:reply-to:message-id:date:subject:from:to:content-type; b=Mw57Otzcemqmzwyq+Hm9hA4kc2u3WLMFsw1W9fOWuXvvNU+HN8IEIiGRfPWvlY/YYi 6WwaMiwSuHs2nUUMJOsw== MIME-Version: 1.0 Received: by 10.229.192.15 with SMTP id do15mt602883qcb.22.1291585939178; Sun, 05 Dec 2010 13:52:19 -0800 (PST) Reply-To: forest lin <247440785@qq.com> Message-ID: <001636283ab21a066a0496b0c9f3@google.com> Date: Sun, 05 Dec 2010 21:52:19 +0000 X-ASG-Orig-Subj: =?GB2312?B?uN/Qp86qxPrV0rW9xPrIq8fytcS/zbun0MXPog==?= Subject: =?GB2312?B?uN/Qp86qxPrV0rW9xPrIq8fytcS/zbun0MXPog==?= From: Picasa Web Albums To: xfs@oss.sgi.com Content-Type: multipart/mixed; boundary=001636283ab21a98ad0496b0c912 X-Barracuda-Connect: mail-vw0-f73.google.com[209.85.212.73] X-Barracuda-Start-Time: 1291585940 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4863 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.52 X-Barracuda-Spam-Status: No, SCORE=0.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED, MIME_BASE64_TEXT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48576 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.52 MIME_BASE64_TEXT RAW: Message text disguised using base64 encoding X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --001636283ab21a98ad0496b0c912 Content-Type: text/plain; charset=GB2312; format=flowed; delsp=yes Content-Transfer-Encoding: base64 tci0/crHtv7I/cH3tcS/zbuno6zW97avssXT0NPF1sq/zbunDQrDv8Tqu6jU2kIyQsa9zKi1xMeu o6y+v76509DDu9PQusPQp7n7o78NCsO/zOy1yLT9o6zKx7K7yse4w7u7uPa3vbeoo6zP1tTa1/bN 4sOz06a4w9b3tq+ho8vRy/fS/cfmx7+087u5ysdCMkKjvw0Kz9bU2r/J0tTL0cv3tb3Iq8fyxL+x 6r/Nu6e1xNK7v+7I7bz+o6zKx7K7ysfSqrjEseSy38LUo6zW97avs/a796Gj0rvM7MvRy/fJzyAN Cs3yxL+x6r/Nu6ejrNXStb3Wsb3Tv827p0VNQUlMLrXnu7CjrLSr1eahow0KDQpRUToxMzY0NjU0 MDU0o6jR3cq+1ebKtdCnufujqQ0Ktee7sDogMTM3NSAxMTQ3IDE4NA0KwarPtcjLo7rB1tChveMN Cg== --001636283ab21a98ad0496b0c912 Content-Type: image/jpeg; name="=?GB2312?B?v827p7e0wKEyMzQuanBn?=" Content-Disposition: attachment; filename="=?GB2312?B?v827p7e0wKEyMzQuanBn?=" Content-Transfer-Encoding: base64 /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCACeARsDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9SKKK K1MgooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKAPGfEXxw8SeHNd1Xw7L4S0q58TRQ6A2m2VvrsrR30uoTzwzKW+yB0W2FndT MyxyFoITIVjwyrp/Cj4s+JPiB4n1jSNV8HQeH00WF4tRuU1KW4CX32y5iS3jDW0e5Wt4IbvexRvL vLYiMrIHrTuvhLFrXxF8GeNdYuoJ9Z8P6dPBMLK3ktory7dFjjuCvmsdsKSagkcUhl2C/lIYHJaz 8P8AwJrPhLxT491TUtasdUtvEurJqlvbWumvbPZ7baG1Ebu08gl/dW0HIVPm8w4wyqn1darlLwk4 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 2mnazfhhLfm2tjFM7bwrMQ/BcqAW3Y6HHRl2IxdWpSTq3TbW6eijJttWv8XL7ya6RVt3M1FJ6Gbq Pxf8U+GfDGkC61/w5qWqT6Hf30V9ZWDXljqc1mJHkRJ47mMo3lqhbMQQNv2k8INf4I/EzVfGr69r eseIbafRbaxtJ50TTEtrGyme3WWRIrrz3L+WCRKJACrFcbRkHyn4XWc3iP8AZm1hp9L1ay0/SNA1 JYtSGs3NtDdz77iXalrGwSWNQ4DSP1bKbWCnHt3wk+H2h3fwr8LvewXOqw32h2Xn2WqX095aNmON +LeV2iXDKCNqjbjAwOK1y6pi8VVo1Iz91wUrNz7Ws+/va3tZq3XVqajFNHmfhz46eI/iNpVxoXhf XrL/AIS7X9Ru73SZL0wxDSNMjk+SOdfLYSTMI3AjUSNsfzGYAA17H8L/AIw6D8UdP/0K6toNag3r eaSLqOaWBkIV2VlOJYssu2VMqwYdDkD5/wD2e/8AipJ/gtFpn+mt4ag1q41gxfdsluHkSAO3QM5B IQHdtG7G3mvUf2Zbm7sv2aNDuLCy/tG+igvpLez80RefILmcrHvPC7jgbjwM5oybF4qtOEqlRyUo tvdppRpvTXdSqSTet7WtolEqRik7L+tf8j2mivOfg14z8W+MbLUX8U6F/ZXkfZzb3H2Oaz85nhV5 ovImJf8AdSEp5mdr/wAIG016NX2WHrxxNJVYJ2fdW8v677rQ52rOwUUUV0khRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFAH/9k= --001636283ab21a98ad0496b0c912 Content-Type: image/jpeg; name="=?GB2312?B?v827p7e0wKEwMDAuanBn?=" Content-Disposition: attachment; filename="=?GB2312?B?v827p7e0wKEwMDAuanBn?=" Content-Transfer-Encoding: base64 /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCADdAL0DASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD7f1nx zqFt8THgk1FNJt/sKMmlPqcLSyyxqJPLeFYZmDytcLGFiIdhC7Lv+QVR8I+MfEcXhTUL1bzzbm00 mEyQajbSOsN5GRC3mPJMkg3mNw7eWsKMjkuTHKX9I1vwteatLpl/Hqn2TWLGJovMjhP2abc8TuHj Dh9u6FSFEg9GLqWU0rT4cCy1OS6i1zUQtxbyQ3ar5cTzs0yyb90aKEOPMX5QMea7qUkZ3fPknfc+ YlhsV7VtSbjrbVK1169H5fjY5bw3rGt6/wD2NFY6zPYxLd3kwn12xlaW4l+YfZHAaJWZN8rsqgKp jRY/MEMjDbi+Iial4S0OaHUrGPX7n+yprqygkRpI0nntxJ+7JLKpWbAJ6bhznBrSsPBl5pOnkWVz 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 6d36n3tPI8PLLo4vlvZSk2p9uiXs2t0+rtfd2PR9Z8dS6d4jm0Wx8N6trt1BaQ3kz2D2qJGkryog JmnjJJMEnQHHHPNY/iX4o6t4c8Oarq0nw+18R2FpLdMZrrT1TCIWO4rdOwHHJVWPopPFc58TtPuN T8SeKILaxvdRk+yeGJDbaa5juHRdWuWfY4ZdhCqx37l24yWUDIx/Eui31j4c+IV23h7X7DTZfCN7 FHP4h1WO+e2lVHLLE32qdwJlZCw+RR9lT7xYbaw2CwslT51FtuOjbu7qDf21/M7Wj06srB5dgpKl 7SMW24qzbTd405P/AJex/ndrQ2ju3oev+NfFtv4N0NryQRzXs0i2un2UkwiN7dvxDbqxBwXbAzjC jLHCqSMe6+MHh6wiWS5h1+3jaRIg8vhrUlBd2CIuTb9WZlUDuSAOTR8VNBsb3wZ4onkeO31C80af SYLm4MjhDMpVURFDHLyNGCI1LyFYxhiqAfMugQWdz4g8GCHR47DUrvWbN4rT+yo4rgGC7iN0oZNG gBMIVxJsnAXa2Sw+VqyrKcNmGHdWXN7rd7WXS/Z6JJ6/N9C8jyHCZrhHWnzXg3zNWWlr9U1ZJN36 at6WPqzxV4zi8K+EZNXubbyr54CbTSbmdEnuboxlktEKlg0rFdoCb8n7u6ptV8Y2enS6NHBHJqja pqTaXEbF42EcqLK0pcs6gCMQS7gMsCuApPFc38W4Li7uvBVvbafZatJNrMsRstSmMVvMjabfB1dh HJxtLcbDnocA5HIfDHwG9xp0bajouk6no9zqWqaXPoxhV7XSoI7+5lUxb8BwZo1RgI13AWx2r9nO /gpYPDPCRxNR2eul9781la99OW625r2vex5dHL8G8DHF1nZ3btfe/OkkuZP3eS6vbmu4817HtVre W9/E0ltPHcRrI8ReJwwDoxR1yO6srKR2IIPIqauK+D9nb6d4NmtLSCO1tYNZ1eKKCFAiRoupXIVV UcAAAAAdK7WvFxNJUa86UXdRbX3Ox85jKMcNialGDuoyaT72dgooormOQKKKKACiiigAooooAKKK KACiiigAooooAztV0G31e+0a7meRZNKu2vIQhADOYJYSGyDkbZmPGOQOcZBzYvCM3/CfyeJbjWLm 5hSxaytNMaKJYrXzGjaZg4UO24wQ4DE7SH5IYBec8S/F5NA+IUHh6PTL6/URpDLHb2bmaW6nSWW1 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 FFABRRRQAUUUUAFFFFAH/9k= --001636283ab21a98ad0496b0c912-- From lmcilroy@redhat.com Sun Dec 5 19:39:11 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_63 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB61dBMt170725 for ; Sun, 5 Dec 2010 19:39:11 -0600 X-ASG-Debug-ID: 1291599657-31ca00e50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx3-phx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 194A61C96474 for ; Sun, 5 Dec 2010 17:40:57 -0800 (PST) Received: from mx3-phx2.redhat.com (mx3-phx2.redhat.com [209.132.183.24]) by cuda.sgi.com with ESMTP id 84TM0j2mSlruQJS8 for ; Sun, 05 Dec 2010 17:40:57 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation Received: from mail05.corp.redhat.com (zmail05.collab.prod.int.phx2.redhat.com [10.5.5.46]) by mx3-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id oB61ekNl002750; Sun, 5 Dec 2010 20:40:46 -0500 Date: Sun, 5 Dec 2010 20:40:46 -0500 (EST) From: Lachlan McIlroy Reply-To: Lachlan McIlroy To: Dave Chinner Cc: xfs@oss.sgi.com Message-ID: <1860606102.27381291599646249.JavaMail.root@zmail05.collab.prod.int.phx2.redhat.com> In-Reply-To: <2033621546.27171291599487418.JavaMail.root@zmail05.collab.prod.int.phx2.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: prevent NMI timeouts in cmn_err Subject: Re: [PATCH] xfs: prevent NMI timeouts in cmn_err MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.5.5.71] X-Mailer: Zimbra 5.0.21_GA_3150.RHEL4_64 (ZimbraWebClient - FF3.0 (Linux)/5.0.21_GA_3150.RHEL4_64) X-Barracuda-Connect: mx3-phx2.redhat.com[209.132.183.24] X-Barracuda-Start-Time: 1291599658 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean ----- "Dave Chinner" wrote: > On Thu, Dec 02, 2010 at 10:51:32PM -0500, Lachlan McIlroy wrote: > > Dave, overall it looks good - just a few minor points below. > > Thanks for doing this. > > > > ----- "Dave Chinner" wrote: > > [snip] > > > > -void > > > -cmn_err(register int level, char *fmt, ...) > > > -{ > > > - char *fp = fmt; > > > - int len; > > > - ulong flags; > > > - va_list ap; > > > - > > > - level &= XFS_ERR_MASK; > > > - if (level > XFS_MAX_ERR_LEVEL) > > > - level = XFS_MAX_ERR_LEVEL; > > > - spin_lock_irqsave(&xfs_err_lock,flags); > > > - va_start(ap, fmt); > > > - if (*fmt == '!') fp++; > > > - len = vsnprintf(message, sizeof(message), fp, ap); > > > - if (len >= sizeof(message)) > > > - len = sizeof(message) - 1; > > > - if (message[len-1] == '\n') > > > - message[len-1] = 0; > ^^^^^^^^^^^^^^^^^^^^^^^^^^^ > > > > - printk("%s%s\n", err_level[level], message); > > > - va_end(ap); > > > - spin_unlock_irqrestore(&xfs_err_lock,flags); > > > - BUG_ON(level == CE_PANIC); > > > -} > > [snip] > > > > +#define CE_DEBUG KERN_DEBUG > > > +#define CE_CONT KERN_INFO > > > +#define CE_NOTE KERN_NOTICE > > > +#define CE_WARN KERN_WARNING > > > +#define CE_ALERT KERN_ALERT > > > +#define CE_PANIC KERN_EMERG > > > + > > > +#define cmn_err(lvl, fmt, args...) \ > > > + do { \ > > > + printk(lvl fmt, ## args); \ > > > > The old cmn_err() routine would append a newline if one was not > supplied. > > As far as I know printk() will not do the same so either we need to > fix > > all calls to cmn_err() to supply a '\n' or add it here (at the risk > of > > having two newlines) - maybe: > > See above - I think you have it the wrong way around - it looks to > me like the old cmn_err() stripped the newline character if it > existed, then added one itself. That's the same thing - the input may or may not have a newline but the output always will. We should at least try to maintain that behaviour. > > > printk(lvl fmt "\n", ## args); > > printk() is actually pretty tolerant of missing newlines - if it > detects the previous printk() was not newline terminated and the > next one starts with a log level that is not KERN_CONT, it will > print the new message on a new line automatically. This is the code > in vprintk() that handles it: > > /* Do we have a loglevel in the string? */ > if (p[0] == '<') { > unsigned char c = p[1]; > if (c && p[2] == '>') { > switch (c) { > case '0' ... '7': /* loglevel */ > current_log_level = c - '0'; > /* Fallthrough - make sure we're on a new line > */ > case 'd': /* KERN_DEFAULT */ > if (!new_text_line) { > emit_log_char('\n'); > new_text_line = 1; > } > /* Fallthrough - skip the loglevel */ > case 'c': /* KERN_CONT */ > p += 3; > break; > } > } > } > > So we are probably OK not to need additional newlines. Indeed, I > didn't notice the output being screwed up without them. ;) What if the next message after a cmn_err() message doesn't have a log level? There are many users of printk() that don't specify a log level so it could potentially be joined with the previous message. (BTW that code above is not in rhel5). > > I can add them if you want, though. I think we should add them. > > > > > > + BUG_ON(strncmp(lvl, KERN_EMERG, strlen(KERN_EMERG)) == 0); \ > > > + } while (0) > > > + > > > +#define xfs_fs_cmn_err(lvl, mp, fmt, args...) \ > > > + do { \ > > > + printk(lvl "Filesystem %s: " fmt, (mp)->m_fsname, ## args); \ > > > > printk(lvl "Filesystem %s: " fmt "\n", (mp)->m_fsname, ## args); > > > > > + BUG_ON(strncmp(lvl, KERN_EMERG, strlen(KERN_EMERG)) == 0); \ > > > + } while (0) > > > + > > > +/* All callers to xfs_cmn_err use CE_ALERT, so don't bother > testing > > > lvl */ > > > +#define xfs_cmn_err(panic_tag, lvl, mp, fmt, args...) \ > > > + do { \ > > > + int panic = 0; \ > > > + if (xfs_panic_mask && (xfs_panic_mask & panic_tag)) { \ > > > + printk(KERN_ALERT "XFS: Transforming an alert into a BUG."); > \ > > > + panic = 1; \ > > > + } \ > > > + printk(KERN_ALERT "Filesystem %s: " fmt, (mp)->m_fsname, ## > args); > > > \ > > > + BUG_ON(panic); \ > > > + } while (0) > > > > I think we can simplify this case a bit and remove the panic > variable, > > like this: > > > > do { \ > > printk(KERN_ALERT "Filesystem %s: " fmt "\n", (mp)->m_fsname, ## > args); > > if (xfs_panic_mask && (xfs_panic_mask & panic_tag)) { \ > > printk(KERN_ALERT "XFS: Transforming an alert into a BUG.\n"); \ > > BUG_ON(1); \ > > } \ > > } while (0) > > > > This also reorders the messages which I think makes more sense. > > Definitely. That's a vast improvement. ;) > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From SRS0+fHnJ+9+fromorbit.com=david@internode.on.net Sun Dec 5 22:08:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB648ErI186491 for ; Sun, 5 Dec 2010 22:08:15 -0600 X-ASG-Debug-ID: 1291608598-243901750000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6908D1C98E06 for ; Sun, 5 Dec 2010 20:09:58 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id CdxUFzBvYCWGMECE for ; Sun, 05 Dec 2010 20:09:58 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 48617300-1927428 for multiple; Mon, 06 Dec 2010 14:39:42 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PPSOS-0004Dx-I6; Mon, 06 Dec 2010 15:09:40 +1100 Date: Mon, 6 Dec 2010 15:09:40 +1100 From: Dave Chinner To: Spelic Cc: "linux-kernel@vger.kernel.org" , xfs@oss.sgi.com, linux-lvm@redhat.com X-ASG-Orig-Subj: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram Subject: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram Message-ID: <20101206040940.GA16103@dastard> References: <4CF7A539.1050206@shiftmail.org> <4CF7A9CF.2020904@shiftmail.org> <20101202230743.GZ16922@dastard> <4CF8F9BE.6000604@shiftmail.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4CF8F9BE.6000604@shiftmail.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1291608600 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48600 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, Dec 03, 2010 at 03:07:58PM +0100, Spelic wrote: > On 12/03/2010 12:07 AM, Dave Chinner wrote: > >This is a classic ENOSPC vs NFS client writeback overcommit caching > >issue. Have a look at the block map output - I bet theres holes in > >the file and it's only consuming 1.5GB of disk space. use xfs_bmap > >to check this. du should tell you the same thing. > > > > Yes you are right! .... > root@server:/mnt/ram# xfs_bmap zerofile > zerofile: .... > 30: [3473240..3485567]: 2265328..2277655 > 31: [3485568..3632983]: hole > 32: [3632984..3645311]: 2277656..2289983 > 33: [3645312..3866455]: hole > 34: [3866456..3878783]: 2289984..2302311 > > (many delayed allocation extents cannot be filled because space on > device is finished) > > However ... > > > >Basically, the NFS client overcommits the server filesystem space by > >doing local writeback caching. Hence it caches 1.9GB of data before > >it gets the first ENOSPC error back from the server at around 1.5GB > >of written data. At that point, the data that gets ENOSPC errors is > >tossed by the NFS client, and a ENOSPC error is placed on the > >address space to be reported to the next write/sync call. That gets > >to the dd process when it's 1.9GB into the write. > > I'm no great expert but isn't this a design flaw in NFS? Yes, sure is. [ Well, to be precise the original NFSv2 specification didn't have this flaw because all writes were synchronous. NFSv3 introduced asynchronous writes (writeback caching) and with it this problem. NFSv4 does not fix this flaw. ] > Ok in this case we were lucky it was all zeroes so XFS made a sparse > file and could fit a 1.9GB into 1.5GB device size. > > In general with nonzero data it seems to me you will get data > corruption because the NFS client thinks it has written the data > while the NFS server really can't write more data than the device > size. Yup, well known issue. Simple rule: don't run your NFS server out of space. > It's nice that the NFS server does local writeback caching but it > should also cache the filesystem's free space (and check it > periodically, since nfs-server is presumably not the only process > writing in that filesystem) so that it doesn't accept more data than > it can really write. Alternatively, when free space drops below 1GB > (or a reasonable size based on network speed), nfs-server should > turn off filesystem writeback caching. This isn't a NFS server problem, or one that canbe worked around at the server. it's a NFS _client_ problem in that it does not get synchronous ENOSPC errors when using writeback caching. There is no way for the NFS client to know the server is near ENOSPC conditions prior to writing the data to the server as clients operate independently. If you really want your NFS clients to behave correctly when the server goes ENOSPC, turn off writeback caching at the client side, not the server (i.e. use sync mounts on the client side). Write performance will suck, but if you want sane ENOSPC behaviour... ..... > Holes in a random file! > This is data corruption, and nobody is notified of this data > corruption: no error at client side or server side! > Is it good semantics? How could client get notified of this? Some > kind of fsync maybe? Use wireshark to determine if the server sends an ENOSPC to the client when the first background write fails. I bet it does and that your dd write failed with ENOSPC, too. Something stopped it writing at 1.9GB.... What happens to the remaining cached writeback data in the NFS client once the server runs out of space is NFS client specific behaviour. If you end up with only bits of the file on the server, ending up on the server, then that's a result of NFS client behaviour, not a NFS server problem. Cheers, Dave. -- Dave Chinner david@fromorbit.com From lczerner@redhat.com Mon Dec 6 04:18:58 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.4 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_44,J_CHICKENPOX_64,J_CHICKENPOX_66,J_CHICKENPOX_73 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB6AIwUj228103 for ; Mon, 6 Dec 2010 04:18:58 -0600 X-ASG-Debug-ID: 1291630844-1b1a02be0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1689D1C9876B for ; Mon, 6 Dec 2010 02:20:44 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0LZDVRkFeaPSlfd2 for ; Mon, 06 Dec 2010 02:20:44 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation 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.13.8/8.13.8) with ESMTP id oB6AKY2M000619 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 6 Dec 2010 05:20:34 -0500 Received: from dhcp-lab-213.englab.brq.redhat.com (dhcp-27-109.brq.redhat.com [10.34.27.109]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id oB6AKWO4015641 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 6 Dec 2010 05:20:33 -0500 Date: Mon, 6 Dec 2010 11:20:31 +0100 (CET) From: Lukas Czerner X-X-Sender: lukas@dhcp-lab-213.englab.brq.redhat.com To: Lukas Czerner cc: xfs@oss.sgi.com, esandeen@redhat.com, hch@infradead.org X-ASG-Orig-Subj: Re: [PATCH] Add test 248: Check filesystem FITRIM implementation Subject: Re: [PATCH] Add test 248: Check filesystem FITRIM implementation In-Reply-To: <1290780743-12112-1-git-send-email-lczerner@redhat.com> Message-ID: References: <1290780743-12112-1-git-send-email-lczerner@redhat.com> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1291630845 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, 26 Nov 2010, Lukas Czerner wrote: > FITRIM ioctl is used on a mounted filesystem to discard (or "trim") > blocks which are not in use by the filesystem. This is useful for > solid-state drives (SSDs) and thinly-provi-sioned storage. This test > helps to verify filesystem FITRIM implementation to assure that it > does not corrupts data. > > This test creates checksums of all files in /usr/share/doc directory and > run several processes which clear its working directory on SCRATCH_MNT, > then copy everything from /usr/share/doc into its working directory, create > list of files in working directory and its checksums and compare it with the > original list of checksums. Every process works in the loop so it repeat > remove->copy->check, while fstrim tool is running simultaneously. > > Fstrim is just a helper tool which uses FITRIM ioctl to actually do the > filesystem discard. > > I found this very useful because when the FITRIM is really buggy (thus > data-destroying) the 248 test will notice, because checksums will most > likely change. Hello, what is the status of this patch ? It would be nice to get some response before someone add a new test and the patch becomes obsolete :). Thanks! -Lukas > > Signed-off-by: Lukas Czerner > --- > 248 | 163 +++++++++++++++++++++++++++++++++++++ > 248.out | 3 + > group | 1 + > src/Makefile | 2 +- > src/fstrim.c | 257 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 5 files changed, 425 insertions(+), 1 deletions(-) > create mode 100755 248 > create mode 100644 248.out > create mode 100644 src/fstrim.c > > diff --git a/248 b/248 > new file mode 100755 > index 0000000..0d2f17f > --- /dev/null > +++ b/248 > @@ -0,0 +1,163 @@ > +#!/bin/bash > +# FS QA Test No. 248 > +# > +# This test was created in order to verify filesystem FITRIM implementation. > +# By many concurrent copy and remove operations and checking that files > +# does not change after copied into SCRATCH_MNT test if FITIM implementation > +# corrupts the filesystem (data/metadata). > +# > +#----------------------------------------------------------------------- > +# Copyright 2010 (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 > +#----------------------------------------------------------------------- > + > +owner=lczerner@redhat.com > + > +seq=`basename $0` > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=`mktemp -d` > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 3 > +trap "_destroy; exit \$status" 2 15 > +chpid=0 > +mypid=$$ > + > +# get standard environment, filters and checks > +. ./common.rc > +. ./common.filter > + > +# real QA test starts here > +_supported_fs generic > +_supported_os Linux > +_require_scratch > +_scratch_mkfs >/dev/null 2>&1 > +_scratch_mount > + > +_cleanup() > +{ > + rm -rf $tmp > +} > + > +_destroy() > +{ > + kill $pids $fstrim_pid > + wait $pids $fstrim_pid > + rm -rf $tmp > +} > + > +_destroy_fstrim() > +{ > + kill $fpid > + wait $fpid > +} > + > +fstrim_loop() > +{ > + trap "_destroy_fstrim; exit \$status" 2 15 > + fsize=$(df | grep $SCRATCH_MNT | grep $SCRATCH_DEV | awk '{print $2}') > + > + while true ; do > + step=1048576 > + start=0 > + $here/src/fstrim $SCRATCH_MNT & > + fpid=$! > + wait $fpid > + while [ $start -lt $fsize ] ; do > + $here/src/fstrim -s ${start}k -l ${step}k $SCRATCH_MNT & > + fpid=$! > + wait $fpid > + start=$(( $start + $step )) > + done > + done > +} > + > +function check_sums() { > + dir=$1 > + > + ( > + cd $SCRATCH_MNT/$p > + find -P . -xdev -type f -print0 | xargs -0 md5sum | sort -o $tmp/stress.$$.$p > + ) > + > + diff $tmp/content.sums $tmp/stress.$$.$p > + if [ $? -ne 0 ]; then > + echo "!!!Checksums has changed - Filesystem possibly corrupted!!!\n" > + kill $mypid > + fi > + rm -f $tmp/stress.$$.$p > +} > + > +function run_process() { > + local p=$1 > + repeat=10 > + > + sleep $((5*$p))s & > + export chpid=$! && wait $chpid &> /dev/null > + chpid=0 > + > + while [ $repeat -gt 0 ]; do > + > + # Remove old directories. > + rm -rf $SCRATCH_MNT/$p > + export chpid=$! && wait $chpid &> /dev/null > + > + # Copy content -> partition. > + mkdir $SCRATCH_MNT/$p > + cp -ax $content/* $SCRATCH_MNT/$p > + export chpid=$! && wait $chpid &> /dev/null > + > + check_sums > + repeat=$(( $repeat - 1 )) > + done > +} > + > +nproc=20 > +content=/usr/share/doc > + > +# Check for FITRIM support > +echo -n "Checking FITRIM support: " > +$here/src/fstrim -l 10M $SCRATCH_MNT > +[ $? -ne 0 ] && exit > +echo "done." > + > +mkdir -p $tmp > + > +( > +cd $content > +find -P . -xdev -type f -print0 | xargs -0 md5sum | sort -o $tmp/content.sums > +) > + > +echo -n "Running the test: " > +pids="" > +fstrim_loop & > +fstrim_pid=$! > +p=1 > +while [ $p -le $nproc ]; do > + run_process $p & > + pids="$pids $!" > + p=$(($p+1)) > +done > +echo "done." > + > +wait $pids > +kill $fstrim_pid > +wait $fstrim_pid > + > +status=0 > +_check_scratch_fs > + > +exit > diff --git a/248.out b/248.out > new file mode 100644 > index 0000000..880d9c7 > --- /dev/null > +++ b/248.out > @@ -0,0 +1,3 @@ > +QA output created by 248 > +Checking FITRIM support: done. > +Running the test: done. > diff --git a/group b/group > index 0f94dd9..fea84ed 100644 > --- a/group > +++ b/group > @@ -361,3 +361,4 @@ deprecated > 245 auto quick dir > 246 auto quick rw > 247 auto quick rw > +248 ioctl > diff --git a/src/Makefile b/src/Makefile > index b827bd0..885fd65 100644 > --- a/src/Makefile > +++ b/src/Makefile > @@ -17,7 +17,7 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ > preallo_rw_pattern_writer ftrunc trunc fs_perms testx looptest \ > locktest unwritten_mmap bulkstat_unlink_test t_stripealign \ > bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable \ > - stale_handle > + stale_handle fstrim > > SUBDIRS = > > diff --git a/src/fstrim.c b/src/fstrim.c > new file mode 100644 > index 0000000..6686c99 > --- /dev/null > +++ b/src/fstrim.c > @@ -0,0 +1,257 @@ > +/* > + * fstrim.c -- discard the part (or whole) of mounted filesystem. > + * > + * Copyright (C) 2009 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, either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program. If not, see . > + * > + * This program uses FITRIM ioctl to discard parts or the whole filesystem > + * online (mounted). You can specify range (start and lenght) to be > + * discarded, or simply discard while filesystem. > + * > + * Usage: fstrim [options] > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include > +#include > + > +#ifndef FITRIM > +struct fstrim_range { > + uint64_t start; > + uint64_t len; > + uint64_t minlen; > +}; > +#define FITRIM _IOWR('X', 121, struct fstrim_range) > +#endif > + > +const char *program_name = "fstrim"; > + > +struct options { > + struct fstrim_range *range; > + char mpoint[PATH_MAX]; > + char verbose; > +}; > + > +static void usage(void) > +{ > + fprintf(stderr, > + "Usage: %s [-s start] [-l length] [-m minimum-extent]" > + " [-v] {mountpoint}\n\t" > + "-s Starting Byte to discard from\n\t" > + "-l Number of Bytes to discard from the start\n\t" > + "-m Minimum extent length to discard\n\t" > + "-v Verbose - number of discarded bytes\n", > + program_name); > +} > + > +static void err_exit(const char *fmt, ...) > +{ > + va_list pvar; > + va_start(pvar, fmt); > + vfprintf(stderr, fmt, pvar); > + va_end(pvar); > + usage(); > + exit(EXIT_FAILURE); > +} > + > +/** > + * Get the number from argument. It can be number followed by > + * units: k|K, m|M, g|G, t|T > + */ > +static unsigned long long get_number(char **optarg) > +{ > + char *opt, *end; > + unsigned long long number, max; > + > + /* get the max to avoid overflow */ > + max = ULLONG_MAX / 1024; > + number = 0; > + opt = *optarg; > + > + if (*opt == '-') { > + err_exit("%s: %s (%s)\n", program_name, > + strerror(ERANGE), *optarg); > + } > + > + errno = 0; > + number = strtoul(opt, &end , 0); > + if (errno) > + err_exit("%s: %s (%s)\n", program_name, > + strerror(errno), *optarg); > + > + /* > + * Convert units to numbers. Fall-through stack is used for units > + * so absence of breaks is intentional. > + */ > + switch (*end) { > + case 'T': /* terabytes */ > + case 't': > + if (number > max) > + err_exit("%s: %s (%s)\n", program_name, > + strerror(ERANGE), *optarg); > + number *= 1024; > + case 'G': /* gigabytes */ > + case 'g': > + if (number > max) > + err_exit("%s: %s (%s)\n", program_name, > + strerror(ERANGE), *optarg); > + number *= 1024; > + case 'M': /* megabytes */ > + case 'm': > + if (number > max) > + err_exit("%s: %s (%s)\n", program_name, > + strerror(ERANGE), *optarg); > + number *= 1024; > + case 'K': /* kilobytes */ > + case 'k': > + if (number > max) > + err_exit("%s: %s (%s)\n", program_name, > + strerror(ERANGE), *optarg); > + number *= 1024; > + end++; > + case '\0': /* end of the string */ > + break; > + default: > + err_exit("%s: %s (%s)\n", program_name, > + strerror(EINVAL), *optarg); > + return 0; > + } > + > + if (*end != '\0') { > + err_exit("%s: %s (%s)\n", program_name, > + strerror(EINVAL), *optarg); > + } > + > + return number; > +} > + > +static int parse_opts(int argc, char **argv, struct options *opts) > +{ > + int c; > + > + while ((c = getopt(argc, argv, "s:l:m:v")) != EOF) { > + switch (c) { > + case 's': /* starting point */ > + opts->range->start = get_number(&optarg); > + break; > + case 'l': /* length */ > + opts->range->len = get_number(&optarg); > + break; > + case 'm': /* minlen */ > + opts->range->minlen = get_number(&optarg); > + break; > + case 'v': /* verbose */ > + opts->verbose = 1; > + break; > + default: > + return EXIT_FAILURE; > + } > + } > + > + return 0; > +} > + > +int main(int argc, char **argv) > +{ > + struct options *opts; > + struct stat sb; > + int fd, err = 0, ret = EXIT_FAILURE; > + > + opts = malloc(sizeof(struct options)); > + if (!opts) > + err_exit("%s: malloc(): %s\n", program_name, strerror(errno)); > + > + opts->range = NULL; > + opts->verbose = 0; > + > + if (argc > 1) > + strncpy(opts->mpoint, argv[argc - 1], sizeof(opts->mpoint)); > + > + opts->range = calloc(1, sizeof(struct fstrim_range)); > + if (!opts->range) { > + fprintf(stderr, "%s: calloc(): %s\n", program_name, > + strerror(errno)); > + goto free_opts; > + } > + > + opts->range->len = ULLONG_MAX; > + > + if (argc > 2) > + err = parse_opts(argc, argv, opts); > + > + if (err) { > + usage(); > + goto free_opts; > + } > + > + if (strnlen(opts->mpoint, 1) < 1) { > + fprintf(stderr, "%s: You have to specify mount point.\n", > + program_name); > + usage(); > + goto free_opts; > + } > + > + if (stat(opts->mpoint, &sb) == -1) { > + fprintf(stderr, "%s: %s: %s\n", program_name, > + opts->mpoint, strerror(errno)); > + usage(); > + goto free_opts; > + } > + > + if (!S_ISDIR(sb.st_mode)) { > + fprintf(stderr, "%s: %s: (%s)\n", program_name, > + opts->mpoint, strerror(ENOTDIR)); > + usage(); > + goto free_opts; > + } > + > + fd = open(opts->mpoint, O_RDONLY); > + if (fd < 0) { > + fprintf(stderr, "%s: open(%s): %s\n", program_name, > + opts->mpoint, strerror(errno)); > + goto free_opts; > + } > + > + if (ioctl(fd, FITRIM, opts->range)) { > + fprintf(stderr, "%s: FSTRIM: %s\n", program_name, > + strerror(errno)); > + goto free_opts; > + } > + > + if ((opts->verbose) && (opts->range)) > + fprintf(stdout, "%llu Bytes was trimmed\n", opts->range->len); > + > + ret = EXIT_SUCCESS; > + > +free_opts: > + if (opts) { > + if (opts->range) > + free(opts->range); > + free(opts); > + } > + > + return ret; > +} > -- From spelic@shiftmail.org Mon Dec 6 06:19:26 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_45 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB6CJQZi239796 for ; Mon, 6 Dec 2010 06:19:26 -0600 X-ASG-Debug-ID: 1291638071-568101090000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.isti.cnr.it (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id ADAC51C9397 for ; Mon, 6 Dec 2010 04:21:11 -0800 (PST) Received: from mx2.isti.cnr.it (mx2.isti.cnr.it [194.119.192.4]) by cuda.sgi.com with ESMTP id N6wdpLr4AeKLLJZB for ; Mon, 06 Dec 2010 04:21:11 -0800 (PST) Received: from SCRIPT-SPFWL-DAEMON.mx.isti.cnr.it by mx.isti.cnr.it (PMDF V6.5 #31825) id <01NV3O6KBVIOLS8X2Z@mx.isti.cnr.it> for xfs@oss.sgi.com; Mon, 06 Dec 2010 13:20:00 +0100 (MET) Received: from conversionlocal.isti.cnr.it by mx.isti.cnr.it (PMDF V6.5 #31825) id <01NV3O6JBJIOLVX0OJ@mx.isti.cnr.it> for xfs@oss.sgi.com; Mon, 06 Dec 2010 13:19:55 +0100 (MET) Received: from [10.0.0.61] (dynamic-adsl-84-220-171-138.clienti.tiscali.it [84.220.171.138]) by mx.isti.cnr.it (PMDF V6.5 #31826) with ESMTPSA id <01NV3O6IFH12LZNASB@mx.isti.cnr.it>; Mon, 06 Dec 2010 13:19:54 +0100 (MET) Date: Mon, 06 Dec 2010 13:20:02 +0100 From: Spelic X-ASG-Orig-Subj: NFS corruption on ENOSPC (was: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram) Subject: NFS corruption on ENOSPC (was: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram) In-reply-to: <20101206040940.GA16103@dastard> To: Dave Chinner Cc: "linux-kernel@vger.kernel.org" , xfs@oss.sgi.com, linux-lvm@redhat.com, linux-nfs@vger.kernel.org Message-id: <4CFCD4F2.10300@shiftmail.org> MIME-version: 1.0 Content-type: text/plain; format=flowed; charset=ISO-8859-1 Content-transfer-encoding: 7bit User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.11) Gecko/20100713 Thunderbird/3.0.6 X-INSM-ip-source: 84.220.171.138 Auth Done References: <4CF7A539.1050206@shiftmail.org> <4CF7A9CF.2020904@shiftmail.org> <20101202230743.GZ16922@dastard> <4CF8F9BE.6000604@shiftmail.org> <20101206040940.GA16103@dastard> X-Barracuda-Connect: mx2.isti.cnr.it[194.119.192.4] X-Barracuda-Start-Time: 1291638072 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48633 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 12/06/2010 05:09 AM, Dave Chinner wrote: >> [Files become sparse at nfs-server-side upon hitting ENOSPC if NFS client uses local writeback caching] >> >> >> It's nice that the NFS server does local writeback caching but it >> should also cache the filesystem's free space (and check it >> periodically, since nfs-server is presumably not the only process >> writing in that filesystem) so that it doesn't accept more data than >> it can really write. Alternatively, when free space drops below 1GB >> (or a reasonable size based on network speed), nfs-server should >> turn off filesystem writeback caching. >> > This isn't a NFS server problem, or one that canbe worked around at > the server. it's a NFS _client_ problem in that it does not get > synchronous ENOSPC errors when using writeback caching. There is no > way for the NFS client to know the server is near ENOSPC conditions > prior to writing the data to the server as clients operate > independently. > > If you really want your NFS clients to behave correctly when the > server goes ENOSPC, turn off writeback caching at the client side, > not the server (i.e. use sync mounts on the client side). > Write performance will suck, but if you want sane ENOSPC behaviour... > > [adding NFS ML in cc] Thank you for your very clear explanation. Going without writeback cache is a problem (write performance sucks as you say), but guaranteeing to never reach ENOSPC also is hardly feasible, especially if humans are logged at client side and they are doing "whatever they want". I would suggest that either be the NFS client to do polling to see if it's near an ENOSPC and if yes disable writeback caching, or be the server to do the polling and if it finds out it's near-ENOSPC condition it sends a specific message to clients to warn them so that they can disable caching. Performed at client side wouldn't change the NFS protocol and can be good enough if one can specify how often freespace should be polled and what is the freespace threshold. Or with just one value: specify what is the max speed at which server disk can fill (next polling period can be inferred from current free space), and maybe also specify a minimum polling period (just in case). Regarding the last part of the email, perhaps I was not clear: > ..... > >> Holes in a random file! >> This is data corruption, and nobody is notified of this data >> corruption: no error at client side or server side! >> Is it good semantics? How could client get notified of this? Some >> kind of fsync maybe? >> > Use wireshark to determine if the server sends an ENOSPC to the > client when the first background write fails. I bet it does and that > your dd write failed with ENOSPC, too. Something stopped it writing > at 1.9GB.... > No, in that case I had written 15x100MB which was more than the available space but less than available+writeback_cache. So "cat" ended by itself and never got an ENOSPC error but data never reached the disk at the other side. However today I found that by using fsync, the problem is fortunately detected: # time cat randfile{001..015} | pv -b | dd conv=fsync of=/mnt/nfsram/randfile 1.46GB dd: fsync failed for `/mnt/nfsram/randfile': Input/output error 3072000+0 records in 3072000+0 records out 1572864000 bytes (1.6 GB) copied, 20.9101 s, 75.2 MB/s real 0m21.364s user 0m0.470s sys 0m11.440s so ok I understand that processes needing guarantees on written data should use fsync/fdatasync (which is good practice also for a local filesystem actually...) Thank you From trond.myklebust@fys.uio.no Mon Dec 6 07:32:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB6DWLMU247343 for ; Mon, 6 Dec 2010 07:32:22 -0600 X-ASG-Debug-ID: 1291642447-26d700bb0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-out1.uio.no (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1425E1C9A27 for ; Mon, 6 Dec 2010 05:34:07 -0800 (PST) Received: from mail-out1.uio.no (mail-out1.uio.no [129.240.10.57]) by cuda.sgi.com with ESMTP id HdtDnezJSwJ8nhO1 for ; Mon, 06 Dec 2010 05:34:07 -0800 (PST) Received: from mail-mx5.uio.no ([129.240.10.46]) by mail-out1.uio.no with esmtp (Exim 4.69) (envelope-from ) id 1PPbCc-00017V-S9; Mon, 06 Dec 2010 14:34:02 +0100 Received: from c-68-40-206-115.hsd1.mi.comcast.net ([68.40.206.115] helo=[192.168.1.12]) by mail-mx5.uio.no with esmtpsa (SSLv3:CAMELLIA256-SHA:256) user trondmy (Exim 4.69) (envelope-from ) id 1PPbCb-0004CF-Va; Mon, 06 Dec 2010 14:34:02 +0100 X-ASG-Orig-Subj: Re: NFS corruption on ENOSPC (was: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram) Subject: Re: NFS corruption on ENOSPC (was: Re: Bugs in mkfs.xfs, device mapper, xfs, and /dev/ram) From: Trond Myklebust To: Spelic Cc: Dave Chinner , "linux-kernel@vger.kernel.org" , xfs@oss.sgi.com, linux-lvm@redhat.com, linux-nfs@vger.kernel.org In-Reply-To: <4CFCD4F2.10300@shiftmail.org> References: <4CF7A539.1050206@shiftmail.org> <4CF7A9CF.2020904@shiftmail.org> <20101202230743.GZ16922@dastard> <4CF8F9BE.6000604@shiftmail.org> <20101206040940.GA16103@dastard> <4CFCD4F2.10300@shiftmail.org> Content-Type: text/plain; charset="UTF-8" Date: Mon, 06 Dec 2010 08:33:55 -0500 Message-ID: <1291642435.3990.8.camel@heimdal.trondhjem.org> Mime-Version: 1.0 X-Mailer: Evolution 2.32.1 (2.32.1-1.fc14) Content-Transfer-Encoding: 7bit X-UiO-Ratelimit-Test: rcpts/h 6 msgs/h 1 sum rcpts/h 6 sum msgs/h 1 total rcpts 1231 max rcpts/h 20 ratelimit 0 X-UiO-Spam-info: not spam, SpamAssassin (score=-5.0, required=5.0, autolearn=disabled, UIO_MAIL_IS_INTERNAL=-5, uiobl=NO, uiouri=NO) X-UiO-Scanned: DD6A827C3B7EFB58D1A1EA143A7B28E6DA7DFADD X-UiO-SPAM-Test: remote_host: 68.40.206.115 spam_score: -49 maxlevel 80 minaction 2 bait 0 mail/h: 1 total 485 max/h 7 blacklist 0 greylist 0 ratelimit 0 X-Barracuda-Connect: mail-out1.uio.no[129.240.10.57] X-Barracuda-Start-Time: 1291642448 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48638 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, 2010-12-06 at 13:20 +0100, Spelic wrote: > On 12/06/2010 05:09 AM, Dave Chinner wrote: > >> [Files become sparse at nfs-server-side upon hitting ENOSPC if NFS client uses local writeback caching] > >> > >> > >> It's nice that the NFS server does local writeback caching but it > >> should also cache the filesystem's free space (and check it > >> periodically, since nfs-server is presumably not the only process > >> writing in that filesystem) so that it doesn't accept more data than > >> it can really write. Alternatively, when free space drops below 1GB > >> (or a reasonable size based on network speed), nfs-server should > >> turn off filesystem writeback caching. > >> > > This isn't a NFS server problem, or one that canbe worked around at > > the server. it's a NFS _client_ problem in that it does not get > > synchronous ENOSPC errors when using writeback caching. There is no > > way for the NFS client to know the server is near ENOSPC conditions > > prior to writing the data to the server as clients operate > > independently. > > > > If you really want your NFS clients to behave correctly when the > > server goes ENOSPC, turn off writeback caching at the client side, > > not the server (i.e. use sync mounts on the client side). > > Write performance will suck, but if you want sane ENOSPC behaviour... > > > > > > [adding NFS ML in cc] > > Thank you for your very clear explanation. > > Going without writeback cache is a problem (write performance sucks as > you say), but guaranteeing to never reach ENOSPC also is hardly > feasible, especially if humans are logged at client side and they are > doing "whatever they want". > > I would suggest that either be the NFS client to do polling to see if > it's near an ENOSPC and if yes disable writeback caching, or be the > server to do the polling and if it finds out it's near-ENOSPC condition > it sends a specific message to clients to warn them so that they can > disable caching. > Performed at client side wouldn't change the NFS protocol and can be > good enough if one can specify how often freespace should be polled and > what is the freespace threshold. Or with just one value: specify what is > the max speed at which server disk can fill (next polling period can be > inferred from current free space), and maybe also specify a minimum > polling period (just in case). You can just as easily do this at the application level. The kernel can't do it any more reliably than the application can, so there really is no point in doing it there. We already ensure that when the server does send us an error, we switch to synchronous operation until the error clears. Trond From BATV+97ff857f1b70a67ae353+2661+infradead.org+hch@bombadil.srs.infradead.org Mon Dec 6 08:31:26 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB6EVPfD253779 for ; Mon, 6 Dec 2010 08:31:26 -0600 X-ASG-Debug-ID: 1291645991-3c7401ec0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D6C06141E06F for ; Mon, 6 Dec 2010 06:33:12 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id LBcv47EQwPNQ9gxW for ; Mon, 06 Dec 2010 06:33:12 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PPc7o-0002pv-AV; Mon, 06 Dec 2010 14:33:08 +0000 Date: Mon, 6 Dec 2010 09:33:08 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 6/8] xfs: remove all the inodes on a buffer from the AIL in bulk Subject: Re: [PATCH 6/8] xfs: remove all the inodes on a buffer from the AIL in bulk Message-ID: <20101206143308.GA31100@infradead.org> References: <1290993152-20999-1-git-send-email-david@fromorbit.com> <1290993152-20999-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1290993152-20999-7-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291645992 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean While the patch looks good for the ail lock contetion removal, I don't quite like the model with the double iteration over the log item list on the buffer. What do you think about the following plan: (1) merge xfs_istale_done into xfs_iflush_done by checking for XFS_ISTALE (2) convert not only the inode log item completion to your new scheme, but also the dquots (3) replace xfs_buf_do_callbacks with a callback in the buffer, which now points to the inode and dqout routines, or calls the completion for the only items in "normal" buf items. From BATV+97ff857f1b70a67ae353+2661+infradead.org+hch@bombadil.srs.infradead.org Mon Dec 6 08:34:00 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB6EY0C2254237 for ; Mon, 6 Dec 2010 08:34:00 -0600 X-ASG-Debug-ID: 1291646147-16f103620000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CC4B11C99F6D for ; Mon, 6 Dec 2010 06:35:47 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 4daKGhDhP2kgfAff for ; Mon, 06 Dec 2010 06:35:47 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PPcAL-0003fV-Ag; Mon, 06 Dec 2010 14:35:45 +0000 Date: Mon, 6 Dec 2010 09:35:45 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 7/8] xfs: use AIL bulk update function to implement single updates Subject: Re: [PATCH 7/8] xfs: use AIL bulk update function to implement single updates Message-ID: <20101206143545.GB31100@infradead.org> References: <1290993152-20999-1-git-send-email-david@fromorbit.com> <1290993152-20999-8-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1290993152-20999-8-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291646147 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Nov 29, 2010 at 12:12:31PM +1100, Dave Chinner wrote: > From: Dave Chinner > > We now have two copies of AIL insert operations that are mostly > duplicate functionality. The single log item updates can be > implemented via the bulk updates by turning xfs_trans_ail_update() > into a simple wrapper. This removes all the duplicate insert > functionality and associated helpers. Looks good, although the comment above xfs_trans_ail_update_bulk, stating it's the bulk version of xfs_trans_ail_update isn't too helpful any more after this patch. From BATV+97ff857f1b70a67ae353+2661+infradead.org+hch@bombadil.srs.infradead.org Mon Dec 6 08:35:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB6EZjdK254396 for ; Mon, 6 Dec 2010 08:35:45 -0600 X-ASG-Debug-ID: 1291646252-2721031c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0B9CD1C9E60 for ; Mon, 6 Dec 2010 06:37:32 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id N78lAO2PE4GdFk5P for ; Mon, 06 Dec 2010 06:37:32 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PPcC4-0003gP-Ec; Mon, 06 Dec 2010 14:37:32 +0000 Date: Mon, 6 Dec 2010 09:37:32 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 8/8] xfs: use AIL bulk delete function to implement single delete Subject: Re: [PATCH 8/8] xfs: use AIL bulk delete function to implement single delete Message-ID: <20101206143732.GC31100@infradead.org> References: <1290993152-20999-1-git-send-email-david@fromorbit.com> <1290993152-20999-9-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1290993152-20999-9-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291646253 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean > -/* > * Bulk update version of xfs_trans_ail_delete > * > * This version takes an array of log items that all need to removed from the > * AIL. The caller is already holding the AIL lock, and done all the checks Not overly useful now that the non-bulk version is gone. > * necessary to ensure the items passed in via @lgia are ready for deletion. > + * If an item we delete in the AIL is the minimum one, update the tail lsn in > + * the log manager. > * > * This function will not drop the AIL lock until all items are removed from > * the AIL to minimise the amount of lock traffic on the AIL. This does not > * greatly increase the AIL hold time, but does significantly reduce the amount > * of traffic on the lock, especially during IO completion. > + * > + * This function must be called with the AIL lock held. The lock is dropped > + * before returning. These should be in the patch introducing xfs_trans_ail_delete_bulk. Otherwise looks good. From SRS0+od1M+10+fromorbit.com=david@internode.on.net Mon Dec 6 21:43:21 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB73hIL9080590 for ; Mon, 6 Dec 2010 21:43:20 -0600 X-ASG-Debug-ID: 1291693501-5ff8039a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8C97E14223AA for ; Mon, 6 Dec 2010 19:45:01 -0800 (PST) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id UCW5xyiDAmzbiR6G for ; Mon, 06 Dec 2010 19:45:01 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 37555951-1927428 for multiple; Tue, 07 Dec 2010 14:14:59 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PPoU4-00067W-IC; Tue, 07 Dec 2010 14:44:56 +1100 Date: Tue, 7 Dec 2010 14:44:56 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 6/8] xfs: remove all the inodes on a buffer from the AIL in bulk Subject: Re: [PATCH 6/8] xfs: remove all the inodes on a buffer from the AIL in bulk Message-ID: <20101207034456.GB29856@dastard> References: <1290993152-20999-1-git-send-email-david@fromorbit.com> <1290993152-20999-7-git-send-email-david@fromorbit.com> <20101206143308.GA31100@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101206143308.GA31100@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1291693503 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48695 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 06, 2010 at 09:33:08AM -0500, Christoph Hellwig wrote: > While the patch looks good for the ail lock contetion removal, I don't > quite like the model with the double iteration over the log item list > on the buffer. What do you think about the following plan: > > (1) merge xfs_istale_done into xfs_iflush_done by checking for > XFS_ISTALE > (2) convert not only the inode log item completion to your new scheme, > but also the dquots > (3) replace xfs_buf_do_callbacks with a callback in the buffer, which > now points to the inode and dqout routines, or calls the completion > for the only items in "normal" buf items. Seems like a reasonable approach. However, what I'd prefer to do is make these changes as a separate set of changes on top of this patch series rather than try to integrate them into the existing series. If there are problems, that should make it more bisectable. Do you have any concerns with such an approach? Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+4931a86851e2f3a4cf07+2662+infradead.org+hch@bombadil.srs.infradead.org Tue Dec 7 01:37:42 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB77beIw110659 for ; Tue, 7 Dec 2010 01:37:42 -0600 X-ASG-Debug-ID: 1291707567-68e502950000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DCFD31CCE47 for ; Mon, 6 Dec 2010 23:39:27 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 6bCEHQveucwoZ16s for ; Mon, 06 Dec 2010 23:39:27 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PPs8z-0006Bx-HJ; Tue, 07 Dec 2010 07:39:25 +0000 Date: Tue, 7 Dec 2010 02:39:25 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 6/8] xfs: remove all the inodes on a buffer from the AIL in bulk Subject: Re: [PATCH 6/8] xfs: remove all the inodes on a buffer from the AIL in bulk Message-ID: <20101207073925.GA25617@infradead.org> References: <1290993152-20999-1-git-send-email-david@fromorbit.com> <1290993152-20999-7-git-send-email-david@fromorbit.com> <20101206143308.GA31100@infradead.org> <20101207034456.GB29856@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101207034456.GB29856@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[18.85.46.34] X-Barracuda-Start-Time: 1291707567 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 07, 2010 at 02:44:56PM +1100, Dave Chinner wrote: > On Mon, Dec 06, 2010 at 09:33:08AM -0500, Christoph Hellwig wrote: > > While the patch looks good for the ail lock contetion removal, I don't > > quite like the model with the double iteration over the log item list > > on the buffer. What do you think about the following plan: > > > > (1) merge xfs_istale_done into xfs_iflush_done by checking for > > XFS_ISTALE > > (2) convert not only the inode log item completion to your new scheme, > > but also the dquots > > (3) replace xfs_buf_do_callbacks with a callback in the buffer, which > > now points to the inode and dqout routines, or calls the completion > > for the only items in "normal" buf items. > > Seems like a reasonable approach. However, what I'd prefer to do is > make these changes as a separate set of changes on top of this patch > series rather than try to integrate them into the existing series. > If there are problems, that should make it more bisectable. Do you > have any concerns with such an approach? Sounds fine, although I think getting rid of xfs_istale_done might be worth doing before this patch. From BATV+4931a86851e2f3a4cf07+2662+infradead.org+hch@bombadil.srs.infradead.org Tue Dec 7 04:14:55 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB7AEsZv130564 for ; Tue, 7 Dec 2010 04:14:55 -0600 X-ASG-Debug-ID: 1291717002-1c93015b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6FEEA1423160 for ; Tue, 7 Dec 2010 02:16:42 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id JVaSI3a18hijb6ys for ; Tue, 07 Dec 2010 02:16:42 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PPubB-0006lK-PW for xfs@oss.sgi.com; Tue, 07 Dec 2010 10:16:41 +0000 Date: Tue, 7 Dec 2010 05:16:41 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: log timestamp changes to the source inode in rename Subject: [PATCH] xfs: log timestamp changes to the source inode in rename Message-ID: <20101207101641.GA25995@infradead.org> 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[18.85.46.34] X-Barracuda-Start-Time: 1291717002 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Now that we don't mark VFS inodes dirty anymore for internal timestamp changes, but rely on the transaction subsystem to push them out, we need to explicitly log the source inode in rename after updating it's timestamps to make sure the changes actually get forced out by sync/fsync or an AIL push. We already account for the fourth inode in the log reservation, as a rename of directories needs to update the nlink field, so just adding the xfs_trans_log_inode call is enough. This fixes the xfsqa 065 regression introduced by: "xfs: don't use vfs writeback for pure metadata modifications" Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_rename.c =================================================================== --- xfs.orig/fs/xfs/xfs_rename.c 2010-12-07 11:05:15.661253391 +0100 +++ xfs/fs/xfs/xfs_rename.c 2010-12-07 11:05:25.139275042 +0100 @@ -297,6 +297,7 @@ xfs_rename( * it and some incremental backup programs won't work without it. */ xfs_trans_ichgtime(tp, src_ip, XFS_ICHGTIME_CHG); + xfs_trans_log_inode(tp, src_ip, XFS_ILOG_CORE); /* * Adjust the link count on src_dp. This is necessary when From BATV+4931a86851e2f3a4cf07+2662+infradead.org+hch@bombadil.srs.infradead.org Tue Dec 7 04:16:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB7AG0P5130685 for ; Tue, 7 Dec 2010 04:16:01 -0600 X-ASG-Debug-ID: 1291717068-146d01750000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BE3EF1C9DEC0 for ; Tue, 7 Dec 2010 02:17:48 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id zgCck5NhE37CF9WS for ; Tue, 07 Dec 2010 02:17:48 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PPucE-0006mA-IV; Tue, 07 Dec 2010 10:17:46 +0000 Date: Tue, 7 Dec 2010 05:17:46 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: dynamic speculative EOF preallocation Subject: Re: [PATCH 1/2] xfs: dynamic speculative EOF preallocation Message-ID: <20101207101746.GB25995@infradead.org> References: <1290991431-20519-1-git-send-email-david@fromorbit.com> <1290991431-20519-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1290991431-20519-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[18.85.46.34] X-Barracuda-Start-Time: 1291717068 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean I need the patch below to make the new code link on 32-bit systems: Index: xfs/fs/xfs/xfs_mount.c =================================================================== --- xfs.orig/fs/xfs/xfs_mount.c 2010-12-07 11:01:50.394021585 +0100 +++ xfs/fs/xfs/xfs_mount.c 2010-12-07 11:02:46.231256257 +0100 @@ -1111,7 +1111,10 @@ xfs_set_low_space_thresholds( int i; for (i = 0; i < XFS_LOWSP_MAX; i++) { - mp->m_low_space[i] = mp->m_sb.sb_dblocks / 100 * (i + 1); + __uint64_t space = mp->m_sb.sb_dblocks; + do_div(space, 100); + + mp->m_low_space[i] = space * (i + 1); } } From SRS0+8zW4+10+fromorbit.com=david@internode.on.net Tue Dec 7 04:48:11 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB7AmA6Y135501 for ; Tue, 7 Dec 2010 04:48:11 -0600 X-ASG-Debug-ID: 1291718996-5bec00060000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B616A1C9E0C9 for ; Tue, 7 Dec 2010 02:49:56 -0800 (PST) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id x5az2KiRp6qBzdy4 for ; Tue, 07 Dec 2010 02:49:56 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49102023-1927428 for multiple; Tue, 07 Dec 2010 21:19:54 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PPv7I-0006d3-Rt; Tue, 07 Dec 2010 21:49:52 +1100 Date: Tue, 7 Dec 2010 21:49:52 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: dynamic speculative EOF preallocation Subject: Re: [PATCH 1/2] xfs: dynamic speculative EOF preallocation Message-ID: <20101207104952.GC16103@dastard> References: <1290991431-20519-1-git-send-email-david@fromorbit.com> <1290991431-20519-2-git-send-email-david@fromorbit.com> <20101207101746.GB25995@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101207101746.GB25995@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1291718997 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48724 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 07, 2010 at 05:17:46AM -0500, Christoph Hellwig wrote: > I need the patch below to make the new code link on 32-bit systems: > > Index: xfs/fs/xfs/xfs_mount.c > =================================================================== > --- xfs.orig/fs/xfs/xfs_mount.c 2010-12-07 11:01:50.394021585 +0100 > +++ xfs/fs/xfs/xfs_mount.c 2010-12-07 11:02:46.231256257 +0100 > @@ -1111,7 +1111,10 @@ xfs_set_low_space_thresholds( > int i; > > for (i = 0; i < XFS_LOWSP_MAX; i++) { > - mp->m_low_space[i] = mp->m_sb.sb_dblocks / 100 * (i + 1); > + __uint64_t space = mp->m_sb.sb_dblocks; > + do_div(space, 100); > + > + mp->m_low_space[i] = space * (i + 1); > } > } Yes, makes sense. I'll fold that into the latest version of the patch. Thanks. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+h4DP+10+fromorbit.com=david@internode.on.net Tue Dec 7 05:18:48 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB7BIlMh139444 for ; Tue, 7 Dec 2010 05:18:47 -0600 X-ASG-Debug-ID: 1291720832-5bec014e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 119A31C9DEDD for ; Tue, 7 Dec 2010 03:20:32 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id RvH89D5X3JzyN0tm for ; Tue, 07 Dec 2010 03:20:32 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 48482674-1927428 for multiple; Tue, 07 Dec 2010 21:50:31 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PPvav-0006hA-Tr; Tue, 07 Dec 2010 22:20:29 +1100 Date: Tue, 7 Dec 2010 22:20:24 +1100 From: Dave Chinner To: Ajeet Yadav Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS mount fail: XFS_WANT_CORRUPTED_GOTO fs/xfs/xfs_alloc.c Subject: Re: XFS mount fail: XFS_WANT_CORRUPTED_GOTO fs/xfs/xfs_alloc.c Message-ID: <20101207112024.GD16103@dastard> References: <20101202224506.GY16922@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1291720835 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48726 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, Dec 04, 2010 at 09:49:25AM +0530, Ajeet Yadav wrote: > Our test case is automated: > 1. Create large number of file of 6KB sizes ( 6KB is taken, we wanted to > increase journal load, and file size not in multiple of file system block > size) > 2. Set target to reboot at random seconds seconds. > 3. Next boot do "ls" of all files in XFS partition. > 4. Remove all files in XFS. > 5. Go back to step 1 > > The purpose of this test is to test journal and stability of XFS filestem. > > Do you think, we should consider this test case ? Are you running with barriers enabled? What are your mkfs and mount options? Also, does the problem exist on a current kernel? We've fixed lots of writeback related problems since 2.6.30, so I'd suggest that you need to reproduce this on a current kernel before anyone will spend large amounts of time trying to track it down. Especially as xfstests 136-140 do similar testing (just without the reboots) and don't show any problems. > Other is when we should run xfs_repair ? because if mount fails and journal > contain dirty logs then xfs_repair does not run, we are forced to use (-L) > option but its description say that (-L) can corrupt the file system. Yes, it can. > Other case even if xfs mount successfully, even in that case accessing some > files give IO input/ output error. Which means something got corrupted. Look in dmesg for reasons why. > 1. I recommend the following usage for xfs_repair so that we do not come > accross these problem > Mount Success -> Umount -> run xfs_repair -> mount > Mount fails -> try xfs_repair -> xfs_repair fails -> finally xfs_repair > -L -> mount > > Adding above mount + xfs_repair procedure to script makes file system > stable. But other member of my team do not agree as it increases mount time. I agree with your team members. All you are proposing to do is to hide failures that need further investigation... Cheers, Dave. -- Dave Chinner david@fromorbit.com From lists@nabble.com Tue Dec 7 05:48:04 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB7Bm4nq142847 for ; Tue, 7 Dec 2010 05:48:04 -0600 X-ASG-Debug-ID: 1291722589-747a01590000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from kuber.nabble.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E38A21420CC4 for ; Tue, 7 Dec 2010 03:49:49 -0800 (PST) Received: from kuber.nabble.com (kuber.nabble.com [216.139.236.158]) by cuda.sgi.com with ESMTP id 4YfOpZ4QxrDUPZdy for ; Tue, 07 Dec 2010 03:49:49 -0800 (PST) Received: from isper.nabble.com ([192.168.236.156]) by kuber.nabble.com with esmtp (Exim 4.63) (envelope-from ) id 1PPw3J-0000DU-CT for xfs@oss.sgi.com; Tue, 07 Dec 2010 03:49:49 -0800 Message-ID: <30395558.post@talk.nabble.com> Date: Tue, 7 Dec 2010 03:49:49 -0800 (PST) From: blacknred To: xfs@oss.sgi.com X-ASG-Orig-Subj: possible xfs corruption Subject: possible xfs corruption MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Nabble-From: leo1783@hotmail.co.uk X-Barracuda-Connect: kuber.nabble.com[216.139.236.158] X-Barracuda-Start-Time: 1291722590 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48727 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi... I'm stuck with a storage issue on reboot. Initially doubted the storage, but dmesg throws these errors. Now wondering whether this is a fs issue? Any thoughts as to whats going on here? XFS: failed to locate log tail XFS: log mount/recovery failed: error 117 XFS: log mount failed XFS mounting filesystem cciss/c0d0 Filesystem "cciss/c0d0": XFS internal error xlog_clear_stale_blocks(2) at line 1237 of file /home/buildsvn/rpmbuild/BUILD/xfs-kmod-0.4/_kmod_build_PAE/xfs_log_recover.c. Caller 0xf8aa7892 [] xlog_find_tail+0x91b/0xa4a [xfs] [] xlog_recover+0x15/0x20b [xfs] [] xlog_recover+0x15/0x20b [xfs] [] xfs_buf_get_empty+0x2a/0x33 [xfs] [] xfs_log_mount+0x467/0x4ab [xfs] [] kmem_zalloc+0xd/0x34 [xfs] [] xfs_mountfs+0x9f5/0xdfb [xfs] [] xfs_fs_vcmn_err+0x5f/0x83 [xfs] [] xfs_mountfs_check_barriers+0xb8/0xd0 [xfs] [] xfs_mount+0x75e/0x82a [xfs] [] xfs_mount+0x0/0x82a [xfs] [] vfs_mount+0x17/0x1a [xfs] [] xfs_fs_fill_super+0x68/0x1a5 [xfs] [] snprintf+0x1c/0x1f [] disk_name+0x56/0x60 [] get_sb_bdev+0xc6/0x113 [] xfs_fs_get_sb+0x12/0x16 [xfs] [] xfs_fs_fill_super+0x0/0x1a5 [xfs] [] vfs_kern_mount+0x7d/0xf2 [] do_kern_mount+0x25/0x36 [] do_mount+0x5fb/0x66b [] avc_has_perm+0x3c/0x46 [] avc_has_perm+0x3c/0x46 [] selinux_inode_alloc_security+0x50/0x7b [] inode_doinit_with_dentry+0x8a/0x495 [] get_page_from_freelist+0x96/0x370 [] __alloc_pages+0x69/0x2cf [] copy_mount_options+0x26/0x109 [] sys_mount+0x6d/0xa5 [] sysenter_past_esp+0x56/0x79 Thanks in advance David -- View this message in context: http://old.nabble.com/possible-xfs-corruption-tp30395558p30395558.html Sent from the Xfs - General mailing list archive at Nabble.com. From btharindu@gmail.com Tue Dec 7 06:55:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB7CtaG2150672 for ; Tue, 7 Dec 2010 06:55:36 -0600 X-ASG-Debug-ID: 1291726643-52c203e60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-iw0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CFA491CDA77 for ; Tue, 7 Dec 2010 04:57:23 -0800 (PST) Received: from mail-iw0-f181.google.com (mail-iw0-f181.google.com [209.85.214.181]) by cuda.sgi.com with ESMTP id 2GbNeLkF4qPrSo0n for ; Tue, 07 Dec 2010 04:57:23 -0800 (PST) Received: by iwn3 with SMTP id 3so17007803iwn.26 for ; Tue, 07 Dec 2010 04:57:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:mime-version:received:from:date :message-id:subject:to:content-type; bh=RbW+Ep3b0vEEDqooeiC1RmPIWtg5SlNw0Cfne/Bnueo=; b=jYjHcbAz8mAB7g7KMJEnpduCsJX0GHasHwJGbANcQoaxWm1C5ngT7yCAE+XsrrO4Mp encXXh9d+ciJAYiMFzrub+kxL0zjPuiYeFfmEo0rxnVbe/zgnzuzz2pfRy91TGI3Dxnx hqPImwI2KkMIKhq9Dx0wtAxJ8GNpyBYKgsJqo= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:from:date:message-id:subject:to:content-type; b=tO0UJggW0wHptJG6G7gWND3JraB1B9kZW1rhWfQLxnncH4GMx/J+HGeD8den3ohler tgGxx5nt0qwtM2Eh1eZeYnd6nCsMoVAxSRVnCIj2dn0Cqe/Q8wcuHwpzwTZH3NzmvhFN baNbJtO8GIbfpGeOcE4folnaPBz9g4g03R8EM= Received: by 10.231.20.70 with SMTP id e6mr7418786ibb.199.1291726642964; Tue, 07 Dec 2010 04:57:22 -0800 (PST) MIME-Version: 1.0 Received: by 10.231.12.4 with HTTP; Tue, 7 Dec 2010 04:56:52 -0800 (PST) From: Tharindu Rukshan Bamunuarachchi Date: Tue, 7 Dec 2010 18:26:52 +0530 Message-ID: X-ASG-Orig-Subj: xfs_count_page_state inside kswapd Subject: xfs_count_page_state inside kswapd To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=000325576092b36b900496d18bf6 X-Barracuda-Connect: mail-iw0-f181.google.com[209.85.214.181] X-Barracuda-Start-Time: 1291726643 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48732 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.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --000325576092b36b900496d18bf6 Content-Type: text/plain; charset=UTF-8 Dear All, We got following oops in one of our SLES 11 server. This occurred inside swapd and we running our server swap turned off.. Could this be memory corruption or possible old bug in code ? Please help. Thanks Dec 6 22:55:46 tm-spes-md102 kernel: BUG: unable to handle kernel NULL pointer dereference at 0000000000000000 Dec 6 22:55:46 tm-spes-md102 kernel: IP: [] xfs_count_page_state+0x25/0x66 [xfs] Dec 6 22:55:46 tm-spes-md102 kernel: PGD 37dc4e067 PUD 16f631067 PMD 0 Dec 6 22:55:46 tm-spes-md102 kernel: Oops: 0000 [1] SMP Dec 6 22:55:46 tm-spes-md102 kernel: last sysfs file: /sys/devices/pci0000:00/0000:00:03.0/0000:15:00.0/infiniband/mlx4_0/node_type Dec 6 22:55:46 tm-spes-md102 kernel: CPU 2 Dec 6 22:55:46 tm-spes-md102 kernel: Modules linked in: af_packet st ide_disk ide_cd_mod lp parport_pc ppdev parport nfs lockd nfs_acl sunrpc ipmi_devintf ipmi_si ipmi_msghandler bonding microcode binfmt_misc rdma_ucm(N) ib_sdp(N) rdma_cm(N) iw_cm(N) ib_addr(N) ib_ipoib( N) ib_cm(N) ib_sa(N) ipv6 ib_uverbs(N) ib_umad(N) mlx4_en(N) mlx4_ib(N) ib_mthca(N) ib_mad(N) ib_core(N) fuse ext2 xfs loop dm_mod joyde v cdc_ether rtc_cmos usbhid usbnet rtc_core mlx4_core(N) hid shpchp i2c_i801 pci_hotplug button pcspkr mii sr_mod i2c_core rtc_lib ff_me mless cdrom sg uhci_hcd sd_mod ehci_hcd crc_t10dif usbcore edd ext3 mbcache jbd fan thermal processor thermal_sys hwmon ide_pci_generic ide_core ata_generic ata_piix libata dock megaraid_sas scsi_mod [last unloaded: parport_pc] Dec 6 22:55:46 tm-spes-md102 kernel: Supported: No, Unsupported modules are loaded Dec 6 22:55:46 tm-spes-md102 kernel: Pid: 58, comm: kswapd0 Tainted: G 2.6.27.45-0.1-default #1 Dec 6 22:55:46 tm-spes-md102 kernel: RIP: 0010:[] [] xfs_count_page_state+0x25/0x66 [xfs] Dec 6 22:55:46 tm-spes-md102 kernel: RSP: 0018:ffff88037cdcbbe8 EFLAGS: 00010207 Dec 6 22:55:46 tm-spes-md102 kernel: RAX: ffff88038ceff610 RBX: ffffe20012c30b40 RCX: ffff88037cdcbc34 Dec 6 22:55:46 tm-spes-md102 kernel: RDX: ffff88037cdcbc38 RSI: ffff88037cdcbc3c RDI: ffffe20012c30b40 Dec 6 22:55:46 tm-spes-md102 kernel: RBP: 0000000000000000 R08: 0000000000000021 R09: 0000000000000000 Dec 6 22:55:46 tm-spes-md102 kernel: R10: ffff88038ceff678 R11: ffffffffa0251b18 R12: ffff880517690480 Dec 6 22:55:46 tm-spes-md102 kernel: R13: ffff88037cdcbce0 R14: 00000000002548c2 R15: ffff880517690590 Dec 6 22:55:46 tm-spes-md102 kernel: FS: 0000000000000000(0000) GS:ffff88037e520e40(0000) knlGS:0000000000000000 Dec 6 22:55:46 tm-spes-md102 kernel: CS: 0010 DS: 0018 ES: 0018 CR0: 000000008005003b Dec 6 22:55:46 tm-spes-md102 kernel: CR2: 0000000000000000 CR3: 000000016f670000 CR4: 00000000000006e0 Dec 6 22:55:46 tm-spes-md102 kernel: DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 Dec 6 22:55:46 tm-spes-md102 kernel: DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 Dec 6 22:55:46 tm-spes-md102 kernel: Process kswapd0 (pid: 58, threadinfo ffff88037cdca000, task ffff88037cdc8780) Dec 6 22:55:47 tm-spes-md102 kernel: Stack: ffffffffa0251b68 0000000000000000 0000000000000001 0000000000000000 Dec 6 22:55:47 tm-spes-md102 kernel: 0000000000000001 0000000000000000 0000000000000000 0000000000000000 Dec 6 22:55:47 tm-spes-md102 kernel: 0000000000000000 00000000002acfa4 0000000000000000 ffffe20012c30b40 Dec 6 22:55:47 tm-spes-md102 kernel: Call Trace: Dec 6 22:55:47 tm-spes-md102 kernel: [] xfs_vm_releasepage+0x50/0xa5 [xfs] Dec 6 22:55:47 tm-spes-md102 kernel: [] __invalidate_mapping_pages+0x98/0x12d Dec 6 22:55:47 tm-spes-md102 kernel: [] prune_icache+0xe7/0x1f7 Dec 6 22:55:47 tm-spes-md102 kernel: [] shrink_icache_memory+0x15/0x32 Dec 6 22:55:47 tm-spes-md102 kernel: [] shrink_slab+0xe4/0x157 Dec 6 22:55:47 tm-spes-md102 kernel: [] balance_pgdat+0x292/0x3d6 Dec 6 22:55:53 tm-spes-md102 kernel: [] kswapd+0x12a/0x12c Dec 6 22:55:53 tm-spes-md102 kernel: [] kthread+0x47/0x73 Dec 6 22:55:53 tm-spes-md102 kernel: [] child_rip+0xa/0x11 Dec 6 22:55:53 tm-spes-md102 kernel: Dec 6 22:55:53 tm-spes-md102 kernel: Dec 6 22:55:53 tm-spes-md102 kernel: Code: 1f eb ef 90 90 90 c7 01 00 00 00 00 c7 02 00 00 00 00 c7 06 00 00 00 00 48 8b 07 f6 c4 10 75 04 0f 0b eb fe 48 8b 47 10 49 89 c1 <4d> 8b 01 41 f6 c0 01 74 0e 41 f6 c0 20 75 08 c7 02 01 00 00 00 Dec 6 22:55:53 tm-spes-md102 kernel: RIP [] xfs_count_page_state+0x25/0x66 [xfs] Dec 6 22:55:53 tm-spes-md102 kernel: RSP Dec 6 22:55:53 tm-spes-md102 kernel: CR2: 0000000000000000 __ Tharindu *R* Bamunuarachchi. --000325576092b36b900496d18bf6 Content-Type: text/html; charset=UTF-8 Dear All,

We got following oops in one of our SLES 11 server. This occurred inside swapd and we running our server swap turned off..

Could this be memory corruption or possible old bug in code ?

Please help.
Thanks

Dec 6 22:55:46 tm-spes-md102 kernel: BUG: unable to handle kernel NULL pointer dereference at 0000000000000000
Dec 6 22:55:46 tm-spes-md102 kernel: IP: [<ffffffffa0250659>] xfs_count_page_state+0x25/0x66 [xfs]
Dec 6 22:55:46 tm-spes-md102 kernel: PGD 37dc4e067 PUD 16f631067 PMD 0
Dec 6 22:55:46 tm-spes-md102 kernel: Oops: 0000 [1] SMP
Dec 6 22:55:46 tm-spes-md102 kernel: last sysfs file: /sys/devices/pci0000:00/0000:00:03.0/0000:15:00.0/infiniband/mlx4_0/node_type
Dec 6 22:55:46 tm-spes-md102 kernel: CPU 2
Dec 6 22:55:46 tm-spes-md102 kernel: Modules linked in: af_packet st ide_disk ide_cd_mod lp parport_pc ppdev parport nfs lockd nfs_acl
sunrpc ipmi_devintf ipmi_si ipmi_msghandler bonding microcode binfmt_misc rdma_ucm(N) ib_sdp(N) rdma_cm(N) iw_cm(N) ib_addr(N) ib_ipoib(
N) ib_cm(N) ib_sa(N) ipv6 ib_uverbs(N) ib_umad(N) mlx4_en(N) mlx4_ib(N) ib_mthca(N) ib_mad(N) ib_core(N) fuse ext2 xfs loop dm_mod joyde
v cdc_ether rtc_cmos usbhid usbnet rtc_core mlx4_core(N) hid shpchp i2c_i801 pci_hotplug button pcspkr mii sr_mod i2c_core rtc_lib ff_me
mless cdrom sg uhci_hcd sd_mod ehci_hcd crc_t10dif usbcore edd ext3 mbcache jbd fan thermal processor thermal_sys hwmon ide_pci_generic
ide_core ata_generic ata_piix libata dock megaraid_sas scsi_mod [last unloaded: parport_pc]
Dec 6 22:55:46 tm-spes-md102 kernel: Supported: No, Unsupported modules are loaded
Dec 6 22:55:46 tm-spes-md102 kernel: Pid: 58, comm: kswapd0 Tainted: G 2.6.27.45-0.1-default #1
Dec 6 22:55:46 tm-spes-md102 kernel: RIP: 0010:[<ffffffffa0250659>] [<ffffffffa0250659>] xfs_count_page_state+0x25/0x66 [xfs]
Dec 6 22:55:46 tm-spes-md102 kernel: RSP: 0018:ffff88037cdcbbe8 EFLAGS: 00010207
Dec 6 22:55:46 tm-spes-md102 kernel: RAX: ffff88038ceff610 RBX: ffffe20012c30b40 RCX: ffff88037cdcbc34
Dec 6 22:55:46 tm-spes-md102 kernel: RDX: ffff88037cdcbc38 RSI: ffff88037cdcbc3c RDI: ffffe20012c30b40
Dec 6 22:55:46 tm-spes-md102 kernel: RBP: 0000000000000000 R08: 0000000000000021 R09: 0000000000000000
Dec 6 22:55:46 tm-spes-md102 kernel: R10: ffff88038ceff678 R11: ffffffffa0251b18 R12: ffff880517690480
Dec 6 22:55:46 tm-spes-md102 kernel: R13: ffff88037cdcbce0 R14: 00000000002548c2 R15: ffff880517690590
Dec 6 22:55:46 tm-spes-md102 kernel: FS: 0000000000000000(0000) GS:ffff88037e520e40(0000) knlGS:0000000000000000
Dec 6 22:55:46 tm-spes-md102 kernel: CS: 0010 DS: 0018 ES: 0018 CR0: 000000008005003b
Dec 6 22:55:46 tm-spes-md102 kernel: CR2: 0000000000000000 CR3: 000000016f670000 CR4: 00000000000006e0
Dec 6 22:55:46 tm-spes-md102 kernel: DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
Dec 6 22:55:46 tm-spes-md102 kernel: DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Dec 6 22:55:46 tm-spes-md102 kernel: Process kswapd0 (pid: 58, threadinfo ffff88037cdca000, task ffff88037cdc8780)
Dec 6 22:55:47 tm-spes-md102 kernel: Stack: ffffffffa0251b68 0000000000000000 0000000000000001 0000000000000000
Dec 6 22:55:47 tm-spes-md102 kernel: 0000000000000001 0000000000000000 0000000000000000 0000000000000000
Dec 6 22:55:47 tm-spes-md102 kernel: 0000000000000000 00000000002acfa4 0000000000000000 ffffe20012c30b40
Dec 6 22:55:47 tm-spes-md102 kernel: Call Trace:
Dec 6 22:55:47 tm-spes-md102 kernel: [<ffffffffa0251b68>] xfs_vm_releasepage+0x50/0xa5 [xfs]
Dec 6 22:55:47 tm-spes-md102 kernel: [<ffffffff8028bf57>] __invalidate_mapping_pages+0x98/0x12d
Dec 6 22:55:47 tm-spes-md102 kernel: [<ffffffff802c4ca1>] prune_icache+0xe7/0x1f7
Dec 6 22:55:47 tm-spes-md102 kernel: [<ffffffff802c4dc6>] shrink_icache_memory+0x15/0x32
Dec 6 22:55:47 tm-spes-md102 kernel: [<ffffffff8028dc59>] shrink_slab+0xe4/0x157
Dec 6 22:55:47 tm-spes-md102 kernel: [<ffffffff8028e173>] balance_pgdat+0x292/0x3d6
Dec 6 22:55:53 tm-spes-md102 kernel: [<ffffffff8028e3e1>] kswapd+0x12a/0x12c
Dec 6 22:55:53 tm-spes-md102 kernel: [<ffffffff8024fb2f>] kthread+0x47/0x73
Dec 6 22:55:53 tm-spes-md102 kernel: [<ffffffff8020cfb9>] child_rip+0xa/0x11
Dec 6 22:55:53 tm-spes-md102 kernel:
Dec 6 22:55:53 tm-spes-md102 kernel:
Dec 6 22:55:53 tm-spes-md102 kernel: Code: 1f eb ef 90 90 90 c7 01 00 00 00 00 c7 02 00 00 00 00 c7 06 00 00 00 00 48 8b 07 f6 c4 10 75
04 0f 0b eb fe 48 8b 47 10 49 89 c1 <4d> 8b 01 41 f6 c0 01 74 0e 41 f6 c0 20 75 08 c7 02 01 00 00 00
Dec 6 22:55:53 tm-spes-md102 kernel: RIP [<ffffffffa0250659>] xfs_count_page_state+0x25/0x66 [xfs]
Dec 6 22:55:53 tm-spes-md102 kernel: RSP <ffff88037cdcbbe8>
Dec 6 22:55:53 tm-spes-md102 kernel: CR2: 0000000000000000

__
Tharindu R Bamunuarachchi.

--000325576092b36b900496d18bf6-- From eflorac@intellique.com Tue Dec 7 08:08:57 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB7E8uqQ158213 for ; Tue, 7 Dec 2010 08:08:56 -0600 X-ASG-Debug-ID: 1291731038-78a201a00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4E2131C9EA96 for ; Tue, 7 Dec 2010 06:10:41 -0800 (PST) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id QsUtZ6AdEOBh3REs for ; Tue, 07 Dec 2010 06:10:41 -0800 (PST) Received: from harpe.intellique.com (unknown [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id 4CC694C80C9; Tue, 7 Dec 2010 15:10:34 +0100 (CET) Date: Tue, 7 Dec 2010 15:10:39 +0100 From: Emmanuel Florac To: blacknred Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: possible xfs corruption Subject: Re: possible xfs corruption Message-ID: <20101207151039.25d45cb5@harpe.intellique.com> In-Reply-To: <30395558.post@talk.nabble.com> References: <30395558.post@talk.nabble.com> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.16.6; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1291731044 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.82 X-Barracuda-Spam-Status: No, SCORE=-1.82 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA620b, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48736 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.20 BSF_SC0_SA620b Custom Rule SA620b X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Tue, 7 Dec 2010 03:49:49 -0800 (PST) blacknred =E9crivait: > I'm stuck with a storage issue on reboot. Initially doubted the > storage, but dmesg throws these errors. Now wondering whether this is > a fs issue? Any thoughts as to whats going on here? >=20 It looks like a part of the filesystem is physically missing. What is the underlying device? Apparently it's a SmartArray in some HP server, did you had a power failure?=20 --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From lists@nabble.com Tue Dec 7 09:09:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB7F9H63167789 for ; Tue, 7 Dec 2010 09:09:18 -0600 X-ASG-Debug-ID: 1291734664-735600aa0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from kuber.nabble.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2E24D1CED62 for ; Tue, 7 Dec 2010 07:11:04 -0800 (PST) Received: from kuber.nabble.com (kuber.nabble.com [216.139.236.158]) by cuda.sgi.com with ESMTP id I4U6yPb5HWEvTut4 for ; Tue, 07 Dec 2010 07:11:04 -0800 (PST) Received: from isper.nabble.com ([192.168.236.156]) by kuber.nabble.com with esmtp (Exim 4.63) (envelope-from ) id 1PPzC4-0001fw-5W for xfs@oss.sgi.com; Tue, 07 Dec 2010 07:11:04 -0800 Message-ID: <30397173.post@talk.nabble.com> Date: Tue, 7 Dec 2010 07:11:04 -0800 (PST) From: blacknred To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: possible xfs corruption Subject: Re: possible xfs corruption In-Reply-To: <20101207151039.25d45cb5@harpe.intellique.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Nabble-From: leo1783@hotmail.co.uk References: <30395558.post@talk.nabble.com> <20101207151039.25d45cb5@harpe.intellique.com> X-Barracuda-Connect: kuber.nabble.com[216.139.236.158] X-Barracuda-Start-Time: 1291734665 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48740 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Yes, It's a Smart Array in HP Proliant Server. No power failure, just upgraded the controller firmware and rebooted the server..... Emmanuel Florac wrote: >=20 > Le Tue, 7 Dec 2010 03:49:49 -0800 (PST) > blacknred =C3=A9crivait: >=20 >> I'm stuck with a storage issue on reboot. Initially doubted the >> storage, but dmesg throws these errors. Now wondering whether this is >> a fs issue? Any thoughts as to whats going on here? >>=20 >=20 > It looks like a part of the filesystem is physically missing. What is > the underlying device? Apparently it's a SmartArray in some HP server, > did you had a power failure?=20 >=20 > --=20 > ------------------------------------------------------------------------ > Emmanuel Florac | Direction technique > | Intellique > |=09 > | +33 1 78 94 84 02 > ------------------------------------------------------------------------ >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs >=20 >=20 --=20 View this message in context: http://old.nabble.com/possible-xfs-corruption= -tp30395558p30397173.html Sent from the Xfs - General mailing list archive at Nabble.com. From eflorac@intellique.com Tue Dec 7 09:40:43 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_74 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB7Fehfj172239 for ; Tue, 7 Dec 2010 09:40:43 -0600 X-ASG-Debug-ID: 1291736545-735701520000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1F6961CEFC7 for ; Tue, 7 Dec 2010 07:42:29 -0800 (PST) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id bukVvV3Ym26ayXRm for ; Tue, 07 Dec 2010 07:42:29 -0800 (PST) Received: from harpe.intellique.com (unknown [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id B57194C8180; Tue, 7 Dec 2010 16:42:21 +0100 (CET) Date: Tue, 7 Dec 2010 16:42:27 +0100 From: Emmanuel Florac To: blacknred Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: possible xfs corruption Subject: Re: possible xfs corruption Message-ID: <20101207164227.152cef01@harpe.intellique.com> In-Reply-To: <30397173.post@talk.nabble.com> References: <30395558.post@talk.nabble.com> <20101207151039.25d45cb5@harpe.intellique.com> <30397173.post@talk.nabble.com> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.16.6; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1291736551 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.82 X-Barracuda-Spam-Status: No, SCORE=-1.82 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA620b, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48742 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.20 BSF_SC0_SA620b Custom Rule SA620b X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Tue, 7 Dec 2010 07:11:04 -0800 (PST) blacknred =E9crivait: > Yes, It's a Smart Array in HP Proliant Server. > No power failure, just upgraded the controller firmware and rebooted > the server..... >=20 Hu oh, that stinks. Nothing in the firmware release notes? Do you have any other filesystem on this array?=20 First you could try to backup the filesystem metadata using xfs_metadump -o -w /dev/DEVICE outfile.meta It can be useful later in case things turn bad. Does it output any errors? IO errors particularly ? --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From lists@nabble.com Tue Dec 7 09:41:10 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB7FfA17172276 for ; Tue, 7 Dec 2010 09:41:10 -0600 X-ASG-Debug-ID: 1291736577-3ce701010000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from kuber.nabble.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7F7DB1C9F690 for ; Tue, 7 Dec 2010 07:42:57 -0800 (PST) Received: from kuber.nabble.com (kuber.nabble.com [216.139.236.158]) by cuda.sgi.com with ESMTP id N5Fbyj51slMyuJZR for ; Tue, 07 Dec 2010 07:42:57 -0800 (PST) Received: from isper.nabble.com ([192.168.236.156]) by kuber.nabble.com with esmtp (Exim 4.63) (envelope-from ) id 1PPzgu-0004cE-TT for xfs@oss.sgi.com; Tue, 07 Dec 2010 07:42:56 -0800 Message-ID: <30397503.post@talk.nabble.com> Date: Tue, 7 Dec 2010 07:42:56 -0800 (PST) From: blacknred To: xfs@oss.sgi.com X-ASG-Orig-Subj: kernel panic-xfs errors Subject: kernel panic-xfs errors MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Nabble-From: leo1783@hotmail.co.uk X-Barracuda-Connect: kuber.nabble.com[216.139.236.158] X-Barracuda-Start-Time: 1291736577 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48742 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi..... I get a kernel panic on my HP Proliant Server. here's trace: BUG: unable to handle kernel NULL pointer dereference at virtual address 00000052 printing eip: *pde = 2c731001 Oops: 0000 [#1] SMP CPU: 2 EIP: 0060:[] Tainted: GF VLI EFLAGS: 00010272 (2.6.33.3-85.fc13.x86_64 #1) EIP is at do_page_fault+0x245/0x617 eax: ec5ee000 ebx: 00000000 ecx: eb5de084 edx: 0000000e esi: 00013103 edi: ec5de0b3 ebp: 00000023 esp: ec5de024 ds: 008b es: 008b ss: 0078 Process bm (pid: 3210, ti=ec622000 task=ec5e3450 task.ti=ec6ee000) Stack: 00000000 00000000 ecd5e0a4 00000024 00000093 f7370000 00000007 00000000 ed6ef0a4 c0639569 00000000 0000000f 0000000b 00000000 00000000 00000000 00015106 c0629b9d 00000014 c0305b83 00000000 ec3d40f7 0000000e 00013006 Call Trace: [] do_page_fault+0x0/0x607 [] error_code+0x49/0x50 [] do_page_fault+0x204/00x607 [] elv_next_request+0x137/0x234 [] do_cciss_request+0x397/0x3a3 [cciss] [] do_page_fault+0x0/0x607 [] error_code+0x49/0x40 [] do_page_fault+0x215/0x607 [] deadline_set_request+0x26/0x57 [] do_page_fault+0x0/0x607 [] error_code+0x39/0x40 [] __down+0x2b/0xbb [] default_wake_function+0x0/0xc [] __down_failed+0x7/0xc [] .text.lock.xfs_buf+0x17/0x5f [xfs] [] xfs_buf_read_flags+0x48/0x76 [xfs] [] xfs_trans_read_buf+0x1bb/0x2c0 [xfs] [] xfs_btree_read_bufl+0x96/0xb3 [xfs] [] xfs_bmbt_lookup+0x135/0x478 [xfs] [] xfs_bmap_add_extent+0xd2b/0x1e30 [xfs] [] xfs_alloc_update+0x3a/0xbc [xfs] [] xfs_alloc_fixup_trees+0x217/0x29a [xfs] [] xfs_trans_log_buf+0x49/0x6c [xfs] [] xfs_alloc_search_busy+0x20/0xae [xfs] [] xfs_iext_bno_to_ext+0xd8/0x191 [xfs] [] kmem_zone_zalloc+0x1d/0x41 [xfs] [] xfs_bmapi+0x15fe/0x2016 [xfs] [] xfs_iext_bno_to_ext+0x48/0x191 [xfs] [] xfs_bmap_search_multi_extents+0x8a/0xc5 [xfs] [] xfs_iomap_write_allocate+0x29c/0x469 [xfs] [] lock_timer_base+0x15/0x2f [] del_timer+0x41/0x47 [] xfs_iomap+0x409/0x71d [xfs] [] xfs_map_blocks+0x29/0x52 [xfs] [] xfs_page_state_convert+0x37b/0xd2e [xfs] [] xfs_bmap_add_extent+0x1dcf/0x1e30 [xfs] [] xfs_bmap_search_multi_extents+0x8a/0xc5 [xfs] [] xfs_bmapi+0x272/0x2017 [xfs] [] xfs_bmapi+0x1853/0x2017 [xfs] [] find_get_pages_tag+0x40/0x75 [] xfs_vm_writepage+0x8f/0xd2 [xfs] [] mpage_writepages+0x1b7/0x310 [] xfs_vm_writepage+0x0/0xc4 [xfs] [] do_writepages+0x20/0x42 [] __writeback_single_inode+0x180/0x2af [] write_inode_now+0x67/0xa7 [] file_fsync+0xf/0x6c [] moddw_ioctl+0x420/0x679 [mod_dw] [] __cond_resched+0x16/0x54 [] do_ioctl+0x47/0x5d [] vfs_ioctl+0x47b/0x4d3 [] sys_ioctl+0x48/0x4f [] sysenter_past_esp+0x46/0x79 dmesg shows: XFS: bad magic number XFS: SB validate failed I rebooted the server, now xfs_repair comes clean. But the server has hung again after an hour. No panic this time, checked dmesg output and it again shows same XFS: bad magic number XFS: SB validate failed messages.. Any thoughts?? Thanks in advance David -- View this message in context: http://old.nabble.com/kernel-panic-xfs-errors-tp30397503p30397503.html Sent from the Xfs - General mailing list archive at Nabble.com. From eflorac@intellique.com Tue Dec 7 09:57:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB7FvW1w175576 for ; Tue, 7 Dec 2010 09:57:33 -0600 X-ASG-Debug-ID: 1291737554-731301af0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6CA5A1CEC33 for ; Tue, 7 Dec 2010 07:59:18 -0800 (PST) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id wLH9ftkdwLZUsaVo for ; Tue, 07 Dec 2010 07:59:18 -0800 (PST) Received: from harpe.intellique.com (unknown [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id BCB7E4C80E1; Tue, 7 Dec 2010 16:59:10 +0100 (CET) Date: Tue, 7 Dec 2010 16:59:17 +0100 From: Emmanuel Florac To: blacknred Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: kernel panic-xfs errors Subject: Re: kernel panic-xfs errors Message-ID: <20101207165917.0c96dd95@harpe.intellique.com> In-Reply-To: <30397503.post@talk.nabble.com> References: <30397503.post@talk.nabble.com> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.16.6; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1291737560 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.82 X-Barracuda-Spam-Status: No, SCORE=-1.82 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA620b, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48744 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.20 BSF_SC0_SA620b Custom Rule SA620b X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Tue, 7 Dec 2010 07:42:56 -0800 (PST) blacknred =E9crivait: > But the server has hung again after an hour. No panic this time, > checked dmesg output and it again > shows same=20 > XFS: bad magic number > XFS: SB validate failed=20 > messages.. Any thoughts?? >=20 What is the kernel version, distro, and xfs_progs? You didn't update anything but the controller firmware? Is the new firmware compatible with the previous driver? This one is intriguing : [] do_cciss_request+0x397/0x3a3 [cciss] --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From lists@nabble.com Tue Dec 7 11:18:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB7HIUBH187790 for ; Tue, 7 Dec 2010 11:18:30 -0600 X-ASG-Debug-ID: 1291742417-3ca502670000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from kuber.nabble.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E31701C9FC8F for ; Tue, 7 Dec 2010 09:20:17 -0800 (PST) Received: from kuber.nabble.com (kuber.nabble.com [216.139.236.158]) by cuda.sgi.com with ESMTP id KZtkzx6xeB4stmff for ; Tue, 07 Dec 2010 09:20:17 -0800 (PST) Received: from isper.nabble.com ([192.168.236.156]) by kuber.nabble.com with esmtp (Exim 4.63) (envelope-from ) id 1PQ1D7-0005xH-6i for xfs@oss.sgi.com; Tue, 07 Dec 2010 09:20:17 -0800 Message-ID: <30398448.post@talk.nabble.com> Date: Tue, 7 Dec 2010 09:20:17 -0800 (PST) From: blacknred To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: kernel panic-xfs errors Subject: Re: kernel panic-xfs errors In-Reply-To: <20101207165917.0c96dd95@harpe.intellique.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Nabble-From: leo1783@hotmail.co.uk References: <30397503.post@talk.nabble.com> <20101207165917.0c96dd95@harpe.intellique.com> X-Barracuda-Connect: kuber.nabble.com[216.139.236.158] X-Barracuda-Start-Time: 1291742417 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48750 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean kernel-2.6.18-164.el5 rhel 5.0 xfs_progs ver: 2.9.4 I haven't updated the controller on this server, it just panicked while doing I/O [] do_cciss_request+0x397/0x3a3 [cciss] looks like the controller was wedged there? Emmanuel Florac wrote: >=20 > Le Tue, 7 Dec 2010 07:42:56 -0800 (PST) > blacknred =C3=A9crivait: >=20 >> But the server has hung again after an hour. No panic this time, >> checked dmesg output and it again >> shows same=20 >> XFS: bad magic number >> XFS: SB validate failed=20 >> messages.. Any thoughts?? >>=20 >=20 > What is the kernel version, distro, and xfs_progs? You didn't update > anything but the controller firmware? Is the new firmware compatible > with the previous driver? >=20 > This one is intriguing : >=20 > [] do_cciss_request+0x397/0x3a3 [cciss] >=20 > --=20 > ------------------------------------------------------------------------ > Emmanuel Florac | Direction technique > | Intellique > |=09 > | +33 1 78 94 84 02 > ------------------------------------------------------------------------ >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs >=20 >=20 --=20 View this message in context: http://old.nabble.com/kernel-panic-xfs-errors= -tp30397503p30398448.html Sent from the Xfs - General mailing list archive at Nabble.com. From lists@nabble.com Tue Dec 7 11:28:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,FREEMAIL_FROM, J_CHICKENPOX_74,T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB7HSatG189222 for ; Tue, 7 Dec 2010 11:28:36 -0600 X-ASG-Debug-ID: 1291743023-3cb9028e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from kuber.nabble.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EBC9B1C9FD85 for ; Tue, 7 Dec 2010 09:30:23 -0800 (PST) Received: from kuber.nabble.com (kuber.nabble.com [216.139.236.158]) by cuda.sgi.com with ESMTP id nJ00jgujgPIC6EEU for ; Tue, 07 Dec 2010 09:30:23 -0800 (PST) Received: from isper.nabble.com ([192.168.236.156]) by kuber.nabble.com with esmtp (Exim 4.63) (envelope-from ) id 1PQ1Mt-0006nX-K7 for xfs@oss.sgi.com; Tue, 07 Dec 2010 09:30:23 -0800 Message-ID: <30398538.post@talk.nabble.com> Date: Tue, 7 Dec 2010 09:30:23 -0800 (PST) From: blacknred To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: possible xfs corruption Subject: Re: possible xfs corruption In-Reply-To: <20101207164227.152cef01@harpe.intellique.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Nabble-From: leo1783@hotmail.co.uk References: <30395558.post@talk.nabble.com> <20101207151039.25d45cb5@harpe.intellique.com> <30397173.post@talk.nabble.com> <20101207164227.152cef01@harpe.intellique.com> X-Barracuda-Connect: kuber.nabble.com[216.139.236.158] X-Barracuda-Start-Time: 1291743023 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48750 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean It's all xfs..... and didn't see any I/O errors as well...except that dmesg is flooded with similar traces to one i posted.... Emmanuel Florac wrote: >=20 > Le Tue, 7 Dec 2010 07:11:04 -0800 (PST) > blacknred =C3=A9crivait: >=20 >> Yes, It's a Smart Array in HP Proliant Server. >> No power failure, just upgraded the controller firmware and rebooted >> the server..... >>=20 >=20 > Hu oh, that stinks. Nothing in the firmware release notes? Do you have > any other filesystem on this array?=20 >=20 > First you could try to backup the filesystem metadata using >=20 > xfs_metadump -o -w /dev/DEVICE outfile.meta >=20 > It can be useful later in case things turn bad. > Does it output any errors? IO errors particularly ? >=20 > --=20 > ------------------------------------------------------------------------ > Emmanuel Florac | Direction technique > | Intellique > |=09 > | +33 1 78 94 84 02 > ------------------------------------------------------------------------ >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs >=20 >=20 --=20 View this message in context: http://old.nabble.com/possible-xfs-corruption= -tp30395558p30398538.html Sent from the Xfs - General mailing list archive at Nabble.com. From eflorac@intellique.com Tue Dec 7 11:58:54 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB7Hwsbe194335 for ; Tue, 7 Dec 2010 11:58:54 -0600 X-ASG-Debug-ID: 1291744834-1d3501220000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 46F841CF6C6 for ; Tue, 7 Dec 2010 10:00:35 -0800 (PST) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id BizM1J0JydViSYtp for ; Tue, 07 Dec 2010 10:00:35 -0800 (PST) Received: from harpe.intellique.com (unknown [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id EB0BC4C81A4; Tue, 7 Dec 2010 19:00:30 +0100 (CET) Date: Tue, 7 Dec 2010 19:00:38 +0100 From: Emmanuel Florac To: blacknred Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: kernel panic-xfs errors Subject: Re: kernel panic-xfs errors Message-ID: <20101207190038.61e9dbb7@harpe.intellique.com> In-Reply-To: <30398448.post@talk.nabble.com> References: <30397503.post@talk.nabble.com> <20101207165917.0c96dd95@harpe.intellique.com> <30398448.post@talk.nabble.com> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.16.6; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1291744838 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.82 X-Barracuda-Spam-Status: No, SCORE=-1.82 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA620b, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48752 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.20 BSF_SC0_SA620b Custom Rule SA620b X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Tue, 7 Dec 2010 09:20:17 -0800 (PST) blacknred =E9crivait: > [] do_cciss_request+0x397/0x3a3 [cciss] > looks like the controller was wedged there? >=20 Yes, apparently your controller wrote garbage at the beginning of the filesystem... you have lots of trouble with these controllers, has anything special happened? that's weird. You should try using a newer xfs_repair (> 3.x), for instance by booting from an Ubuntu 10.10 live CD, and see if it fares any better from there. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From stan@hardwarefreak.com Tue Dec 7 12:14:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB7IE72F196704 for ; Tue, 7 Dec 2010 12:14:07 -0600 X-ASG-Debug-ID: 1291745754-1d3501c30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 183E61CFE4E for ; Tue, 7 Dec 2010 10:15:54 -0800 (PST) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id P6ctnKQk9F0NOil0 for ; Tue, 07 Dec 2010 10:15:54 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 494246C14E for ; Tue, 7 Dec 2010 12:15:54 -0600 (CST) Message-ID: <4CFE79DA.9080400@hardwarefreak.com> Date: Tue, 07 Dec 2010 12:15:54 -0600 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2.12) Gecko/20101027 Thunderbird/3.1.6 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: possible xfs corruption Subject: Re: possible xfs corruption References: <30395558.post@talk.nabble.com> <20101207151039.25d45cb5@harpe.intellique.com> <30397173.post@talk.nabble.com> <20101207164227.152cef01@harpe.intellique.com> <30398538.post@talk.nabble.com> In-Reply-To: <30398538.post@talk.nabble.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1291745755 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0451 1.0000 -1.7306 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.13 X-Barracuda-Spam-Status: No, SCORE=-1.13 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48752 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean blacknred put forth on 12/7/2010 11:30 AM: > > It's all xfs..... and didn't see any I/O errors as well...except that dmesg > is flooded with similar traces to one i posted.... Out of the blue, one OP, with two Proliant servers having storage problems, within hours of one another, the same day? Long odds, that. Did you walk a mile, flat footed, on deep shag carpet, while wearing a wool sweater, in a room with zero humidity, then walk into the DC and touch each of these servers, or something? ;) -- Stan From stan@hardwarefreak.com Tue Dec 7 12:17:02 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB7IH1av197241 for ; Tue, 7 Dec 2010 12:17:02 -0600 X-ASG-Debug-ID: 1291745929-3cde03410000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B713C1CA0A0D for ; Tue, 7 Dec 2010 10:18:49 -0800 (PST) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id PFSDrdEeJ9KqC9MP for ; Tue, 07 Dec 2010 10:18:49 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 27A686C14E for ; Tue, 7 Dec 2010 12:18:49 -0600 (CST) Message-ID: <4CFE7A89.2010307@hardwarefreak.com> Date: Tue, 07 Dec 2010 12:18:49 -0600 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2.12) Gecko/20101027 Thunderbird/3.1.6 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: kernel panic-xfs errors Subject: Re: kernel panic-xfs errors References: <30397503.post@talk.nabble.com> <20101207165917.0c96dd95@harpe.intellique.com> <30398448.post@talk.nabble.com> <20101207190038.61e9dbb7@harpe.intellique.com> In-Reply-To: <20101207190038.61e9dbb7@harpe.intellique.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1291745929 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.22 X-Barracuda-Spam-Status: No, SCORE=-1.22 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA620b, BSF_SC5_MJ1963, MAILTO_TO_SPAM_ADDR, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48752 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 0.20 BSF_SC0_SA620b Custom Rule SA620b X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Emmanuel Florac put forth on 12/7/2010 12:00 PM: > Le Tue, 7 Dec 2010 09:20:17 -0800 (PST) > blacknred écrivait: > >> [] do_cciss_request+0x397/0x3a3 [cciss] >> looks like the controller was wedged there? >> > > Yes, apparently your controller wrote garbage at the beginning of the > filesystem... you have lots of trouble with these controllers, has > anything special happened? that's weird. > > You should try using a newer xfs_repair (> 3.x), for instance by booting > from an Ubuntu 10.10 live CD, and see if it fares any better from there. The answer for the one server is simple: back out the firmware--flash it with the previously installed version. BTW, what need prompted the new flash in the first place? I _never_ flash controller firmware unless absolutely necessary. You've demonstrated today why I practice that faith. -- Stan From michael.monnerie@is.it-management.at Tue Dec 7 13:31:12 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB7JVBnR207746 for ; Tue, 7 Dec 2010 13:31:12 -0600 X-ASG-Debug-ID: 1291750376-332701380000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E26A4160F3F5 for ; Tue, 7 Dec 2010 11:32:56 -0800 (PST) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id tpIThEkXFI12uJuA for ; Tue, 07 Dec 2010 11:32:56 -0800 (PST) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 480EA144; Tue, 7 Dec 2010 20:32:55 +0100 (CET) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 6E9B6401C3E; Tue, 7 Dec 2010 20:32:54 +0100 (CET) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: possible xfs corruption Subject: Re: possible xfs corruption Date: Tue, 7 Dec 2010 20:32:53 +0100 User-Agent: KMail/1.13.5 (Linux/2.6.34.7-0.5-desktop; KDE/4.4.4; x86_64; ; ) Cc: blacknred References: <30395558.post@talk.nabble.com> <20101207151039.25d45cb5@harpe.intellique.com> <30397173.post@talk.nabble.com> In-Reply-To: <30397173.post@talk.nabble.com> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart7703918.QEWK9RTnrp"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201012072032.54069@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1291750377 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48757 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart7703918.QEWK9RTnrp Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable On Dienstag, 7. Dezember 2010 blacknred wrote: > Yes, It's a Smart Array in HP Proliant Server. > No power failure, just upgraded the controller firmware and rebooted > the server..... What Server, controller, and from which firmware version did you go to=20 which one? =2D-=20 mit freundlichen Gr=C3=BCssen, Michael Monnerie, Ing. BSc it-management Internet Services: Prot=C3=A9ger http://proteger.at [gesprochen: Prot-e-schee] Tel: +43 660 / 415 6531 // ****** Radiointerview zum Thema Spam ****** // http://www.it-podcast.at/archiv.html#podcast-100716 //=20 // Haus zu verkaufen: http://zmi.at/langegg/ --nextPart7703918.QEWK9RTnrp Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.15 (GNU/Linux) iEYEABECAAYFAkz+i+YACgkQzhSR9xwSCbTfOwCcDMY9VzesWwignv1DVKO1O42b VTYAoOjO0jRWFnJEjmtMCg2QFeL8bWDs =uAsw -----END PGP SIGNATURE----- --nextPart7703918.QEWK9RTnrp-- From eflorac@intellique.com Tue Dec 7 15:50:49 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB7Lom7M228447 for ; Tue, 7 Dec 2010 15:50:49 -0600 X-ASG-Debug-ID: 1291758752-1e9e01410000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7BA121426BA0 for ; Tue, 7 Dec 2010 13:52:33 -0800 (PST) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id us05kPch6PutdLK5 for ; Tue, 07 Dec 2010 13:52:33 -0800 (PST) Received: from galadriel.home (unknown [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP id 88E9EA62AC; Tue, 7 Dec 2010 22:52:28 +0100 (CET) Date: Tue, 7 Dec 2010 22:52:26 +0100 From: Emmanuel Florac To: Stan Hoeppner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: kernel panic-xfs errors Subject: Re: kernel panic-xfs errors Message-ID: <20101207225226.55be2b4d@galadriel.home> In-Reply-To: <4CFE7A89.2010307@hardwarefreak.com> References: <30397503.post@talk.nabble.com> <20101207165917.0c96dd95@harpe.intellique.com> <30398448.post@talk.nabble.com> <20101207190038.61e9dbb7@harpe.intellique.com> <4CFE7A89.2010307@hardwarefreak.com> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.20.1; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1291758756 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48767 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Tue, 07 Dec 2010 12:18:49 -0600 vous =E9criviez: > The answer for the one server is simple: back out the firmware--flash > it with the previously installed version. >=20 > BTW, what need prompted the new flash in the first place? I _never_ > flash controller firmware unless absolutely necessary. You've > demonstrated today why I practice that faith. I've experienced myself some very convincing reasons, for instance a RAID array with a performance varying by 1000% with a new firmware. However the kernel panic occured on another that apparently wasn't firmware-flashed. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From SRS0+8zW4+10+fromorbit.com=david@internode.on.net Tue Dec 7 16:08:27 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB7M8QUg231574 for ; Tue, 7 Dec 2010 16:08:26 -0600 X-ASG-Debug-ID: 1291759812-270801d90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5CDB214260FE for ; Tue, 7 Dec 2010 14:10:13 -0800 (PST) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id iW0yk5sNTwfz01iR for ; Tue, 07 Dec 2010 14:10:13 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49149054-1927428 for multiple; Wed, 08 Dec 2010 08:40:11 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PQ5je-0007dr-0N; Wed, 08 Dec 2010 09:10:10 +1100 Date: Wed, 8 Dec 2010 09:10:09 +1100 From: Dave Chinner To: blacknred Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: possible xfs corruption Subject: Re: possible xfs corruption Message-ID: <20101207221009.GA29333@dastard> References: <30395558.post@talk.nabble.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <30395558.post@talk.nabble.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1291759814 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0058 1.0000 -1.9830 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.48 X-Barracuda-Spam-Status: No, SCORE=-1.48 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48769 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 07, 2010 at 03:49:49AM -0800, blacknred wrote: > > Hi... > > I'm stuck with a storage issue on reboot. Initially doubted the storage, but > dmesg throws these errors. Now wondering whether this is a fs issue? Any > thoughts as to whats going on here? > > > XFS: failed to locate log tail > XFS: log mount/recovery failed: error 117 > XFS: log mount failed > XFS mounting filesystem cciss/c0d0 > Filesystem "cciss/c0d0": XFS internal error xlog_clear_stale_blocks(2) at > line 1237 of file Which indicates that the head and/or the tail of the log are not valid. Can you provide the output of: # xfs_logprint -d /dev/cciss/c0d0 So we can see what the head/tail values are in the log? > /home/buildsvn/rpmbuild/BUILD/xfs-kmod-0.4/_kmod_build_PAE/xfs_log_recover.c. CentOS kernel? How old? Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+8zW4+10+fromorbit.com=david@internode.on.net Tue Dec 7 16:12:59 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB7MCxTa232191 for ; Tue, 7 Dec 2010 16:12:59 -0600 X-ASG-Debug-ID: 1291760085-2c1302c20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 479BA1CA2F15 for ; Tue, 7 Dec 2010 14:14:46 -0800 (PST) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id ZLHrCStwSBJbsx1F for ; Tue, 07 Dec 2010 14:14:46 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49149753-1927428 for multiple; Wed, 08 Dec 2010 08:44:45 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PQ5o3-0007eO-MW; Wed, 08 Dec 2010 09:14:43 +1100 Date: Wed, 8 Dec 2010 09:14:43 +1100 From: Dave Chinner To: Tharindu Rukshan Bamunuarachchi Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_count_page_state inside kswapd Subject: Re: xfs_count_page_state inside kswapd Message-ID: <20101207221443.GB29333@dastard> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1291760087 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0208 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48768 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 07, 2010 at 06:26:52PM +0530, Tharindu Rukshan Bamunuarachchi wrote: > Dear All, > > We got following oops in one of our SLES 11 server. This occurred inside > swapd and we running our server swap turned off.. > > Could this be memory corruption or possible old bug in code ? No idea - the SLES11 kernel is lots of non-standard stuff in it compared to mainline (e.g. the XFS code has DMAPI support) and you are running a kernel with Novell supported kernel modules loaded (all the IB stuff). Your best bet is to contact your SLES support representative to see if they know of such a problem... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+8zW4+10+fromorbit.com=david@internode.on.net Tue Dec 7 16:24:16 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB7MOFv7234234 for ; Tue, 7 Dec 2010 16:24:15 -0600 X-ASG-Debug-ID: 1291760761-5aff00670000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0DBC914262B4 for ; Tue, 7 Dec 2010 14:26:01 -0800 (PST) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id M7tIUP3CZbkVnxYi for ; Tue, 07 Dec 2010 14:26:01 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49151090-1927428 for multiple; Wed, 08 Dec 2010 08:56:00 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PQ5yw-0007fb-6G; Wed, 08 Dec 2010 09:25:58 +1100 Date: Wed, 8 Dec 2010 09:25:58 +1100 From: Dave Chinner To: blacknred Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: kernel panic-xfs errors Subject: Re: kernel panic-xfs errors Message-ID: <20101207222558.GC29333@dastard> References: <30397503.post@talk.nabble.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <30397503.post@talk.nabble.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1291760763 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48769 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 07, 2010 at 07:42:56AM -0800, blacknred wrote: > > Hi..... > > I get a kernel panic on my HP Proliant Server. > > here's trace: > > BUG: unable to handle kernel NULL pointer dereference at virtual address > 00000052 > printing eip: > *pde = 2c731001 > Oops: 0000 [#1] > SMP > > CPU: 2 > EIP: 0060:[] Tainted: GF VLI ^^^^^^^^^^^ You've done a forced module load. No guarantee your kernel is in any sane shape if you've done that.... > EFLAGS: 00010272 (2.6.33.3-85.fc13.x86_64 #1) > EIP is at do_page_fault+0x245/0x617 > eax: ec5ee000 ebx: 00000000 ecx: eb5de084 edx: 0000000e > esi: 00013103 edi: ec5de0b3 ebp: 00000023 esp: ec5de024 > ds: 008b es: 008b ss: 0078 > Process bm (pid: 3210, ti=ec622000 task=ec5e3450 task.ti=ec6ee000) > Stack: 00000000 00000000 ecd5e0a4 00000024 00000093 f7370000 00000007 > 00000000 > ed6ef0a4 c0639569 00000000 0000000f 0000000b 00000000 00000000 > 00000000 > 00015106 c0629b9d 00000014 c0305b83 00000000 ec3d40f7 0000000e > 00013006 > Call Trace: > [] do_page_fault+0x0/0x607 > [] error_code+0x49/0x50 > [] do_page_fault+0x204/00x607 > [] elv_next_request+0x137/0x234 > [] do_cciss_request+0x397/0x3a3 [cciss] > [] do_page_fault+0x0/0x607 > [] error_code+0x49/0x40 > [] do_page_fault+0x215/0x607 > [] deadline_set_request+0x26/0x57 > [] do_page_fault+0x0/0x607 > [] error_code+0x39/0x40 > [] __down+0x2b/0xbb > [] default_wake_function+0x0/0xc > [] __down_failed+0x7/0xc > [] .text.lock.xfs_buf+0x17/0x5f [xfs] > [] xfs_buf_read_flags+0x48/0x76 [xfs] > [] xfs_trans_read_buf+0x1bb/0x2c0 [xfs] > [] xfs_btree_read_bufl+0x96/0xb3 [xfs] > [] xfs_bmbt_lookup+0x135/0x478 [xfs] > [] xfs_bmap_add_extent+0xd2b/0x1e30 [xfs] > [] xfs_alloc_update+0x3a/0xbc [xfs] > [] xfs_alloc_fixup_trees+0x217/0x29a [xfs] > [] xfs_trans_log_buf+0x49/0x6c [xfs] > [] xfs_alloc_search_busy+0x20/0xae [xfs] > [] xfs_iext_bno_to_ext+0xd8/0x191 [xfs] > [] kmem_zone_zalloc+0x1d/0x41 [xfs] > [] xfs_bmapi+0x15fe/0x2016 [xfs] > [] xfs_iext_bno_to_ext+0x48/0x191 [xfs] > [] xfs_bmap_search_multi_extents+0x8a/0xc5 [xfs] > [] xfs_iomap_write_allocate+0x29c/0x469 [xfs] > [] lock_timer_base+0x15/0x2f > [] del_timer+0x41/0x47 > [] xfs_iomap+0x409/0x71d [xfs] > [] xfs_map_blocks+0x29/0x52 [xfs] > [] xfs_page_state_convert+0x37b/0xd2e [xfs] > [] xfs_bmap_add_extent+0x1dcf/0x1e30 [xfs] > [] xfs_bmap_search_multi_extents+0x8a/0xc5 [xfs] > [] xfs_bmapi+0x272/0x2017 [xfs] > [] xfs_bmapi+0x1853/0x2017 [xfs] > [] find_get_pages_tag+0x40/0x75 > [] xfs_vm_writepage+0x8f/0xd2 [xfs] > [] mpage_writepages+0x1b7/0x310 > [] xfs_vm_writepage+0x0/0xc4 [xfs] > [] do_writepages+0x20/0x42 > [] __writeback_single_inode+0x180/0x2af > [] write_inode_now+0x67/0xa7 > [] file_fsync+0xf/0x6c > [] moddw_ioctl+0x420/0x679 [mod_dw] > [] __cond_resched+0x16/0x54 > [] do_ioctl+0x47/0x5d > [] vfs_ioctl+0x47b/0x4d3 > [] sys_ioctl+0x48/0x4f > [] sysenter_past_esp+0x46/0x79 Strange failure. Hmmm - i386 arch and fedora - are you running with 4k stacks? If so, maybe it blew the stack... > > dmesg shows: > XFS: bad magic number > XFS: SB validate failed > > I rebooted the server, now xfs_repair comes clean. > > But the server has hung again after an hour. No panic this time, checked > dmesg output and it again > shows same > XFS: bad magic number > XFS: SB validate failed > messages.. Any thoughts?? What does this give you before and after the failure: # dd if= bs=512 count=1 | od -c Cheers, Dave. -- Dave Chinner david@fromorbit.com From lists@nabble.com Wed Dec 8 03:37:24 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB89bOC8091327 for ; Wed, 8 Dec 2010 03:37:24 -0600 X-ASG-Debug-ID: 1291801151-074e01500000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from kuber.nabble.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D3E241D34E0 for ; Wed, 8 Dec 2010 01:39:11 -0800 (PST) Received: from kuber.nabble.com (kuber.nabble.com [216.139.236.158]) by cuda.sgi.com with ESMTP id AaOlAr3OyY1orAEz for ; Wed, 08 Dec 2010 01:39:11 -0800 (PST) Received: from isper.nabble.com ([192.168.236.156]) by kuber.nabble.com with esmtp (Exim 4.63) (envelope-from ) id 1PQGUQ-0002dP-PC for xfs@oss.sgi.com; Wed, 08 Dec 2010 01:39:10 -0800 Message-ID: <30403823.post@talk.nabble.com> Date: Wed, 8 Dec 2010 01:39:10 -0800 (PST) From: blacknred To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: kernel panic-xfs errors Subject: Re: kernel panic-xfs errors In-Reply-To: <20101207222558.GC29333@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Nabble-From: leo1783@hotmail.co.uk References: <30397503.post@talk.nabble.com> <20101207222558.GC29333@dastard> X-Barracuda-Connect: kuber.nabble.com[216.139.236.158] X-Barracuda-Start-Time: 1291801151 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48814 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean >You've done a forced module load. No guarantee your kernel is in any >sane shape if you've done that.... Agree, but I'm reasonably convinced that module isn't the issue, because it works fine with my other servers...... >Strange failure. Hmmm - i386 arch and fedora - are you running with 4k stacks? If so, maybe it blew the stack... i386 arch, rhel 5.0 ># dd if= bs=512 count=1 | od -c This is what i get now, but now server's been rebooted and running OK, what should i be expecting or rather what are we looking for in this output at point of failure? 1+0 records in 1+0 records out 0000000 X F S B \0 \0 020 \0 \0 \0 \0 \0 025 324 304 \0 512 bytes (512 B) copied0000020 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 0000040 330 k 004 8 A 365 F 023 221 035 215 E 277 + v 256 0000060 \0 \0 \0 \0 020 \0 \0 @ \0 \0 \0 \0 \0 \0 \0 200 , 3.8e-05 seconds, 13.5 MB/s 0000100 \0 \0 \0 \0 \0 \0 \0 201 \0 \0 \0 \0 \0 \0 \0 202 0000120 \0 \0 \0 001 \0 256 246 @ \0 \0 \0 \0 \0 \0 \0 0000140 \0 \0 200 \0 261 204 002 \0 \b \0 \0 002 \0 \0 \0 \0 0000160 \0 \0 \0 \0 \0 \0 \0 \0 \b \t \v 001 030 \0 \0 \0 0000200 \0 \0 \0 \0 \0 023 240 @ \0 \0 \0 \0 \0 004 264 344 0000220 \0 \0 \0 \0 \b 346 311 ( \0 \0 \0 \0 \0 \0 \0 \0 0000240 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 0000260 \0 \0 \0 \0 \0 \0 \0 002 \0 \0 \0 @ \0 \0 001 \0 0000300 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \b \0 \0 \0 \b 0000320 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 * 0001000 >why did I flash the controller I was on 5.22 fw version which has a known 'lockup' issue which is fixed in 7.x ver. This is a critical fix. So initially i was thinking the lockup caused the xfs errors in dmesg on the panicked server. But now its hung with the 7.x fw as well and same error shows in dmesg which makes me worried about the fs more.... Dave Chinner wrote: > > On Tue, Dec 07, 2010 at 07:42:56AM -0800, blacknred wrote: >> >> Hi..... >> >> I get a kernel panic on my HP Proliant Server. >> >> here's trace: >> >> BUG: unable to handle kernel NULL pointer dereference at virtual address >> 00000052 >> printing eip: >> *pde = 2c731001 >> Oops: 0000 [#1] >> SMP >> >> CPU: 2 >> EIP: 0060:[] Tainted: GF VLI > ^^^^^^^^^^^ > > You've done a forced module load. No guarantee your kernel is in any > sane shape if you've done that.... > >> EFLAGS: 00010272 (2.6.33.3-85.fc13.x86_64 #1) >> EIP is at do_page_fault+0x245/0x617 >> eax: ec5ee000 ebx: 00000000 ecx: eb5de084 edx: 0000000e >> esi: 00013103 edi: ec5de0b3 ebp: 00000023 esp: ec5de024 >> ds: 008b es: 008b ss: 0078 >> Process bm (pid: 3210, ti=ec622000 task=ec5e3450 task.ti=ec6ee000) >> Stack: 00000000 00000000 ecd5e0a4 00000024 00000093 f7370000 00000007 >> 00000000 >> ed6ef0a4 c0639569 00000000 0000000f 0000000b 00000000 00000000 >> 00000000 >> 00015106 c0629b9d 00000014 c0305b83 00000000 ec3d40f7 0000000e >> 00013006 >> Call Trace: >> [] do_page_fault+0x0/0x607 >> [] error_code+0x49/0x50 >> [] do_page_fault+0x204/00x607 >> [] elv_next_request+0x137/0x234 >> [] do_cciss_request+0x397/0x3a3 [cciss] >> [] do_page_fault+0x0/0x607 >> [] error_code+0x49/0x40 >> [] do_page_fault+0x215/0x607 >> [] deadline_set_request+0x26/0x57 >> [] do_page_fault+0x0/0x607 >> [] error_code+0x39/0x40 >> [] __down+0x2b/0xbb >> [] default_wake_function+0x0/0xc >> [] __down_failed+0x7/0xc >> [] .text.lock.xfs_buf+0x17/0x5f [xfs] >> [] xfs_buf_read_flags+0x48/0x76 [xfs] >> [] xfs_trans_read_buf+0x1bb/0x2c0 [xfs] >> [] xfs_btree_read_bufl+0x96/0xb3 [xfs] >> [] xfs_bmbt_lookup+0x135/0x478 [xfs] >> [] xfs_bmap_add_extent+0xd2b/0x1e30 [xfs] >> [] xfs_alloc_update+0x3a/0xbc [xfs] >> [] xfs_alloc_fixup_trees+0x217/0x29a [xfs] >> [] xfs_trans_log_buf+0x49/0x6c [xfs] >> [] xfs_alloc_search_busy+0x20/0xae [xfs] >> [] xfs_iext_bno_to_ext+0xd8/0x191 [xfs] >> [] kmem_zone_zalloc+0x1d/0x41 [xfs] >> [] xfs_bmapi+0x15fe/0x2016 [xfs] >> [] xfs_iext_bno_to_ext+0x48/0x191 [xfs] >> [] xfs_bmap_search_multi_extents+0x8a/0xc5 [xfs] >> [] xfs_iomap_write_allocate+0x29c/0x469 [xfs] >> [] lock_timer_base+0x15/0x2f >> [] del_timer+0x41/0x47 >> [] xfs_iomap+0x409/0x71d [xfs] >> [] xfs_map_blocks+0x29/0x52 [xfs] >> [] xfs_page_state_convert+0x37b/0xd2e [xfs] >> [] xfs_bmap_add_extent+0x1dcf/0x1e30 [xfs] >> [] xfs_bmap_search_multi_extents+0x8a/0xc5 [xfs] >> [] xfs_bmapi+0x272/0x2017 [xfs] >> [] xfs_bmapi+0x1853/0x2017 [xfs] >> [] find_get_pages_tag+0x40/0x75 >> [] xfs_vm_writepage+0x8f/0xd2 [xfs] >> [] mpage_writepages+0x1b7/0x310 >> [] xfs_vm_writepage+0x0/0xc4 [xfs] >> [] do_writepages+0x20/0x42 >> [] __writeback_single_inode+0x180/0x2af >> [] write_inode_now+0x67/0xa7 >> [] file_fsync+0xf/0x6c >> [] moddw_ioctl+0x420/0x679 [mod_dw] >> [] __cond_resched+0x16/0x54 >> [] do_ioctl+0x47/0x5d >> [] vfs_ioctl+0x47b/0x4d3 >> [] sys_ioctl+0x48/0x4f >> [] sysenter_past_esp+0x46/0x79 > > Strange failure. Hmmm - i386 arch and fedora - are you running with > 4k stacks? If so, maybe it blew the stack... > >> >> dmesg shows: >> XFS: bad magic number >> XFS: SB validate failed >> >> I rebooted the server, now xfs_repair comes clean. >> >> But the server has hung again after an hour. No panic this time, checked >> dmesg output and it again >> shows same >> XFS: bad magic number >> XFS: SB validate failed >> messages.. Any thoughts?? > > What does this give you before and after the failure: > > # dd if= bs=512 count=1 | od -c > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > > -- View this message in context: http://old.nabble.com/kernel-panic-xfs-errors-tp30397503p30403823.html Sent from the Xfs - General mailing list archive at Nabble.com. From eflorac@intellique.com Wed Dec 8 04:55:40 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB8Atei9106466 for ; Wed, 8 Dec 2010 04:55:40 -0600 X-ASG-Debug-ID: 1291805845-1de2006e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 42EFC1CA59C7 for ; Wed, 8 Dec 2010 02:57:26 -0800 (PST) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id fI1CNF4dHqnLMPXY for ; Wed, 08 Dec 2010 02:57:26 -0800 (PST) Received: from harpe.intellique.com (unknown [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id 723284C81A3; Wed, 8 Dec 2010 11:57:21 +0100 (CET) Date: Wed, 8 Dec 2010 11:57:24 +0100 From: Emmanuel Florac To: blacknred Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: kernel panic-xfs errors Subject: Re: kernel panic-xfs errors Message-ID: <20101208115724.0b2c210a@harpe.intellique.com> In-Reply-To: <30403823.post@talk.nabble.com> References: <30397503.post@talk.nabble.com> <20101207222558.GC29333@dastard> <30403823.post@talk.nabble.com> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.16.6; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1291805848 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.82 X-Barracuda-Spam-Status: No, SCORE=-1.82 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA620b, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48820 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.20 BSF_SC0_SA620b Custom Rule SA620b X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Wed, 8 Dec 2010 01:39:10 -0800 (PST) blacknred =E9crivait: > But now its hung with the 7.x fw as well and same error shows in > dmesg which makes me worried about the fs more.... >=20 Maybe there's a remaining hidden corruption. Could you try with latest xfs_repair ? --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From lists@nabble.com Wed Dec 8 07:59:40 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB8DxeTh125525 for ; Wed, 8 Dec 2010 07:59:40 -0600 X-ASG-Debug-ID: 1291816887-2c8401580000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from kuber.nabble.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 21176152A356 for ; Wed, 8 Dec 2010 06:01:27 -0800 (PST) Received: from kuber.nabble.com (kuber.nabble.com [216.139.236.158]) by cuda.sgi.com with ESMTP id 3GOiO1YTHcoNa4Ay for ; Wed, 08 Dec 2010 06:01:27 -0800 (PST) Received: from isper.nabble.com ([192.168.236.156]) by kuber.nabble.com with esmtp (Exim 4.63) (envelope-from ) id 1PQKaE-0004m6-IQ for xfs@oss.sgi.com; Wed, 08 Dec 2010 06:01:26 -0800 Message-ID: <30405587.post@talk.nabble.com> Date: Wed, 8 Dec 2010 06:01:26 -0800 (PST) From: blacknred To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: kernel panic-xfs errors Subject: Re: kernel panic-xfs errors In-Reply-To: <20101208115724.0b2c210a@harpe.intellique.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Nabble-From: leo1783@hotmail.co.uk References: <30397503.post@talk.nabble.com> <20101207222558.GC29333@dastard> <30403823.post@talk.nabble.com> <20101208115724.0b2c210a@harpe.intellique.com> X-Barracuda-Connect: kuber.nabble.com[216.139.236.158] X-Barracuda-Start-Time: 1291816888 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48831 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean >Yes, apparently your controller wrote garbage at the beginning of the >filesystem... on that, just wondering if you could provide more info.....=20 As in -is controller writing data in a different location which is not intended to be written to? Or is it case of writing incorrect data causing corruption?.... or could it be an application sw thats gone rogue? but that's a long shot, isn't it.... Emmanuel Florac wrote: >=20 > Le Wed, 8 Dec 2010 01:39:10 -0800 (PST) > blacknred =C3=A9crivait: >=20 >> But now its hung with the 7.x fw as well and same error shows in >> dmesg which makes me worried about the fs more.... >>=20 >=20 > Maybe there's a remaining hidden corruption. Could you try with latest > xfs_repair ? >=20 > --=20 > ------------------------------------------------------------------------ > Emmanuel Florac | Direction technique > | Intellique > |=09 > | +33 1 78 94 84 02 > ------------------------------------------------------------------------ >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs >=20 >=20 --=20 View this message in context: http://old.nabble.com/kernel-panic-xfs-errors= -tp30397503p30405587.html Sent from the Xfs - General mailing list archive at Nabble.com. From eflorac@intellique.com Wed Dec 8 08:32:44 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB8EWhNi127062 for ; Wed, 8 Dec 2010 08:32:44 -0600 X-ASG-Debug-ID: 1291818869-495b034b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3B39F1D4211 for ; Wed, 8 Dec 2010 06:34:30 -0800 (PST) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id 4iRW93YAWRhjG0GC for ; Wed, 08 Dec 2010 06:34:30 -0800 (PST) Received: from harpe.intellique.com (unknown [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id 652654C8123; Wed, 8 Dec 2010 15:34:25 +0100 (CET) Date: Wed, 8 Dec 2010 15:34:30 +0100 From: Emmanuel Florac To: blacknred Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: kernel panic-xfs errors Subject: Re: kernel panic-xfs errors Message-ID: <20101208153430.3f5831b3@harpe.intellique.com> In-Reply-To: <30405587.post@talk.nabble.com> References: <30397503.post@talk.nabble.com> <20101207222558.GC29333@dastard> <30403823.post@talk.nabble.com> <20101208115724.0b2c210a@harpe.intellique.com> <30405587.post@talk.nabble.com> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.16.6; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1291818872 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.82 X-Barracuda-Spam-Status: No, SCORE=-1.82 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA620b, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48834 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.20 BSF_SC0_SA620b Custom Rule SA620b X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Wed, 8 Dec 2010 06:01:26 -0800 (PST) blacknred =E9crivait: > As in -is controller writing data in a different location which is not > intended to be written to? > Or is it case of writing incorrect data causing corruption?.... >=20 This: XFS: bad magic number XFS: SB validate failed=20 Seems to indicate that the beginning of the filesystem was somehow corrupted. Just like the log was apparently truncated on the other server. That's why I though that you had a power failure and that an incomplete write operation was the culprit. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From jensen_lorn@ns2.pagdigit.com.ar Wed Dec 8 10:15:58 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.0 required=5.0 tests=BAYES_99 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB8GFwvq131771 for ; Wed, 8 Dec 2010 10:15:58 -0600 X-ASG-Debug-ID: 1291825064-3b7b01f00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from paginadigital.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BDF6B1CA6D58 for ; Wed, 8 Dec 2010 08:17:45 -0800 (PST) Received: from paginadigital.net (ns2.pagdigit.com.ar [190.111.202.203]) by cuda.sgi.com with ESMTP id 0NRnbe0sCUYDwoL6 for ; Wed, 08 Dec 2010 08:17:45 -0800 (PST) Received: from pummel ([212.95.43.194]) by paginadigital.net (paginadigital.net) (MDaemon.PRO.v7.2.0.R) with ESMTP id md50012828377.msg for ; Wed, 08 Dec 2010 13:28:31 -0300 To: 20hbreslin@whag.com, xfs@oss.sgi.com, info@queensgatehypnotherapy.co.uk, sanjuan.escherick@state.ut.us, info@hotel-marzia.it X-ASG-Orig-Subj: [rft 86] : business list Subject: [rft 86] : business list Reply-To: jensen_lorn@ns2.pagdigit.com.ar From: "lindholm" X-Lookup-Warning: MAIL lookup on jensen_lorn@ns2.pagdigit.com.ar does not match 212.95.43.194 X-MDRemoteIP: 212.95.43.194 X-Return-Path: jensen_lorn@ns2.pagdigit.com.ar X-MDaemon-Deliver-To: xfs@oss.sgi.com X-Barracuda-Connect: ns2.pagdigit.com.ar[190.111.202.203] X-Barracuda-Start-Time: 1291825065 Message-Id: <20101208161745.BDF6B1CA6D58@cuda.sgi.com> Date: Wed, 8 Dec 2010 08:17:45 -0800 (PST) X-Barracuda-Bayes: INNOCENT GLOBAL 0.5173 1.0000 0.7500 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.89 X-Barracuda-Spam-Status: No, SCORE=0.89 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48840 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 BSF_SC0_MISSING_MID BODY: Custom Rule BSF_SC0_MISSING_MID X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean We have the following high-quality lists: ( HEALTHCARE ) - Doctors (34 different specialties) - Chiropractors - Alternative Medicine - Dentists - Dentists with Specialties - Veterinarians - Hospitals - National Health Service Corp Clinics - Nursing Homes - Pharmaceutical Companies - Physical Therapists - Oncology Doctors - US Surgery Centers - Massage Therapists - Acupuncturists - Medical Equipment Suppliers - Mental Health Counselors - Visiting Nurses & RN's - Optometrists - Psychologists ( BUSINESS LISTS ) - Hotels - Real Estate Agents - American Business Email List - US New Business Database - Manufacturers Database - Financial Planners Database - Finance and Money Professionals Database - Insurance Agents - Canadian Businesses - United Kingdom Business Database - Media Outlet Contacts ( CONSUMER LISTS ) - American Consumer Database - Credit Inquiries Database - American Homeowners ( PROFESSIONALS LISTS ) - USA Lawyers Database - Police and Sheriff Services - Criminal Attorneys - 142,906 Email me here for counts and samples: masterlists@gmx.us If the above email bounces please call 1-206-338-9752 instead. ramove me from your list please send an email to getridofit@gmx.com From whitewolf573@gmail.com Wed Dec 8 13:30:43 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.3 required=5.0 tests=BAYES_40,FREEMAIL_FROM, HTML_MESSAGE,J_CHICKENPOX_36,J_CHICKENPOX_43,J_CHICKENPOX_54,T_DKIM_INVALID, T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB8JUh5c140869 for ; Wed, 8 Dec 2010 13:30:43 -0600 X-ASG-Debug-ID: 1291836749-4b7a03640000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-ey0-f179.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 341741431218 for ; Wed, 8 Dec 2010 11:32:29 -0800 (PST) Received: from mail-ey0-f179.google.com (mail-ey0-f179.google.com [209.85.215.179]) by cuda.sgi.com with ESMTP id hWfGWacONSYFAf1A for ; Wed, 08 Dec 2010 11:32:29 -0800 (PST) Received: by eyg24 with SMTP id 24so1137538eyg.38 for ; Wed, 08 Dec 2010 11:32:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:date:message-id :subject:from:to:content-type; bh=u1mzth+HJLjS74h3hLIto87PEZpTuswgkAMbwuCnYgA=; b=EqSdm8apt0W4/eade4Z4Mfsvlueefd4cbVnPBADcOW+Og2tmFnaPQ2dEEx5Ohh5Diu s92x/89qRvanrSU00dscfreSbefdCrZchO8lcTk17omKwPNChHcIbz1vkIRPsnyrOPlw J8GOmSCqKJaOeYagAnxop3Mi0jLhybDF+f9YU= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=qT2TiwH9N46XtBcC5+Kkj4z0Cipq3HYqLt4wkTecIGm9o0gfGpwhXPN02SSIHF050x 9NyGE/DRByXQwjhnkCMyhjX2JwJD6M659Ya9RdkZNa6t/H+yQQ5rRgmE3xnsRvAamziX T1WnKX8z2xdji9Gy3+cYQjCVe6RRAOP4EKmV4= MIME-Version: 1.0 Received: by 10.213.30.20 with SMTP id s20mr9975063ebc.16.1291836748617; Wed, 08 Dec 2010 11:32:28 -0800 (PST) Received: by 10.213.33.146 with HTTP; Wed, 8 Dec 2010 11:32:28 -0800 (PST) Date: Wed, 8 Dec 2010 20:32:28 +0100 Message-ID: X-ASG-Orig-Subj: xfs tuning for a 830 GB partition (mkfs.xfs options) Subject: xfs tuning for a 830 GB partition (mkfs.xfs options) From: Abel Coto To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=000e0cd1e32a82577f0496eb2e94 X-Barracuda-Connect: mail-ey0-f179.google.com[209.85.215.179] X-Barracuda-Start-Time: 1291836751 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.61 X-Barracuda-Spam-Status: No, SCORE=-1.61 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, SUBJECT_FUZZY_TION X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48853 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.41 SUBJECT_FUZZY_TION Attempt to obfuscate words in Subject: -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --000e0cd1e32a82577f0496eb2e94 Content-Type: text/plain; charset=ISO-8859-1 I want to create a 830 GB partition, to mount as /home in my Centos 5.4 workstation. Actually i have /home not mounted ,so i would have to create the new partition in the lvm,format it and use rsync to copy /home directory to it. for a 830 GB partition that i will use to save my data in general and also 3d / CG projects and renders once finished them what agcount value should be used. I have read that mkfs default option creates 1 allocation group each 4G , so i understand that for a 830 GB partition agcount should be 208. It is this correct ? so i would use for format the partition mkfs.xfs -l lazy-count=1,version=2,size=128m -i attr=2 -d agcount=208 -L VolumeName I have read that some people instead use a 8GB allocation size , and agcount Size partition / 8 GB (in my case 104) , but i don't know if that would be good , as would result in less allocation groups. i understand if agcount > 208 (for example 416 ) , the allocation size (2GB for agcount=416) would be less than 4 GB , to have in total 830 GB. I have read that too much allocation groups are bad , but i don't now if 416 are too much for a 830 GB partition (and shoukd use 208 to 300) or not. I will mount the partition with logbufs=8. (i use a 128m journal and logbufs=8 to improve a bit deleting performance). I will perhaps use noatime too ,but i have to see if my backup app, uses atime or not. I have another 1,5 TB HDD where i want to create a 350 GB xfs partition to save the 3d projects and render output when working with the 3d software i use (Maya 2011). My thoughts are to use /home to save both music , photography,isos,etc also of finished 3d / cg work and iso dvd / tutorials and video-tutorials ,and this 350 GB partition use it only for data and projects that i am still working with,and once finished copy to /home. for this partition , that will handle mostly big files (500 MB to 2-3 GB at least) what mkfs.xfs options should i use ? something like: mkfs.xfs -l lazy-count=1,version=2,size=128m -i attr=2 -d agcount=90 -L VolumeName (350/4 --> 88) I prefer to have a separate partition to save projects at least when i am working with them , although 3d modelling is not too much filesystem bounded , and then copy it to /home , as i think having a good backup strategy shoud not be a problem to have my music and data along with 3d work finished in the same partition (3d is for me a hobby,that i like a lot but a hobby) I will have to compile a custom kernel from kernel.org because my centos kernel is 2.6.18,and there is no higher one available, only compiling it, but this shouldn't be a problem. --000e0cd1e32a82577f0496eb2e94 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable I want to create a 830 GB partition, to mount as /home in my Centos 5.4 wor= kstation.

Actually i have /home not mounted ,so i would have to cre= ate the new partition in the lvm,format it and use rsync to copy /home dire= ctory to it.

for a 830 GB partition that i will use to save my data in general and a= lso 3d / CG projects and renders once finished them what agcount value shou= ld be used. I have read that mkfs default option creates 1 allocation group= each 4G , so i understand that for a 830 GB partition agcount should be 20= 8.

It is this correct ?

so i would use for format the partition
mkfs.xfs -l lazy-count=3D1,version=3D2,size=3D128m -i attr=3D2 -d agc= ount=3D208 -L VolumeName <dev>

I have read that some people in= stead use a 8GB allocation size , and agcount Size partition / 8 GB (in my = case 104) , but i don't know if that would be good , as would result in= less allocation groups.

i understand if agcount > 208=A0 (for example 416 ) , the allocation= size (2GB for agcount=3D416) would be less than 4 GB , to have in total 83= 0 GB.

I have read that too much allocation groups are bad , but i do= n't now if 416 are=A0 too much for a 830 GB partition (and shoukd use 2= 08 to 300) or not.

I will mount the partition with logbufs=3D8. (i use a 128m journal and = logbufs=3D8 to improve a bit deleting performance). I will perhaps use noat= ime too ,but i have to see if my backup app, uses atime or not.


I have another 1,5 TB HDD where i want to create a 350 GB xfs partition to = save the 3d projects and render output when working with the 3d software i = use (Maya 2011). My thoughts are to use /home to save both music , photogra= phy,isos,etc also of finished 3d / cg work and iso dvd / tutorials and vide= o-tutorials ,and this 350 GB partition use it only for data and projects th= at i am still working with,and once finished copy to /home.

for this partition , that will handle mostly big files (500 MB to 2-3 G= B at least) what mkfs.xfs options should i use ?

something like:
=
mkfs.xfs -l lazy-count=3D1,version=3D2,size=3D128m -i attr=3D2 -d agcou= nt=3D90 -L VolumeName <dev>=A0 (350/4 --> 88)

I prefer to have a separate partition to save projects at least when i = am working with them , although 3d modelling is not too much filesystem bou= nded , and then copy it to /home , as i think having a good backup strategy= shoud not be a problem to have my music and data along with 3d work finish= ed in the same partition (3d is for me a hobby,that i like a lot but a hobb= y)

I will have to compile a custom kernel from kernel.org because my centos kernel is 2.6.18,and there is no higher= one available, only compiling it, but this shouldn't be a problem.
--000e0cd1e32a82577f0496eb2e94-- From eparis@redhat.com Wed Dec 8 13:46:02 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=BAYES_00,J_CHICKENPOX_25, J_CHICKENPOX_26,J_CHICKENPOX_66,J_CHICKENPOX_73 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB8Jk1bD141667 for ; Wed, 8 Dec 2010 13:46:02 -0600 X-ASG-Debug-ID: 1291837669-1e1800ed0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A8AE81CA7B05; Wed, 8 Dec 2010 11:47:49 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id yfFhfqanUD4ZiYA6; Wed, 08 Dec 2010 11:47:49 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation 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.13.8/8.13.8) with ESMTP id oB8Jk1lX031193 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 8 Dec 2010 14:46:01 -0500 Received: from paris.rdu.redhat.com (paris.rdu.redhat.com [10.11.231.241]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id oB8Jjqe9004807; Wed, 8 Dec 2010 14:45:52 -0500 From: Eric Paris X-ASG-Orig-Subj: [PATCH] fs/vfs/security: pass last path component to LSM on inode creation Subject: [PATCH] fs/vfs/security: pass last path component to LSM on inode creation To: xfs-masters@oss.sgi.com, linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, cluster-devel@redhat.com, linux-mtd@lists.infradead.org, jfs-discussion@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, xfs@oss.sgi.com, linux-mm@kvack.org, linux-security-module@vger.kernel.org Cc: chris.mason@oracle.com, jack@suse.cz, akpm@linux-foundation.org, adilger.kernel@dilger.ca, tytso@mit.edu, swhiteho@redhat.com, dwmw2@infradead.org, shaggy@linux.vnet.ibm.com, mfasheh@suse.com, joel.becker@oracle.com, aelder@sgi.com, hughd@google.com, jmorris@namei.org, sds@tycho.nsa.gov, eparis@parisplace.org, hch@lst.de, dchinner@redhat.com, viro@zeniv.linux.org.uk, tao.ma@oracle.com, shemminger@vyatta.com, jeffm@suse.com, serue@us.ibm.com, paul.moore@hp.com, penguin-kernel@I-love.SAKURA.ne.jp, casey@schaufler-ca.com, kees.cook@canonical.com, dhowells@redhat.com Date: Wed, 08 Dec 2010 14:45:27 -0500 Message-ID: <20101208194527.13537.77202.stgit@paris.rdu.redhat.com> User-Agent: StGIT/0.14.3 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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: 1291837670 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean SELinux would like to implement a new labeling behavior of newly created inodes. We currently label new inodes based on the parent and the creating process. This new behavior would also take into account the name of the new object when deciding the new label. This is not the (supposed) full path, just the last component of the path. This is very useful because creating /etc/shadow is different than creating /etc/passwd but the kernel hooks are unable to differentiate these operations. We currently require that userspace realize it is doing some difficult operation like that and than userspace jumps through SELinux hoops to get things set up correctly. This patch does not implement new behavior, that is obviously contained in a seperate SELinux patch, but it does pass the needed name down to the correct LSM hook. If no such name exists it is fine to pass NULL. Signed-off-by: Eric Paris --- fs/btrfs/inode.c | 13 +++++++------ fs/btrfs/xattr.c | 6 ++++-- fs/btrfs/xattr.h | 3 ++- fs/ext2/ext2.h | 2 +- fs/ext2/ialloc.c | 5 +++-- fs/ext2/namei.c | 8 ++++---- fs/ext2/xattr.h | 6 ++++-- fs/ext2/xattr_security.c | 5 +++-- fs/ext3/ialloc.c | 5 +++-- fs/ext3/namei.c | 8 ++++---- fs/ext3/xattr.h | 4 ++-- fs/ext3/xattr_security.c | 5 +++-- fs/ext4/ialloc.c | 2 +- fs/ext4/xattr.h | 4 ++-- fs/ext4/xattr_security.c | 5 +++-- fs/gfs2/inode.c | 7 ++++--- fs/jffs2/dir.c | 9 ++++----- fs/jffs2/nodelist.h | 2 +- fs/jffs2/security.c | 5 +++-- fs/jffs2/write.c | 18 ++++++++++-------- fs/jffs2/xattr.h | 5 +++-- fs/jfs/jfs_xattr.h | 5 +++-- fs/jfs/namei.c | 8 ++++---- fs/jfs/xattr.c | 6 ++++-- fs/ocfs2/namei.c | 4 ++-- fs/ocfs2/refcounttree.c | 3 ++- fs/ocfs2/xattr.c | 10 ++++++---- fs/ocfs2/xattr.h | 4 +++- fs/reiserfs/namei.c | 9 +++++---- fs/reiserfs/xattr_security.c | 3 ++- fs/xfs/linux-2.6/xfs_iops.c | 9 +++++---- include/linux/ext3_fs.h | 3 ++- include/linux/reiserfs_xattr.h | 2 ++ include/linux/security.h | 9 +++++++-- mm/shmem.c | 9 +++++---- security/capability.c | 3 ++- security/security.c | 6 ++++-- security/selinux/hooks.c | 5 +++-- security/smack/smack_lsm.c | 5 ++++- 39 files changed, 136 insertions(+), 94 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 8039390..ffc6e15 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -90,13 +90,14 @@ static noinline int cow_file_range(struct inode *inode, unsigned long *nr_written, int unlock); static int btrfs_init_inode_security(struct btrfs_trans_handle *trans, - struct inode *inode, struct inode *dir) + struct inode *inode, struct inode *dir, + const struct qstr *qstr) { int err; err = btrfs_init_acl(trans, inode, dir); if (!err) - err = btrfs_xattr_security_init(trans, inode, dir); + err = btrfs_xattr_security_init(trans, inode, dir, qstr); return err; } @@ -4675,7 +4676,7 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, if (IS_ERR(inode)) goto out_unlock; - err = btrfs_init_inode_security(trans, inode, dir); + err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); if (err) { drop_inode = 1; goto out_unlock; @@ -4736,7 +4737,7 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, if (IS_ERR(inode)) goto out_unlock; - err = btrfs_init_inode_security(trans, inode, dir); + err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); if (err) { drop_inode = 1; goto out_unlock; @@ -4864,7 +4865,7 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) drop_on_err = 1; - err = btrfs_init_inode_security(trans, inode, dir); + err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); if (err) goto out_fail; @@ -6940,7 +6941,7 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, if (IS_ERR(inode)) goto out_unlock; - err = btrfs_init_inode_security(trans, inode, dir); + err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); if (err) { drop_inode = 1; goto out_unlock; diff --git a/fs/btrfs/xattr.c b/fs/btrfs/xattr.c index 698fdd2..3338a7e 100644 --- a/fs/btrfs/xattr.c +++ b/fs/btrfs/xattr.c @@ -352,7 +352,8 @@ int btrfs_removexattr(struct dentry *dentry, const char *name) } int btrfs_xattr_security_init(struct btrfs_trans_handle *trans, - struct inode *inode, struct inode *dir) + struct inode *inode, struct inode *dir, + const struct qstr *qstr) { int err; size_t len; @@ -360,7 +361,8 @@ int btrfs_xattr_security_init(struct btrfs_trans_handle *trans, char *suffix; char *name; - err = security_inode_init_security(inode, dir, &suffix, &value, &len); + err = security_inode_init_security(inode, dir, qstr, &suffix, &value, + &len); if (err) { if (err == -EOPNOTSUPP) return 0; diff --git a/fs/btrfs/xattr.h b/fs/btrfs/xattr.h index 7a43fd6..b3cc803 100644 --- a/fs/btrfs/xattr.h +++ b/fs/btrfs/xattr.h @@ -37,6 +37,7 @@ extern int btrfs_setxattr(struct dentry *dentry, const char *name, extern int btrfs_removexattr(struct dentry *dentry, const char *name); extern int btrfs_xattr_security_init(struct btrfs_trans_handle *trans, - struct inode *inode, struct inode *dir); + struct inode *inode, struct inode *dir, + const struct qstr *qstr); #endif /* __XATTR__ */ diff --git a/fs/ext2/ext2.h b/fs/ext2/ext2.h index 6346a2a..1b48c33 100644 --- a/fs/ext2/ext2.h +++ b/fs/ext2/ext2.h @@ -110,7 +110,7 @@ extern struct ext2_dir_entry_2 * ext2_dotdot (struct inode *, struct page **); extern void ext2_set_link(struct inode *, struct ext2_dir_entry_2 *, struct page *, struct inode *, int); /* ialloc.c */ -extern struct inode * ext2_new_inode (struct inode *, int); +extern struct inode * ext2_new_inode (struct inode *, int, const struct qstr *); extern void ext2_free_inode (struct inode *); extern unsigned long ext2_count_free_inodes (struct super_block *); extern void ext2_check_inodes_bitmap (struct super_block *); diff --git a/fs/ext2/ialloc.c b/fs/ext2/ialloc.c index ad70479..ee9ed31 100644 --- a/fs/ext2/ialloc.c +++ b/fs/ext2/ialloc.c @@ -429,7 +429,8 @@ found: return group; } -struct inode *ext2_new_inode(struct inode *dir, int mode) +struct inode *ext2_new_inode(struct inode *dir, int mode, + const struct qstr *qstr) { struct super_block *sb; struct buffer_head *bitmap_bh = NULL; @@ -585,7 +586,7 @@ got: if (err) goto fail_free_drop; - err = ext2_init_security(inode,dir); + err = ext2_init_security(inode, dir, qstr); if (err) goto fail_free_drop; diff --git a/fs/ext2/namei.c b/fs/ext2/namei.c index f8aecd2..368d704 100644 --- a/fs/ext2/namei.c +++ b/fs/ext2/namei.c @@ -104,7 +104,7 @@ static int ext2_create (struct inode * dir, struct dentry * dentry, int mode, st dquot_initialize(dir); - inode = ext2_new_inode(dir, mode); + inode = ext2_new_inode(dir, mode, &dentry->d_name); if (IS_ERR(inode)) return PTR_ERR(inode); @@ -133,7 +133,7 @@ static int ext2_mknod (struct inode * dir, struct dentry *dentry, int mode, dev_ dquot_initialize(dir); - inode = ext2_new_inode (dir, mode); + inode = ext2_new_inode (dir, mode, &dentry->d_name); err = PTR_ERR(inode); if (!IS_ERR(inode)) { init_special_inode(inode, inode->i_mode, rdev); @@ -159,7 +159,7 @@ static int ext2_symlink (struct inode * dir, struct dentry * dentry, dquot_initialize(dir); - inode = ext2_new_inode (dir, S_IFLNK | S_IRWXUGO); + inode = ext2_new_inode (dir, S_IFLNK | S_IRWXUGO, &dentry->d_name); err = PTR_ERR(inode); if (IS_ERR(inode)) goto out; @@ -230,7 +230,7 @@ static int ext2_mkdir(struct inode * dir, struct dentry * dentry, int mode) inode_inc_link_count(dir); - inode = ext2_new_inode (dir, S_IFDIR | mode); + inode = ext2_new_inode(dir, S_IFDIR | mode, &dentry->d_name); err = PTR_ERR(inode); if (IS_ERR(inode)) goto out_dir; diff --git a/fs/ext2/xattr.h b/fs/ext2/xattr.h index a1a1c21..5e41ccc 100644 --- a/fs/ext2/xattr.h +++ b/fs/ext2/xattr.h @@ -116,9 +116,11 @@ exit_ext2_xattr(void) # endif /* CONFIG_EXT2_FS_XATTR */ #ifdef CONFIG_EXT2_FS_SECURITY -extern int ext2_init_security(struct inode *inode, struct inode *dir); +extern int ext2_init_security(struct inode *inode, struct inode *dir, + const struct qstr *qstr); #else -static inline int ext2_init_security(struct inode *inode, struct inode *dir) +static inline int ext2_init_security(struct inode *inode, struct inode *dir, + const struct qstr *qstr) { return 0; } diff --git a/fs/ext2/xattr_security.c b/fs/ext2/xattr_security.c index 3004e15..5d979b4 100644 --- a/fs/ext2/xattr_security.c +++ b/fs/ext2/xattr_security.c @@ -47,14 +47,15 @@ ext2_xattr_security_set(struct dentry *dentry, const char *name, } int -ext2_init_security(struct inode *inode, struct inode *dir) +ext2_init_security(struct inode *inode, struct inode *dir, + const struct qstr *qstr) { int err; size_t len; void *value; char *name; - err = security_inode_init_security(inode, dir, &name, &value, &len); + err = security_inode_init_security(inode, dir, qstr, &name, &value, &len); if (err) { if (err == -EOPNOTSUPP) return 0; diff --git a/fs/ext3/ialloc.c b/fs/ext3/ialloc.c index 9724aef..bfc2dc4 100644 --- a/fs/ext3/ialloc.c +++ b/fs/ext3/ialloc.c @@ -404,7 +404,8 @@ static int find_group_other(struct super_block *sb, struct inode *parent) * For other inodes, search forward from the parent directory's block * group to find a free inode. */ -struct inode *ext3_new_inode(handle_t *handle, struct inode * dir, int mode) +struct inode *ext3_new_inode(handle_t *handle, struct inode * dir, + const struct qstr *qstr, int mode) { struct super_block *sb; struct buffer_head *bitmap_bh = NULL; @@ -589,7 +590,7 @@ got: if (err) goto fail_free_drop; - err = ext3_init_security(handle,inode, dir); + err = ext3_init_security(handle, inode, dir, qstr); if (err) goto fail_free_drop; diff --git a/fs/ext3/namei.c b/fs/ext3/namei.c index bce9dce..a900033 100644 --- a/fs/ext3/namei.c +++ b/fs/ext3/namei.c @@ -1707,7 +1707,7 @@ retry: if (IS_DIRSYNC(dir)) handle->h_sync = 1; - inode = ext3_new_inode (handle, dir, mode); + inode = ext3_new_inode (handle, dir, &dentry->d_name, mode); err = PTR_ERR(inode); if (!IS_ERR(inode)) { inode->i_op = &ext3_file_inode_operations; @@ -1743,7 +1743,7 @@ retry: if (IS_DIRSYNC(dir)) handle->h_sync = 1; - inode = ext3_new_inode (handle, dir, mode); + inode = ext3_new_inode (handle, dir, &dentry->d_name, mode); err = PTR_ERR(inode); if (!IS_ERR(inode)) { init_special_inode(inode, inode->i_mode, rdev); @@ -1781,7 +1781,7 @@ retry: if (IS_DIRSYNC(dir)) handle->h_sync = 1; - inode = ext3_new_inode (handle, dir, S_IFDIR | mode); + inode = ext3_new_inode (handle, dir, &dentry->d_name, S_IFDIR | mode); err = PTR_ERR(inode); if (IS_ERR(inode)) goto out_stop; @@ -2195,7 +2195,7 @@ retry: if (IS_DIRSYNC(dir)) handle->h_sync = 1; - inode = ext3_new_inode (handle, dir, S_IFLNK|S_IRWXUGO); + inode = ext3_new_inode (handle, dir, &dentry->d_name, S_IFLNK|S_IRWXUGO); err = PTR_ERR(inode); if (IS_ERR(inode)) goto out_stop; diff --git a/fs/ext3/xattr.h b/fs/ext3/xattr.h index 377fe72..2be4f69 100644 --- a/fs/ext3/xattr.h +++ b/fs/ext3/xattr.h @@ -128,10 +128,10 @@ exit_ext3_xattr(void) #ifdef CONFIG_EXT3_FS_SECURITY extern int ext3_init_security(handle_t *handle, struct inode *inode, - struct inode *dir); + struct inode *dir, const struct qstr *qstr); #else static inline int ext3_init_security(handle_t *handle, struct inode *inode, - struct inode *dir) + struct inode *dir, const struct qstr *qstr) { return 0; } diff --git a/fs/ext3/xattr_security.c b/fs/ext3/xattr_security.c index 03a99bf..b8d9f83 100644 --- a/fs/ext3/xattr_security.c +++ b/fs/ext3/xattr_security.c @@ -49,14 +49,15 @@ ext3_xattr_security_set(struct dentry *dentry, const char *name, } int -ext3_init_security(handle_t *handle, struct inode *inode, struct inode *dir) +ext3_init_security(handle_t *handle, struct inode *inode, struct inode *dir, + const struct qstr *qstr) { int err; size_t len; void *value; char *name; - err = security_inode_init_security(inode, dir, &name, &value, &len); + err = security_inode_init_security(inode, dir, qstr, &name, &value, &len); if (err) { if (err == -EOPNOTSUPP) return 0; diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index 1ce240a..49b6cfd 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c @@ -1042,7 +1042,7 @@ got: if (err) goto fail_free_drop; - err = ext4_init_security(handle, inode, dir); + err = ext4_init_security(handle, inode, dir, qstr); if (err) goto fail_free_drop; diff --git a/fs/ext4/xattr.h b/fs/ext4/xattr.h index 1ef1652..25b7387 100644 --- a/fs/ext4/xattr.h +++ b/fs/ext4/xattr.h @@ -145,10 +145,10 @@ ext4_expand_extra_isize_ea(struct inode *inode, int new_extra_isize, #ifdef CONFIG_EXT4_FS_SECURITY extern int ext4_init_security(handle_t *handle, struct inode *inode, - struct inode *dir); + struct inode *dir, const struct qstr *qstr); #else static inline int ext4_init_security(handle_t *handle, struct inode *inode, - struct inode *dir) + struct inode *dir, const struct qstr *qstr) { return 0; } diff --git a/fs/ext4/xattr_security.c b/fs/ext4/xattr_security.c index 9b21268..007c3bf 100644 --- a/fs/ext4/xattr_security.c +++ b/fs/ext4/xattr_security.c @@ -49,14 +49,15 @@ ext4_xattr_security_set(struct dentry *dentry, const char *name, } int -ext4_init_security(handle_t *handle, struct inode *inode, struct inode *dir) +ext4_init_security(handle_t *handle, struct inode *inode, struct inode *dir, + const struct qstr *qstr) { int err; size_t len; void *value; char *name; - err = security_inode_init_security(inode, dir, &name, &value, &len); + err = security_inode_init_security(inode, dir, qstr, &name, &value, &len); if (err) { if (err == -EOPNOTSUPP) return 0; diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index e1213f7..52fd31e 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c @@ -791,14 +791,15 @@ fail: return error; } -static int gfs2_security_init(struct gfs2_inode *dip, struct gfs2_inode *ip) +static int gfs2_security_init(struct gfs2_inode *dip, struct gfs2_inode *ip, + const struct qstr *qstr) { int err; size_t len; void *value; char *name; - err = security_inode_init_security(&ip->i_inode, &dip->i_inode, + err = security_inode_init_security(&ip->i_inode, &dip->i_inode, qstr, &name, &value, &len); if (err) { @@ -882,7 +883,7 @@ struct inode *gfs2_createi(struct gfs2_holder *ghs, const struct qstr *name, if (error) goto fail_gunlock2; - error = gfs2_security_init(dip, GFS2_I(inode)); + error = gfs2_security_init(dip, GFS2_I(inode), name); if (error) goto fail_gunlock2; diff --git a/fs/jffs2/dir.c b/fs/jffs2/dir.c index 9297865..82faddd 100644 --- a/fs/jffs2/dir.c +++ b/fs/jffs2/dir.c @@ -215,8 +215,7 @@ static int jffs2_create(struct inode *dir_i, struct dentry *dentry, int mode, no chance of AB-BA deadlock involving its f->sem). */ mutex_unlock(&f->sem); - ret = jffs2_do_create(c, dir_f, f, ri, - dentry->d_name.name, dentry->d_name.len); + ret = jffs2_do_create(c, dir_f, f, ri, &dentry->d_name); if (ret) goto fail; @@ -386,7 +385,7 @@ static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char jffs2_complete_reservation(c); - ret = jffs2_init_security(inode, dir_i); + ret = jffs2_init_security(inode, dir_i, &dentry->d_name); if (ret) goto fail; @@ -530,7 +529,7 @@ static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode) jffs2_complete_reservation(c); - ret = jffs2_init_security(inode, dir_i); + ret = jffs2_init_security(inode, dir_i, &dentry->d_name); if (ret) goto fail; @@ -703,7 +702,7 @@ static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, de jffs2_complete_reservation(c); - ret = jffs2_init_security(inode, dir_i); + ret = jffs2_init_security(inode, dir_i, &dentry->d_name); if (ret) goto fail; diff --git a/fs/jffs2/nodelist.h b/fs/jffs2/nodelist.h index 5a53d9b..e4619b0 100644 --- a/fs/jffs2/nodelist.h +++ b/fs/jffs2/nodelist.h @@ -401,7 +401,7 @@ int jffs2_write_inode_range(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_raw_inode *ri, unsigned char *buf, uint32_t offset, uint32_t writelen, uint32_t *retlen); int jffs2_do_create(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, struct jffs2_inode_info *f, - struct jffs2_raw_inode *ri, const char *name, int namelen); + struct jffs2_raw_inode *ri, const struct qstr *qstr); int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, const char *name, int namelen, struct jffs2_inode_info *dead_f, uint32_t time); int jffs2_do_link(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, uint32_t ino, diff --git a/fs/jffs2/security.c b/fs/jffs2/security.c index 239f512..cfeb716 100644 --- a/fs/jffs2/security.c +++ b/fs/jffs2/security.c @@ -23,14 +23,15 @@ #include "nodelist.h" /* ---- Initial Security Label Attachment -------------- */ -int jffs2_init_security(struct inode *inode, struct inode *dir) +int jffs2_init_security(struct inode *inode, struct inode *dir, + const struct qstr *qstr) { int rc; size_t len; void *value; char *name; - rc = security_inode_init_security(inode, dir, &name, &value, &len); + rc = security_inode_init_security(inode, dir, qstr, &name, &value, &len); if (rc) { if (rc == -EOPNOTSUPP) return 0; diff --git a/fs/jffs2/write.c b/fs/jffs2/write.c index c819eb0..30d175b 100644 --- a/fs/jffs2/write.c +++ b/fs/jffs2/write.c @@ -424,7 +424,9 @@ int jffs2_write_inode_range(struct jffs2_sb_info *c, struct jffs2_inode_info *f, return ret; } -int jffs2_do_create(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, struct jffs2_inode_info *f, struct jffs2_raw_inode *ri, const char *name, int namelen) +int jffs2_do_create(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, + struct jffs2_inode_info *f, struct jffs2_raw_inode *ri, + const struct qstr *qstr) { struct jffs2_raw_dirent *rd; struct jffs2_full_dnode *fn; @@ -466,15 +468,15 @@ int jffs2_do_create(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, str mutex_unlock(&f->sem); jffs2_complete_reservation(c); - ret = jffs2_init_security(&f->vfs_inode, &dir_f->vfs_inode); + ret = jffs2_init_security(&f->vfs_inode, &dir_f->vfs_inode, qstr); if (ret) return ret; ret = jffs2_init_acl_post(&f->vfs_inode); if (ret) return ret; - ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen, - ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen)); + ret = jffs2_reserve_space(c, sizeof(*rd)+qstr->len, &alloclen, + ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(qstr->len)); if (ret) { /* Eep. */ @@ -493,19 +495,19 @@ int jffs2_do_create(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, str rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT); - rd->totlen = cpu_to_je32(sizeof(*rd) + namelen); + rd->totlen = cpu_to_je32(sizeof(*rd) + qstr->len); rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4)); rd->pino = cpu_to_je32(dir_f->inocache->ino); rd->version = cpu_to_je32(++dir_f->highest_version); rd->ino = ri->ino; rd->mctime = ri->ctime; - rd->nsize = namelen; + rd->nsize = qstr->len; rd->type = DT_REG; rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8)); - rd->name_crc = cpu_to_je32(crc32(0, name, namelen)); + rd->name_crc = cpu_to_je32(crc32(0, qstr->name, qstr->len)); - fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, ALLOC_NORMAL); + fd = jffs2_write_dirent(c, dir_f, rd, qstr->name, qstr->len, ALLOC_NORMAL); jffs2_free_raw_dirent(rd); diff --git a/fs/jffs2/xattr.h b/fs/jffs2/xattr.h index cf4f575..7be4beb 100644 --- a/fs/jffs2/xattr.h +++ b/fs/jffs2/xattr.h @@ -121,10 +121,11 @@ extern ssize_t jffs2_listxattr(struct dentry *, char *, size_t); #endif /* CONFIG_JFFS2_FS_XATTR */ #ifdef CONFIG_JFFS2_FS_SECURITY -extern int jffs2_init_security(struct inode *inode, struct inode *dir); +extern int jffs2_init_security(struct inode *inode, struct inode *dir, + const struct qstr *qstr); extern const struct xattr_handler jffs2_security_xattr_handler; #else -#define jffs2_init_security(inode,dir) (0) +#define jffs2_init_security(inode,dir,qstr) (0) #endif /* CONFIG_JFFS2_FS_SECURITY */ #endif /* _JFFS2_FS_XATTR_H_ */ diff --git a/fs/jfs/jfs_xattr.h b/fs/jfs/jfs_xattr.h index 88b6cc5..e9e100f 100644 --- a/fs/jfs/jfs_xattr.h +++ b/fs/jfs/jfs_xattr.h @@ -62,10 +62,11 @@ extern ssize_t jfs_listxattr(struct dentry *, char *, size_t); extern int jfs_removexattr(struct dentry *, const char *); #ifdef CONFIG_JFS_SECURITY -extern int jfs_init_security(tid_t, struct inode *, struct inode *); +extern int jfs_init_security(tid_t, struct inode *, struct inode *, + const struct qstr *); #else static inline int jfs_init_security(tid_t tid, struct inode *inode, - struct inode *dir) + struct inode *dir, const struct qstr *qstr) { return 0; } diff --git a/fs/jfs/namei.c b/fs/jfs/namei.c index 231ca4a..ff0fda9 100644 --- a/fs/jfs/namei.c +++ b/fs/jfs/namei.c @@ -114,7 +114,7 @@ static int jfs_create(struct inode *dip, struct dentry *dentry, int mode, if (rc) goto out3; - rc = jfs_init_security(tid, ip, dip); + rc = jfs_init_security(tid, ip, dip, &dentry->d_name); if (rc) { txAbort(tid, 0); goto out3; @@ -252,7 +252,7 @@ static int jfs_mkdir(struct inode *dip, struct dentry *dentry, int mode) if (rc) goto out3; - rc = jfs_init_security(tid, ip, dip); + rc = jfs_init_security(tid, ip, dip, &dentry->d_name); if (rc) { txAbort(tid, 0); goto out3; @@ -931,7 +931,7 @@ static int jfs_symlink(struct inode *dip, struct dentry *dentry, mutex_lock_nested(&JFS_IP(dip)->commit_mutex, COMMIT_MUTEX_PARENT); mutex_lock_nested(&JFS_IP(ip)->commit_mutex, COMMIT_MUTEX_CHILD); - rc = jfs_init_security(tid, ip, dip); + rc = jfs_init_security(tid, ip, dip, &dentry->d_name); if (rc) goto out3; @@ -1394,7 +1394,7 @@ static int jfs_mknod(struct inode *dir, struct dentry *dentry, if (rc) goto out3; - rc = jfs_init_security(tid, ip, dir); + rc = jfs_init_security(tid, ip, dir, &dentry->d_name); if (rc) { txAbort(tid, 0); goto out3; diff --git a/fs/jfs/xattr.c b/fs/jfs/xattr.c index 2d7f165..3fa4c32 100644 --- a/fs/jfs/xattr.c +++ b/fs/jfs/xattr.c @@ -1091,7 +1091,8 @@ int jfs_removexattr(struct dentry *dentry, const char *name) } #ifdef CONFIG_JFS_SECURITY -int jfs_init_security(tid_t tid, struct inode *inode, struct inode *dir) +int jfs_init_security(tid_t tid, struct inode *inode, struct inode *dir, + const struct qstr *qstr) { int rc; size_t len; @@ -1099,7 +1100,8 @@ int jfs_init_security(tid_t tid, struct inode *inode, struct inode *dir) char *suffix; char *name; - rc = security_inode_init_security(inode, dir, &suffix, &value, &len); + rc = security_inode_init_security(inode, dir, qstr, &suffix, &value, + &len); if (rc) { if (rc == -EOPNOTSUPP) return 0; diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c index ff5744e..7740bc0 100644 --- a/fs/ocfs2/namei.c +++ b/fs/ocfs2/namei.c @@ -294,7 +294,7 @@ static int ocfs2_mknod(struct inode *dir, } /* get security xattr */ - status = ocfs2_init_security_get(inode, dir, &si); + status = ocfs2_init_security_get(inode, dir, &dentry->d_name, &si); if (status) { if (status == -EOPNOTSUPP) si.enable = 0; @@ -1665,7 +1665,7 @@ static int ocfs2_symlink(struct inode *dir, } /* get security xattr */ - status = ocfs2_init_security_get(inode, dir, &si); + status = ocfs2_init_security_get(inode, dir, &dentry->d_name, &si); if (status) { if (status == -EOPNOTSUPP) si.enable = 0; diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c index b5f9160..cd3f5b4 100644 --- a/fs/ocfs2/refcounttree.c +++ b/fs/ocfs2/refcounttree.c @@ -4325,7 +4325,8 @@ static int ocfs2_reflink(struct dentry *old_dentry, struct inode *dir, /* If the security isn't preserved, we need to re-initialize them. */ if (!preserve) { - error = ocfs2_init_security_and_acl(dir, new_orphan_inode); + error = ocfs2_init_security_and_acl(dir, new_orphan_inode, + &new_dentry->d_name); if (error) mlog_errno(error); } diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c index 67cd439..6bb6024 100644 --- a/fs/ocfs2/xattr.c +++ b/fs/ocfs2/xattr.c @@ -7185,7 +7185,8 @@ out: * must not hold any lock expect i_mutex. */ int ocfs2_init_security_and_acl(struct inode *dir, - struct inode *inode) + struct inode *inode, + const struct qstr *qstr) { int ret = 0; struct buffer_head *dir_bh = NULL; @@ -7193,7 +7194,7 @@ int ocfs2_init_security_and_acl(struct inode *dir, .enable = 1, }; - ret = ocfs2_init_security_get(inode, dir, &si); + ret = ocfs2_init_security_get(inode, dir, qstr, &si); if (!ret) { ret = ocfs2_xattr_set(inode, OCFS2_XATTR_INDEX_SECURITY, si.name, si.value, si.value_len, @@ -7261,13 +7262,14 @@ static int ocfs2_xattr_security_set(struct dentry *dentry, const char *name, int ocfs2_init_security_get(struct inode *inode, struct inode *dir, + const struct qstr *qstr, struct ocfs2_security_xattr_info *si) { /* check whether ocfs2 support feature xattr */ if (!ocfs2_supports_xattr(OCFS2_SB(dir->i_sb))) return -EOPNOTSUPP; - return security_inode_init_security(inode, dir, &si->name, &si->value, - &si->value_len); + return security_inode_init_security(inode, dir, qstr, &si->name, + &si->value, &si->value_len); } int ocfs2_init_security_set(handle_t *handle, diff --git a/fs/ocfs2/xattr.h b/fs/ocfs2/xattr.h index aa64bb3..d63cfb7 100644 --- a/fs/ocfs2/xattr.h +++ b/fs/ocfs2/xattr.h @@ -57,6 +57,7 @@ int ocfs2_has_inline_xattr_value_outside(struct inode *inode, struct ocfs2_dinode *di); int ocfs2_xattr_remove(struct inode *, struct buffer_head *); int ocfs2_init_security_get(struct inode *, struct inode *, + const struct qstr *, struct ocfs2_security_xattr_info *); int ocfs2_init_security_set(handle_t *, struct inode *, struct buffer_head *, @@ -94,5 +95,6 @@ int ocfs2_reflink_xattrs(struct inode *old_inode, struct buffer_head *new_bh, bool preserve_security); int ocfs2_init_security_and_acl(struct inode *dir, - struct inode *inode); + struct inode *inode, + const struct qstr *qstr); #endif /* OCFS2_XATTR_H */ diff --git a/fs/reiserfs/namei.c b/fs/reiserfs/namei.c index ba5f51e..d5b22ed 100644 --- a/fs/reiserfs/namei.c +++ b/fs/reiserfs/namei.c @@ -593,7 +593,7 @@ static int reiserfs_create(struct inode *dir, struct dentry *dentry, int mode, new_inode_init(inode, dir, mode); jbegin_count += reiserfs_cache_default_acl(dir); - retval = reiserfs_security_init(dir, inode, &security); + retval = reiserfs_security_init(dir, inode, &dentry->d_name, &security); if (retval < 0) { drop_new_inode(inode); return retval; @@ -667,7 +667,7 @@ static int reiserfs_mknod(struct inode *dir, struct dentry *dentry, int mode, new_inode_init(inode, dir, mode); jbegin_count += reiserfs_cache_default_acl(dir); - retval = reiserfs_security_init(dir, inode, &security); + retval = reiserfs_security_init(dir, inode, &dentry->d_name, &security); if (retval < 0) { drop_new_inode(inode); return retval; @@ -747,7 +747,7 @@ static int reiserfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) new_inode_init(inode, dir, mode); jbegin_count += reiserfs_cache_default_acl(dir); - retval = reiserfs_security_init(dir, inode, &security); + retval = reiserfs_security_init(dir, inode, &dentry->d_name, &security); if (retval < 0) { drop_new_inode(inode); return retval; @@ -1032,7 +1032,8 @@ static int reiserfs_symlink(struct inode *parent_dir, } new_inode_init(inode, parent_dir, mode); - retval = reiserfs_security_init(parent_dir, inode, &security); + retval = reiserfs_security_init(parent_dir, inode, &dentry->d_name, + &security); if (retval < 0) { drop_new_inode(inode); return retval; diff --git a/fs/reiserfs/xattr_security.c b/fs/reiserfs/xattr_security.c index 237c692..ef66c18 100644 --- a/fs/reiserfs/xattr_security.c +++ b/fs/reiserfs/xattr_security.c @@ -54,6 +54,7 @@ static size_t security_list(struct dentry *dentry, char *list, size_t list_len, * of blocks needed for the transaction. If successful, reiserfs_security * must be released using reiserfs_security_free when the caller is done. */ int reiserfs_security_init(struct inode *dir, struct inode *inode, + const struct qstr *qstr, struct reiserfs_security_handle *sec) { int blocks = 0; @@ -65,7 +66,7 @@ int reiserfs_security_init(struct inode *dir, struct inode *inode, if (IS_PRIVATE(dir)) return 0; - error = security_inode_init_security(inode, dir, &sec->name, + error = security_inode_init_security(inode, dir, qstr, &sec->name, &sec->value, &sec->length); if (error) { if (error == -EOPNOTSUPP) diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c index 94d5fd6..d9298cf 100644 --- a/fs/xfs/linux-2.6/xfs_iops.c +++ b/fs/xfs/linux-2.6/xfs_iops.c @@ -103,7 +103,8 @@ xfs_mark_inode_dirty( STATIC int xfs_init_security( struct inode *inode, - struct inode *dir) + struct inode *dir, + const struct qstr *qstr) { struct xfs_inode *ip = XFS_I(inode); size_t length; @@ -111,7 +112,7 @@ xfs_init_security( unsigned char *name; int error; - error = security_inode_init_security(inode, dir, (char **)&name, + error = security_inode_init_security(inode, dir, qstr, (char **)&name, &value, &length); if (error) { if (error == -EOPNOTSUPP) @@ -195,7 +196,7 @@ xfs_vn_mknod( inode = VFS_I(ip); - error = xfs_init_security(inode, dir); + error = xfs_init_security(inode, dir, &dentry->d_name); if (unlikely(error)) goto out_cleanup_inode; @@ -368,7 +369,7 @@ xfs_vn_symlink( inode = VFS_I(cip); - error = xfs_init_security(inode, dir); + error = xfs_init_security(inode, dir, &dentry->d_name); if (unlikely(error)) goto out_cleanup_inode; diff --git a/include/linux/ext3_fs.h b/include/linux/ext3_fs.h index 6ce1bca..87312a8 100644 --- a/include/linux/ext3_fs.h +++ b/include/linux/ext3_fs.h @@ -874,7 +874,8 @@ extern int ext3fs_dirhash(const char *name, int len, struct dx_hash_info *hinfo); /* ialloc.c */ -extern struct inode * ext3_new_inode (handle_t *, struct inode *, int); +extern struct inode * ext3_new_inode (handle_t *, struct inode *, + const struct qstr *, int); extern void ext3_free_inode (handle_t *, struct inode *); extern struct inode * ext3_orphan_get (struct super_block *, unsigned long); extern unsigned long ext3_count_free_inodes (struct super_block *); diff --git a/include/linux/reiserfs_xattr.h b/include/linux/reiserfs_xattr.h index b2cf208..c2b7147 100644 --- a/include/linux/reiserfs_xattr.h +++ b/include/linux/reiserfs_xattr.h @@ -63,6 +63,7 @@ extern const struct xattr_handler reiserfs_xattr_trusted_handler; extern const struct xattr_handler reiserfs_xattr_security_handler; #ifdef CONFIG_REISERFS_FS_SECURITY int reiserfs_security_init(struct inode *dir, struct inode *inode, + const struct qstr *qstr, struct reiserfs_security_handle *sec); int reiserfs_security_write(struct reiserfs_transaction_handle *th, struct inode *inode, @@ -130,6 +131,7 @@ static inline void reiserfs_init_xattr_rwsem(struct inode *inode) #ifndef CONFIG_REISERFS_FS_SECURITY static inline int reiserfs_security_init(struct inode *dir, struct inode *inode, + const struct qstr *qstr, struct reiserfs_security_handle *sec) { return 0; diff --git a/include/linux/security.h b/include/linux/security.h index 4ab684e..02fcc0e 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -315,6 +316,7 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) * then it should return -EOPNOTSUPP to skip this processing. * @inode contains the inode structure of the newly created inode. * @dir contains the inode structure of the parent directory. + * @qstr contains the last path component of the new object * @name will be set to the allocated name suffix (e.g. selinux). * @value will be set to the allocated attribute value. * @len will be set to the length of the value. @@ -1437,7 +1439,8 @@ struct security_operations { int (*inode_alloc_security) (struct inode *inode); void (*inode_free_security) (struct inode *inode); int (*inode_init_security) (struct inode *inode, struct inode *dir, - char **name, void **value, size_t *len); + const struct qstr *qstr, char **name, + void **value, size_t *len); int (*inode_create) (struct inode *dir, struct dentry *dentry, int mode); int (*inode_link) (struct dentry *old_dentry, @@ -1701,7 +1704,8 @@ int security_sb_parse_opts_str(char *options, struct security_mnt_opts *opts); int security_inode_alloc(struct inode *inode); void security_inode_free(struct inode *inode); int security_inode_init_security(struct inode *inode, struct inode *dir, - char **name, void **value, size_t *len); + const struct qstr *qstr, char **name, + void **value, size_t *len); int security_inode_create(struct inode *dir, struct dentry *dentry, int mode); int security_inode_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry); @@ -2028,6 +2032,7 @@ static inline void security_inode_free(struct inode *inode) static inline int security_inode_init_security(struct inode *inode, struct inode *dir, + const struct qstr *qstr, char **name, void **value, size_t *len) diff --git a/mm/shmem.c b/mm/shmem.c index 47fdeeb..86cd21d 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -1843,8 +1843,9 @@ shmem_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev) inode = shmem_get_inode(dir->i_sb, dir, mode, dev, VM_NORESERVE); if (inode) { - error = security_inode_init_security(inode, dir, NULL, NULL, - NULL); + error = security_inode_init_security(inode, dir, + &dentry->d_name, NULL, + NULL, NULL); if (error) { if (error != -EOPNOTSUPP) { iput(inode); @@ -1983,8 +1984,8 @@ static int shmem_symlink(struct inode *dir, struct dentry *dentry, const char *s if (!inode) return -ENOSPC; - error = security_inode_init_security(inode, dir, NULL, NULL, - NULL); + error = security_inode_init_security(inode, dir, &dentry->d_name, NULL, + NULL, NULL); if (error) { if (error != -EOPNOTSUPP) { iput(inode); diff --git a/security/capability.c b/security/capability.c index 92a1bff..c3d796c 100644 --- a/security/capability.c +++ b/security/capability.c @@ -118,7 +118,8 @@ static void cap_inode_free_security(struct inode *inode) } static int cap_inode_init_security(struct inode *inode, struct inode *dir, - char **name, void **value, size_t *len) + const struct qstr *qstr, char **name, + void **value, size_t *len) { return -EOPNOTSUPP; } diff --git a/security/security.c b/security/security.c index 799239d..7ebeb86 100644 --- a/security/security.c +++ b/security/security.c @@ -336,11 +336,13 @@ void security_inode_free(struct inode *inode) } int security_inode_init_security(struct inode *inode, struct inode *dir, - char **name, void **value, size_t *len) + const struct qstr *qstr, char **name, + void **value, size_t *len) { if (unlikely(IS_PRIVATE(inode))) return -EOPNOTSUPP; - return security_ops->inode_init_security(inode, dir, name, value, len); + return security_ops->inode_init_security(inode, dir, qstr, name, value, + len); } EXPORT_SYMBOL(security_inode_init_security); diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index b8dcd05..7699e23 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include @@ -2509,8 +2510,8 @@ static void selinux_inode_free_security(struct inode *inode) } static int selinux_inode_init_security(struct inode *inode, struct inode *dir, - char **name, void **value, - size_t *len) + const struct qstr *qstr, char **name, + void **value, size_t *len) { const struct task_security_struct *tsec = current_security(); struct inode_security_struct *dsec; diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index 489a85a..581b65e 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -31,6 +31,7 @@ #include #include #include +#include #include "smack.h" #define task_security(task) (task_cred_xxx((task), security)) @@ -424,6 +425,7 @@ static void smack_inode_free_security(struct inode *inode) * smack_inode_init_security - copy out the smack from an inode * @inode: the inode * @dir: unused + * @qstr: unused * @name: where to put the attribute name * @value: where to put the attribute value * @len: where to put the length of the attribute @@ -431,7 +433,8 @@ static void smack_inode_free_security(struct inode *inode) * Returns 0 if it all works out, -ENOMEM if there's no memory */ static int smack_inode_init_security(struct inode *inode, struct inode *dir, - char **name, void **value, size_t *len) + const struct qstr *qstr, char **name, + void **value, size_t *len) { char *isp = smk_of_inode(inode); From stan@hardwarefreak.com Wed Dec 8 16:12:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_36, J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB8MCJ3W149194 for ; Wed, 8 Dec 2010 16:12:19 -0600 X-ASG-Debug-ID: 1291846446-7a2a037b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D066C1CA7F4F for ; Wed, 8 Dec 2010 14:14:07 -0800 (PST) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id 99wgGwIGgL6qbMh5 for ; Wed, 08 Dec 2010 14:14:07 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id D2A6C6C174 for ; Wed, 8 Dec 2010 16:14:05 -0600 (CST) Message-ID: <4D00032D.4040000@hardwarefreak.com> Date: Wed, 08 Dec 2010 16:14:05 -0600 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2.12) Gecko/20101027 Thunderbird/3.1.6 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs tuning for a 830 GB partition (mkfs.xfs options) Subject: Re: xfs tuning for a 830 GB partition (mkfs.xfs options) References: 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: 1291846447 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.01 X-Barracuda-Spam-Status: No, SCORE=-1.01 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC, SUBJECT_FUZZY_TION X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.41 SUBJECT_FUZZY_TION Attempt to obfuscate words in Subject: 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Abel Coto put forth on 12/8/2010 1:32 PM: > I want to create a 830 GB partition, to mount as /home in my Centos 5.4 > workstation. > > Actually i have /home not mounted ,so i would have to create the new > partition in the lvm,format it and use rsync to copy /home directory to it. > > for a 830 GB partition that i will use to save my data in general and also > 3d / CG projects and renders once finished them what agcount value should be > used. I have read that mkfs default option creates 1 allocation group each > 4G , so i understand that for a 830 GB partition agcount should be 208. > > It is this correct ? No that's not correct. > so i would use for format the partition > > mkfs.xfs -l lazy-count=1,version=2,size=128m -i attr=2 -d agcount=208 -L > VolumeName Do not do this! If this filesystem will reside on a single physical disk, format the partition using the XFS defaults. agcount, and most of the other options, exists for optimizing parallel performance on striped RAID or SSD storage systems that have lots of IOPS performance. These options are _not_ for use on single disk drives. AG count is related to number of spindles and/or IOPs throughput, not the size of the partition. The mkfs.xfs default for a single drive filesystem is 4 AGs. If you specify a value greater than 4 your performance will suffer. If you specify 208 AGs it may likely be little faster than a floppy disk drive. -- Stan From stan@hardwarefreak.com Wed Dec 8 18:26:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB90Q3oR154028 for ; Wed, 8 Dec 2010 18:26:03 -0600 X-ASG-Debug-ID: 1291854470-577203e20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A5A421CA8667 for ; Wed, 8 Dec 2010 16:27:51 -0800 (PST) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id hDXytBuwkkwogvAh for ; Wed, 08 Dec 2010 16:27:51 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id C2B386C173 for ; Wed, 8 Dec 2010 18:27:50 -0600 (CST) Message-ID: <4D002286.2080204@hardwarefreak.com> Date: Wed, 08 Dec 2010 18:27:50 -0600 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2.12) Gecko/20101027 Thunderbird/3.1.6 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs tuning for a 830 GB partition (mkfs.xfs options) Subject: Re: xfs tuning for a 830 GB partition (mkfs.xfs options) References: <4D00032D.4040000@hardwarefreak.com> 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: 1291854471 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.01 X-Barracuda-Spam-Status: No, SCORE=-1.01 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, BSF_SC5_SA210e, RDNS_DYNAMIC, SUBJECT_FUZZY_TION X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48874 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.41 SUBJECT_FUZZY_TION Attempt to obfuscate words in Subject: 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 0.00 BSF_SC5_SA210e Custom Rule SA210e X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Abel Coto put forth on 12/8/2010 5:29 PM: > By the moment i will use one hard disk for / (on ext3) and /home , and > the data partition for saving 3d projects working on in another hard > disk (1,5 tb one , with the 350 GB partition and one of 1 TB for > backups of /home mostly) > > so agcount should be in both cases 4, as i haven't got a raid (the 1,5 > tb disk won't be in the LVM neither). > > I have read that in xfsprogs 3.1.2, i think, -l lazy-count=1,version=2 > and -i attr=2 is the default option like agcount=4. So i should only > specify the -l size=128m if i want a log size of 128m for improve > deleting performance and improving system in general. With a single disk filesystem, you can tweak these things forever, and you will gain almost no performance benefit over the mkfs.xfs defaults, though you may decrease performance if you don't know exactly what you're doing, such as with your previous misunderstanding of agcount. The one thing you can tweak beyond defaults to get improved performance is using delayed logging, which will increase metadata write performance substantially. For example, deletes of large groups (thousands) of small files will be "massively" faster using delayed logging. IIRC this requires kernel 2.6.36 or later. Simply add "delaylog" to you /etc/fstab mount options. > I think in /home the most important thing is read/write seqential > performance , and in /data (the 350 GB partition) the same. > > I don't think /data would have to handle too many ramdon reads/ writes > when Maya saves and read data from it, i think would be mostly > seqential and then allocated in memory. Again, with a single disk, there's not much you can tweak to increase general XFS performance, except for metadata writes using delaylog. For sequential file reads/writes and random reads/writes, you're at the mercy of the drive's spindle speed. XFS options can't improve upon the poor physics of a single spinning drive. If you need improved file performance (not metadata), your options are to add spindles and stripe the data (RAID card or mdadm, RAID 0/5/6/10), or use a good quality SSD. -- Stan From SRS0+UJ1G+12+fromorbit.com=david@internode.on.net Wed Dec 8 18:58:02 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB90w1pp155373 for ; Wed, 8 Dec 2010 18:58:02 -0600 X-ASG-Debug-ID: 1291856388-20f601c50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D6C891CA7B6A for ; Wed, 8 Dec 2010 16:59:48 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id ArF1txQl4CXmFiEk for ; Wed, 08 Dec 2010 16:59:48 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49678282-1927428 for multiple; Thu, 09 Dec 2010 11:29:46 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PQUrJ-0001ny-0I; Thu, 09 Dec 2010 11:59:45 +1100 Date: Thu, 9 Dec 2010 11:59:44 +1100 From: Dave Chinner To: blacknred Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: kernel panic-xfs errors Subject: Re: kernel panic-xfs errors Message-ID: <20101209005944.GD32766@dastard> References: <30397503.post@talk.nabble.com> <20101207222558.GC29333@dastard> <30403823.post@talk.nabble.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <30403823.post@talk.nabble.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1291856390 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48876 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 08, 2010 at 01:39:10AM -0800, blacknred wrote: > > > >You've done a forced module load. No guarantee your kernel is in any > >sane shape if you've done that.... > > Agree, but I'm reasonably convinced that module isn't the issue, because it > works fine with my other servers...... > > >Strange failure. Hmmm - i386 arch and fedora - are you running with > 4k stacks? If so, maybe it blew the stack... > > i386 arch, rhel 5.0 Yup, 4k stacks. This is definitely smelling like a stack blowout. XFS on 4k stacks is a ticking timebomb - it will explode and you've got no idea of when it will go boom. Recompile your kernel with 8k stacks or move to x86_64. > ># dd if= bs=512 count=1 | od -c > This is what i get now, but now server's been rebooted and running OK, what > should i be expecting or rather what are we looking for in this output at > point of failure? Well, what you see here: > 0000000 X F S B \0 \0 020 \0 \0 \0 \0 \0 025 324 304 \0 ^^^^^^^^^^^^^ Is a valid XFS superblock magic number. If you are getting this error: > >> XFS: bad magic number > >> XFS: SB validate failed Then I'd expect to see anything other than "XFSB" as the magic number. Of course, if you smashed the stack during mount, then there will most likely be nothing wrong with the value on disk... > >why did I flash the controller > I was on 5.22 fw version which has a known 'lockup' issue which is fixed in > 7.x ver. > This is a critical fix. Is the version 7.x firmware certified with such an old kernel? It's not uncommon for different firmware versions to only be supported on specific releases/kernel versions. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+UJ1G+12+fromorbit.com=david@internode.on.net Wed Dec 8 19:03:47 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_36, J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB913lnA155554 for ; Wed, 8 Dec 2010 19:03:47 -0600 X-ASG-Debug-ID: 1291856733-68fa01330000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 289501D6025 for ; Wed, 8 Dec 2010 17:05:34 -0800 (PST) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id prTuhfhyJjQTKHG2 for ; Wed, 08 Dec 2010 17:05:34 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 37805253-1927428 for multiple; Thu, 09 Dec 2010 11:35:33 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PQUwt-0001oa-Ak; Thu, 09 Dec 2010 12:05:31 +1100 Date: Thu, 9 Dec 2010 12:05:31 +1100 From: Dave Chinner To: Abel Coto Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs tuning for a 830 GB partition (mkfs.xfs options) Subject: Re: xfs tuning for a 830 GB partition (mkfs.xfs options) Message-ID: <20101209010531.GE32766@dastard> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1291856736 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.61 X-Barracuda-Spam-Status: No, SCORE=-1.61 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=SUBJECT_FUZZY_TION X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48876 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.41 SUBJECT_FUZZY_TION Attempt to obfuscate words in Subject: X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 08, 2010 at 08:32:28PM +0100, Abel Coto wrote: > I want to create a 830 GB partition, to mount as /home in my Centos 5.4 > workstation. > > Actually i have /home not mounted ,so i would have to create the new > partition in the lvm,format it and use rsync to copy /home directory to it. > > for a 830 GB partition that i will use to save my data in general and also > 3d / CG projects and renders once finished them what agcount value should be > used. I have read that mkfs default option creates 1 allocation group each > 4G , so i understand that for a 830 GB partition agcount should be 208. > > It is this correct ? No, you've read something that is at least 5 years out of date. Just use the defaults - they are already optimised for best performance in most circumstances. > I have read that too much allocation groups are bad , but i don't now if 416 > are too much for a 830 GB partition (and shoukd use 208 to 300) or not. Any more than 4 AGs on a single spindle is bad for performance. AGs can be up to 1TB in size, so you're going to get 4 as the default for your 830GB partition. > I will mount the partition with logbufs=8. (i use a 128m journal and > logbufs=8 to improve a bit deleting performance). I will perhaps use noatime > too ,but i have to see if my backup app, uses atime or not. logbufs=8 is the default. Also, the default atime option is relatime which has pretty much zero compareeed to noatime, so once again just use the defaults. > for this partition , that will handle mostly big files (500 MB to 2-3 GB at > least) what mkfs.xfs options should i use ? The defaults. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+rFbk+12+fromorbit.com=david@internode.on.net Wed Dec 8 19:37:37 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_36 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB91ba4l156647 for ; Wed, 8 Dec 2010 19:37:37 -0600 X-ASG-Debug-ID: 1291858479-68dc01da0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DAD231D6DF3 for ; Wed, 8 Dec 2010 17:34:39 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id 7T2GCNU8rJJDw4ar for ; Wed, 08 Dec 2010 17:34:39 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49456341-1927428 for multiple; Thu, 09 Dec 2010 12:04:36 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PQVOg-0001r4-2H; Thu, 09 Dec 2010 12:34:14 +1100 Date: Thu, 9 Dec 2010 12:34:14 +1100 From: Dave Chinner To: Abel Coto Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs tuning for a 830 GB partition (mkfs.xfs options) Subject: Re: xfs tuning for a 830 GB partition (mkfs.xfs options) Message-ID: <20101209013413.GA7105@dastard> References: <20101209010531.GE32766@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101209010531.GE32766@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1291858480 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0209 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.51 X-Barracuda-Spam-Status: No, SCORE=-1.51 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA085, SUBJECT_FUZZY_TION X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48878 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.41 SUBJECT_FUZZY_TION Attempt to obfuscate words in Subject: 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 09, 2010 at 12:05:31PM +1100, Dave Chinner wrote: > On Wed, Dec 08, 2010 at 08:32:28PM +0100, Abel Coto wrote: > > I want to create a 830 GB partition, to mount as /home in my Centos 5.4 > > workstation. > > > > Actually i have /home not mounted ,so i would have to create the new > > partition in the lvm,format it and use rsync to copy /home directory to it. > > > > for a 830 GB partition that i will use to save my data in general and also > > 3d / CG projects and renders once finished them what agcount value should be > > used. I have read that mkfs default option creates 1 allocation group each > > 4G , so i understand that for a 830 GB partition agcount should be 208. > > > > It is this correct ? > > No, you've read something that is at least 5 years out of date. Just > use the defaults - they are already optimised for best performance > in most circumstances. Seeing as I say this so often: http://xfs.org/index.php/XFS_FAQ#Q:_I_want_to_tune_my_XFS_filesystems_for_.3Csomething.3E Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Wed Dec 8 21:42:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB93gSHg166437 for ; Wed, 8 Dec 2010 21:42:28 -0600 X-ASG-Debug-ID: 1291866256-466902630000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2F9B51CA8ED2 for ; Wed, 8 Dec 2010 19:44:16 -0800 (PST) Received: from mail.sandeen.net (64-131-28-21.usfamily.net [64.131.28.21]) by cuda.sgi.com with ESMTP id JEutCkHHfi6U8Bhv for ; Wed, 08 Dec 2010 19:44:16 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 2CEC44817CFA; Wed, 8 Dec 2010 21:44:15 -0600 (CST) Message-ID: <4D00508E.5040408@sandeen.net> Date: Wed, 08 Dec 2010 21:44:14 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.12) Gecko/20101027 Thunderbird/3.1.6 MIME-Version: 1.0 To: Dave Chinner CC: blacknred , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: possible xfs corruption Subject: Re: possible xfs corruption References: <30395558.post@talk.nabble.com> <20101207221009.GA29333@dastard> In-Reply-To: <20101207221009.GA29333@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-28-21.usfamily.net[64.131.28.21] X-Barracuda-Start-Time: 1291866257 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48886 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 12/7/10 4:10 PM, Dave Chinner wrote: > On Tue, Dec 07, 2010 at 03:49:49AM -0800, blacknred wrote: >> >> Hi... >> >> I'm stuck with a storage issue on reboot. Initially doubted the storage, but >> dmesg throws these errors. Now wondering whether this is a fs issue? Any >> thoughts as to whats going on here? >> >> >> XFS: failed to locate log tail >> XFS: log mount/recovery failed: error 117 >> XFS: log mount failed >> XFS mounting filesystem cciss/c0d0 >> Filesystem "cciss/c0d0": XFS internal error xlog_clear_stale_blocks(2) at >> line 1237 of file > > Which indicates that the head and/or the tail of the log are not > valid. Can you provide the output of: > > # xfs_logprint -d /dev/cciss/c0d0 > > So we can see what the head/tail values are in the log? > >> /home/buildsvn/rpmbuild/BUILD/xfs-kmod-0.4/_kmod_build_PAE/xfs_log_recover.c. > > CentOS kernel? How old? Assuning it's centos5, there's really no need to be using an xfs kmod there anymore, the module shipped with the kernel in recent versions of the OS is really the one you want to use. That kmod is ancient and unmaintained. Although I suspect the storage is more likely at fault here. :) -Eric > Cheers, > > Dave. From sandeen@sandeen.net Wed Dec 8 21:49:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB93nZoe167350 for ; Wed, 8 Dec 2010 21:49:36 -0600 X-ASG-Debug-ID: 1291866683-07ae03420000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 63773152A76D for ; Wed, 8 Dec 2010 19:51:23 -0800 (PST) Received: from mail.sandeen.net (64-131-28-21.usfamily.net [64.131.28.21]) by cuda.sgi.com with ESMTP id 0aMhTIiIxjXTwnNX for ; Wed, 08 Dec 2010 19:51:23 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id EEE234817CFA; Wed, 8 Dec 2010 21:51:22 -0600 (CST) Message-ID: <4D00523A.9020703@sandeen.net> Date: Wed, 08 Dec 2010 21:51:22 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.12) Gecko/20101027 Thunderbird/3.1.6 MIME-Version: 1.0 To: Ajeet Yadav CC: Dave Chinner , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS mount fail: XFS_WANT_CORRUPTED_GOTO fs/xfs/xfs_alloc.c Subject: Re: XFS mount fail: XFS_WANT_CORRUPTED_GOTO fs/xfs/xfs_alloc.c References: <20101202224506.GY16922@dastard> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-28-21.usfamily.net[64.131.28.21] X-Barracuda-Start-Time: 1291866684 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48887 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 12/3/10 10:19 PM, Ajeet Yadav wrote: > Our test case is automated: > 1. Create large number of file of 6KB sizes ( 6KB is taken, we wanted to increase journal load, and file size not in multiple of file system block size) > 2. Set target to reboot at random seconds seconds. What exactly is meant by "reboot?" Does this mean "cycle power" or cleanly reboot? Based on the problems you are encountering, I am guessing that you drop power. Is the storage external for this test? Is it qualified hardware or are you planning on supporting anything that the user may choose to plug into their device? It's possible that an external USB device is behaving poorly, and that may be the root of your problems. -Eric > 3. Next boot do "ls" of all files in XFS partition. > 4. Remove all files in XFS. > 5. Go back to step 1 > > The purpose of this test is to test journal and stability of XFS filestem. > > Do you think, we should consider this test case ? > > Other is when we should run xfs_repair ? because if mount fails and journal contain dirty logs then xfs_repair does not run, we are forced to use (-L) option but its description say that (-L) can corrupt the file system. > > Other case even if xfs mount successfully, even in that case accessing some files give IO input/ output error. > > 1. I recommend the following usage for xfs_repair so that we do not come accross these problem > Mount Success -> Umount -> run xfs_repair -> mount > Mount fails -> try xfs_repair -> xfs_repair fails -> finally xfs_repair -L -> mount > > Adding above mount + xfs_repair procedure to script makes file system stable. But other member of my team do not agree as it increases mount time. > > > > On Fri, Dec 3, 2010 at 4:15 AM, Dave Chinner > wrote: > > On Thu, Dec 02, 2010 at 12:31:30PM +0530, Ajeet Yadav wrote: > > Dear all, > > This is XFS fail mount log on linux 2.6.30.9 > > > > XFS mounting filesystem sda2 > > Starting XFS recovery on filesystem: sda2 (logdev: internal) > > XFS internal error XFS_WANT_CORRUPTED_GOTO at line 1629 of file > > fs/xfs/xfs_alloc.c. Caller 0x80129658 > > Call Trace: > > [<802dedc8>] dump_stack+0x8/0x34 from[<80127400>] > > xfs_free_ag_extent+0x128/0x7ac > > [<80127400>] xfs_free_ag_extent+0x128/0x7ac from[<80129658>] > > xfs_free_extent+0xb8/0xe8 > > [<80129658>] xfs_free_extent+0xb8/0xe8 from[<80163978>] > > xlog_recover_process_efi+0x160/0x214 > > [<80163978>] xlog_recover_process_efi+0x160/0x214 from[<80163ac4>] > > xlog_recover_process_efis+0x98/0x11c > > [<80163ac4>] xlog_recover_process_efis+0x98/0x11c from[<8016663c>] > > xlog_recover_finish+0x28/0xdc > > [<8016663c>] xlog_recover_finish+0x28/0xdc from[<8016aec0>] > > xfs_mountfs+0x4d0/0x610 > > [<8016aec0>] xfs_mountfs+0x4d0/0x610 from[<80184434>] > > xfs_fs_fill_super+0x1fc/0x418 > > [<80184434>] xfs_fs_fill_super+0x1fc/0x418 from[<800bae48>] > > get_sb_bdev+0x11c/0x1c0 > > [<800bae48>] get_sb_bdev+0x11c/0x1c0 from[<80181f20>] > > xfs_fs_get_sb+0x20/0x2c > > [<80181f20>] xfs_fs_get_sb+0x20/0x2c from[<800b9424>] > > vfs_kern_mount+0x68/0xd0 > > [<800b9424>] vfs_kern_mount+0x68/0xd0 from[<800b94f0>] > > do_kern_mount+0x54/0x118 > > [<800b94f0>] do_kern_mount+0x54/0x118 from[<800d44e8>] do_mount+0x7b4/0x828 > > [<800d44e8>] do_mount+0x7b4/0x828 from[<800d45f8>] sys_mount+0x9c/0x194 > > [<800d45f8>] sys_mount+0x9c/0x194 from[<800102c4>] stack_done+0x20/0x3c > > > > Failed to recover EFIs on filesystem: sda2 > > XFS: log mount finish failed > > You corrupted a free space btree. Care to tell uswhat test you were > running that caused this? Did you pull the plug on the device > during a copy again? > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Wed Dec 8 22:42:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB94gMZG178743 for ; Wed, 8 Dec 2010 22:42:22 -0600 X-ASG-Debug-ID: 1291869850-10d901190000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D21B11CA8E2C for ; Wed, 8 Dec 2010 20:44:10 -0800 (PST) Received: from mail.sandeen.net (64-131-28-21.usfamily.net [64.131.28.21]) by cuda.sgi.com with ESMTP id sh9Gy0OVcseLZGzC for ; Wed, 08 Dec 2010 20:44:10 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 004544817CFA; Wed, 8 Dec 2010 22:44:09 -0600 (CST) Message-ID: <4D005E99.2030400@sandeen.net> Date: Wed, 08 Dec 2010 22:44:09 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.12) Gecko/20101027 Thunderbird/3.1.6 MIME-Version: 1.0 To: Dave Chinner CC: blacknred , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: kernel panic-xfs errors Subject: Re: kernel panic-xfs errors References: <30397503.post@talk.nabble.com> <20101207222558.GC29333@dastard> <30403823.post@talk.nabble.com> <20101209005944.GD32766@dastard> In-Reply-To: <20101209005944.GD32766@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-28-21.usfamily.net[64.131.28.21] X-Barracuda-Start-Time: 1291869850 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48890 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 12/8/10 6:59 PM, Dave Chinner wrote: > On Wed, Dec 08, 2010 at 01:39:10AM -0800, blacknred wrote: >> >> >>> You've done a forced module load. No guarantee your kernel is in any >>> sane shape if you've done that.... >> >> Agree, but I'm reasonably convinced that module isn't the issue, because it >> works fine with my other servers...... >> >>> Strange failure. Hmmm - i386 arch and fedora - are you running with >> 4k stacks? If so, maybe it blew the stack... >> >> i386 arch, rhel 5.0 > > Yup, 4k stacks. This is definitely smelling like a stack blowout. well, hang on. The oops said: EIP: 0060:[] Tainted: GF VLI EFLAGS: 00010272 (2.6.33.3-85.fc13.x86_64 #1) EIP is at do_page_fault+0x245/0x617 eax: ec5ee000 ebx: 00000000 ecx: eb5de084 edx: 0000000e esi: 00013103 edi: ec5de0b3 ebp: 00000023 esp: ec5de024 ds: 008b es: 008b ss: 0078 which is NOT a rhel 5.0 kernel, and it says x86_64. But the addresses are all 32 bits? So what's going on here? > esi: 00013103 edi: ec5de0b3 ebp: 00000023 esp: ec5de024 > ds: 008b es: 008b ss: 0078 > Process bm (pid: 3210, ti=ec622000 task=ec5e3450 task.ti=ec6ee000) end of the stack is ec6ee000, stack grows up, esp is at ec5de024, well past it (i.e. yes, overrun) if I remember my stack math right... but that's a pretty huge difference so either I have it wrong, or things are really a huge mess here. -Eric From sandeen@sandeen.net Wed Dec 8 23:13:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.4 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_44,J_CHICKENPOX_64,J_CHICKENPOX_66,J_CHICKENPOX_73 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB95DWHh184123 for ; Wed, 8 Dec 2010 23:13:32 -0600 X-ASG-Debug-ID: 1291871719-4b8100c50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DC0DF1D2C41 for ; Wed, 8 Dec 2010 21:15:19 -0800 (PST) Received: from mail.sandeen.net (64-131-28-21.usfamily.net [64.131.28.21]) by cuda.sgi.com with ESMTP id MZhwaf2lA8I7j0Az for ; Wed, 08 Dec 2010 21:15:19 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 8D2C74817CFA; Wed, 8 Dec 2010 23:15:18 -0600 (CST) Message-ID: <4D0065E6.6010009@sandeen.net> Date: Wed, 08 Dec 2010 23:15:18 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.12) Gecko/20101027 Thunderbird/3.1.6 MIME-Version: 1.0 To: Lukas Czerner CC: xfs@oss.sgi.com, hch@infradead.org, esandeen@redhat.com X-ASG-Orig-Subj: Re: [PATCH] Add test 248: Check filesystem FITRIM implementation Subject: Re: [PATCH] Add test 248: Check filesystem FITRIM implementation References: <1290780743-12112-1-git-send-email-lczerner@redhat.com> In-Reply-To: <1290780743-12112-1-git-send-email-lczerner@redhat.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-28-21.usfamily.net[64.131.28.21] X-Barracuda-Start-Time: 1291871719 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48892 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 11/26/10 8:12 AM, Lukas Czerner wrote: > FITRIM ioctl is used on a mounted filesystem to discard (or "trim") > blocks which are not in use by the filesystem. This is useful for > solid-state drives (SSDs) and thinly-provi-sioned storage. This test > helps to verify filesystem FITRIM implementation to assure that it > does not corrupts data. > > This test creates checksums of all files in /usr/share/doc directory and > run several processes which clear its working directory on SCRATCH_MNT, > then copy everything from /usr/share/doc into its working directory, create > list of files in working directory and its checksums and compare it with the > original list of checksums. Every process works in the loop so it repeat > remove->copy->check, while fstrim tool is running simultaneously. > > Fstrim is just a helper tool which uses FITRIM ioctl to actually do the > filesystem discard. > > I found this very useful because when the FITRIM is really buggy (thus > data-destroying) the 248 test will notice, because checksums will most > likely change. > > Signed-off-by: Lukas Czerner > --- > 248 | 163 +++++++++++++++++++++++++++++++++++++ > 248.out | 3 + > group | 1 + > src/Makefile | 2 +- > src/fstrim.c | 257 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 5 files changed, 425 insertions(+), 1 deletions(-) > create mode 100755 248 > create mode 100644 248.out > create mode 100644 src/fstrim.c > > diff --git a/248 b/248 > new file mode 100755 > index 0000000..0d2f17f > --- /dev/null > +++ b/248 > @@ -0,0 +1,163 @@ > +#!/bin/bash > +# FS QA Test No. 248 > +# > +# This test was created in order to verify filesystem FITRIM implementation. > +# By many concurrent copy and remove operations and checking that files > +# does not change after copied into SCRATCH_MNT test if FITIM implementation typo up there in "FITIM", just FWIW. > +# corrupts the filesystem (data/metadata). > +# > +#----------------------------------------------------------------------- > +# Copyright 2010 (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 > +#----------------------------------------------------------------------- > + > +owner=lczerner@redhat.com > + > +seq=`basename $0` > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=`mktemp -d` > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 3 > +trap "_destroy; exit \$status" 2 15 > +chpid=0 > +mypid=$$ > + > +# get standard environment, filters and checks > +. ./common.rc > +. ./common.filter > + > +# real QA test starts here > +_supported_fs generic > +_supported_os Linux > +_require_scratch > +_scratch_mkfs >/dev/null 2>&1 > +_scratch_mount > + > +_cleanup() > +{ > + rm -rf $tmp > +} > + > +_destroy() > +{ > + kill $pids $fstrim_pid > + wait $pids $fstrim_pid > + rm -rf $tmp > +} > + > +_destroy_fstrim() > +{ > + kill $fpid > + wait $fpid > +} > + > +fstrim_loop() > +{ > + trap "_destroy_fstrim; exit \$status" 2 15 > + fsize=$(df | grep $SCRATCH_MNT | grep $SCRATCH_DEV | awk '{print $2}') > + > + while true ; do > + step=1048576 > + start=0 > + $here/src/fstrim $SCRATCH_MNT & > + fpid=$! > + wait $fpid > + while [ $start -lt $fsize ] ; do > + $here/src/fstrim -s ${start}k -l ${step}k $SCRATCH_MNT & > + fpid=$! > + wait $fpid > + start=$(( $start + $step )) > + done I may be dense here but a) why do you background and then immediately wait? b) does this start a whole-device trim followed by several smaller range-trims? I could do with some comments, I suppose. > + done > +} > + > +function check_sums() { > + dir=$1 > + > + ( > + cd $SCRATCH_MNT/$p > + find -P . -xdev -type f -print0 | xargs -0 md5sum | sort -o $tmp/stress.$$.$p > + ) > + > + diff $tmp/content.sums $tmp/stress.$$.$p > + if [ $? -ne 0 ]; then > + echo "!!!Checksums has changed - Filesystem possibly corrupted!!!\n" > + kill $mypid what is $mypid? Oh right $$ ... why not: _fail "!!!Checksums has changed - Filesystem possibly corrupted!!!" > + fi > + rm -f $tmp/stress.$$.$p > +} > + > +function run_process() { > + local p=$1 > + repeat=10 > + > + sleep $((5*$p))s & > + export chpid=$! && wait $chpid &> /dev/null I guess I don't sight-read bash very well. What's going on with all the backgrounding/waiting here? > + chpid=0 > + > + while [ $repeat -gt 0 ]; do > + > + # Remove old directories. > + rm -rf $SCRATCH_MNT/$p > + export chpid=$! && wait $chpid &> /dev/null and here? > + # Copy content -> partition. > + mkdir $SCRATCH_MNT/$p > + cp -ax $content/* $SCRATCH_MNT/$p > + export chpid=$! && wait $chpid &> /dev/null > + > + check_sums > + repeat=$(( $repeat - 1 )) > + done > +} > + > +nproc=20 > +content=/usr/share/doc > + > +# Check for FITRIM support > +echo -n "Checking FITRIM support: " > +$here/src/fstrim -l 10M $SCRATCH_MNT > +[ $? -ne 0 ] && exit > +echo "done." > + > +mkdir -p $tmp > + > +( > +cd $content > +find -P . -xdev -type f -print0 | xargs -0 md5sum | sort -o $tmp/content.sums > +) > + > +echo -n "Running the test: " > +pids="" > +fstrim_loop & > +fstrim_pid=$! > +p=1 > +while [ $p -le $nproc ]; do > + run_process $p & > + pids="$pids $!" > + p=$(($p+1)) > +done > +echo "done." > + > +wait $pids > +kill $fstrim_pid > +wait $fstrim_pid > + > +status=0 > +_check_scratch_fs Scratch fs should get checked automatically after the test I think? I guess other tests do this, but I'm not sure it's necessary unless filesystems are made, remounted, etc in a loop during the test > +exit > diff --git a/248.out b/248.out > new file mode 100644 > index 0000000..880d9c7 > --- /dev/null > +++ b/248.out > @@ -0,0 +1,3 @@ > +QA output created by 248 > +Checking FITRIM support: done. > +Running the test: done. > diff --git a/group b/group > index 0f94dd9..fea84ed 100644 > --- a/group > +++ b/group > @@ -361,3 +361,4 @@ deprecated > 245 auto quick dir > 246 auto quick rw > 247 auto quick rw > +248 ioctl I suppose maybe a trim group would be worthwhile at some point ... > diff --git a/src/Makefile b/src/Makefile > index b827bd0..885fd65 100644 > --- a/src/Makefile > +++ b/src/Makefile > @@ -17,7 +17,7 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ > preallo_rw_pattern_writer ftrunc trunc fs_perms testx looptest \ > locktest unwritten_mmap bulkstat_unlink_test t_stripealign \ > bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable \ > - stale_handle > + stale_handle fstrim > > SUBDIRS = > > diff --git a/src/fstrim.c b/src/fstrim.c > new file mode 100644 > index 0000000..6686c99 > --- /dev/null > +++ b/src/fstrim.c > @@ -0,0 +1,257 @@ > +/* > + * fstrim.c -- discard the part (or whole) of mounted filesystem. > + * > + * Copyright (C) 2009 Red Hat, Inc., Lukas Czerner 2010 I think :) > + * > + * This program is free software: you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation, either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program. If not, see . > + * > + * This program uses FITRIM ioctl to discard parts or the whole filesystem > + * online (mounted). You can specify range (start and lenght) to be > + * discarded, or simply discard while filesystem. > + * > + * Usage: fstrim [options] > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include > +#include > + > +#ifndef FITRIM > +struct fstrim_range { > + uint64_t start; > + uint64_t len; > + uint64_t minlen; > +}; > +#define FITRIM _IOWR('X', 121, struct fstrim_range) > +#endif > + > +const char *program_name = "fstrim"; > + > +struct options { > + struct fstrim_range *range; > + char mpoint[PATH_MAX]; > + char verbose; > +}; > + > +static void usage(void) > +{ > + fprintf(stderr, > + "Usage: %s [-s start] [-l length] [-m minimum-extent]" > + " [-v] {mountpoint}\n\t" > + "-s Starting Byte to discard from\n\t" > + "-l Number of Bytes to discard from the start\n\t" > + "-m Minimum extent length to discard\n\t" > + "-v Verbose - number of discarded bytes\n", > + program_name); > +} > + > +static void err_exit(const char *fmt, ...) > +{ > + va_list pvar; > + va_start(pvar, fmt); > + vfprintf(stderr, fmt, pvar); > + va_end(pvar); > + usage(); > + exit(EXIT_FAILURE); > +} > + > +/** > + * Get the number from argument. It can be number followed by > + * units: k|K, m|M, g|G, t|T > + */ > +static unsigned long long get_number(char **optarg) > +{ > + char *opt, *end; > + unsigned long long number, max; > + > + /* get the max to avoid overflow */ > + max = ULLONG_MAX / 1024; > + number = 0; > + opt = *optarg; > + > + if (*opt == '-') { > + err_exit("%s: %s (%s)\n", program_name, > + strerror(ERANGE), *optarg); > + } > + > + errno = 0; > + number = strtoul(opt, &end , 0); > + if (errno) > + err_exit("%s: %s (%s)\n", program_name, > + strerror(errno), *optarg); > + > + /* > + * Convert units to numbers. Fall-through stack is used for units > + * so absence of breaks is intentional. > + */ wish we had a library for this sort of thing :( > + switch (*end) { > + case 'T': /* terabytes */ > + case 't': > + if (number > max) > + err_exit("%s: %s (%s)\n", program_name, > + strerror(ERANGE), *optarg); > + number *= 1024; > + case 'G': /* gigabytes */ > + case 'g': > + if (number > max) > + err_exit("%s: %s (%s)\n", program_name, > + strerror(ERANGE), *optarg); > + number *= 1024; > + case 'M': /* megabytes */ > + case 'm': > + if (number > max) > + err_exit("%s: %s (%s)\n", program_name, > + strerror(ERANGE), *optarg); > + number *= 1024; > + case 'K': /* kilobytes */ > + case 'k': > + if (number > max) > + err_exit("%s: %s (%s)\n", program_name, > + strerror(ERANGE), *optarg); > + number *= 1024; > + end++; > + case '\0': /* end of the string */ > + break; > + default: > + err_exit("%s: %s (%s)\n", program_name, > + strerror(EINVAL), *optarg); > + return 0; > + } > + > + if (*end != '\0') { > + err_exit("%s: %s (%s)\n", program_name, > + strerror(EINVAL), *optarg); > + } > + > + return number; > +} > + > +static int parse_opts(int argc, char **argv, struct options *opts) > +{ > + int c; > + > + while ((c = getopt(argc, argv, "s:l:m:v")) != EOF) { > + switch (c) { > + case 's': /* starting point */ > + opts->range->start = get_number(&optarg); > + break; > + case 'l': /* length */ > + opts->range->len = get_number(&optarg); > + break; > + case 'm': /* minlen */ > + opts->range->minlen = get_number(&optarg); > + break; > + case 'v': /* verbose */ > + opts->verbose = 1; > + break; > + default: > + return EXIT_FAILURE; > + } > + } > + > + return 0; > +} > + > +int main(int argc, char **argv) > +{ > + struct options *opts; > + struct stat sb; > + int fd, err = 0, ret = EXIT_FAILURE; > + > + opts = malloc(sizeof(struct options)); > + if (!opts) > + err_exit("%s: malloc(): %s\n", program_name, strerror(errno)); > + > + opts->range = NULL; > + opts->verbose = 0; > + > + if (argc > 1) > + strncpy(opts->mpoint, argv[argc - 1], sizeof(opts->mpoint)); > + > + opts->range = calloc(1, sizeof(struct fstrim_range)); > + if (!opts->range) { > + fprintf(stderr, "%s: calloc(): %s\n", program_name, > + strerror(errno)); > + goto free_opts; > + } > + > + opts->range->len = ULLONG_MAX; > + > + if (argc > 2) > + err = parse_opts(argc, argv, opts); > + > + if (err) { > + usage(); > + goto free_opts; > + } > + > + if (strnlen(opts->mpoint, 1) < 1) { > + fprintf(stderr, "%s: You have to specify mount point.\n", > + program_name); > + usage(); > + goto free_opts; > + } > + > + if (stat(opts->mpoint, &sb) == -1) { > + fprintf(stderr, "%s: %s: %s\n", program_name, > + opts->mpoint, strerror(errno)); > + usage(); > + goto free_opts; > + } > + > + if (!S_ISDIR(sb.st_mode)) { > + fprintf(stderr, "%s: %s: (%s)\n", program_name, > + opts->mpoint, strerror(ENOTDIR)); > + usage(); > + goto free_opts; > + } > + > + fd = open(opts->mpoint, O_RDONLY); > + if (fd < 0) { > + fprintf(stderr, "%s: open(%s): %s\n", program_name, > + opts->mpoint, strerror(errno)); > + goto free_opts; > + } > + > + if (ioctl(fd, FITRIM, opts->range)) { > + fprintf(stderr, "%s: FSTRIM: %s\n", program_name, > + strerror(errno)); > + goto free_opts; > + } > + > + if ((opts->verbose) && (opts->range)) > + fprintf(stdout, "%llu Bytes was trimmed\n", opts->range->len); "Bytes were trimmed," just FWIW > + > + ret = EXIT_SUCCESS; > + > +free_opts: > + if (opts) { > + if (opts->range) > + free(opts->range); > + free(opts); > + } > + > + return ret; > +} From SRS0+rFbk+12+fromorbit.com=david@internode.on.net Thu Dec 9 04:34:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB9AYLc2233074 for ; Thu, 9 Dec 2010 04:34:22 -0600 X-ASG-Debug-ID: 1291890967-032b03e50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2EC59152AFC6 for ; Thu, 9 Dec 2010 02:36:08 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id yebwcRK5aipmAlQy for ; Thu, 09 Dec 2010 02:36:08 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49518214-1927428 for multiple; Thu, 09 Dec 2010 21:06:07 +1030 (CDT) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1PQdr3-0002Z2-QN; Thu, 09 Dec 2010 21:36:05 +1100 Date: Thu, 9 Dec 2010 21:36:05 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: log timestamp changes to the source inode in rename Subject: Re: [PATCH] xfs: log timestamp changes to the source inode in rename Message-ID: <20101209103605.GC29856@dastard> References: <20101207101641.GA25995@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101207101641.GA25995@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1291890970 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48915 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 07, 2010 at 05:16:41AM -0500, Christoph Hellwig wrote: > Now that we don't mark VFS inodes dirty anymore for internal timestamp changes, > but rely on the transaction subsystem to push them out, we need to explicitly > log the source inode in rename after updating it's timestamps to make sure > the changes actually get forced out by sync/fsync or an AIL push. > > We already account for the fourth inode in the log reservation, as a rename > of directories needs to update the nlink field, so just adding the > xfs_trans_log_inode call is enough. > > This fixes the xfsqa 065 regression introduced by: > > "xfs: don't use vfs writeback for pure metadata modifications" > > > Signed-off-by: Christoph Hellwig Looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From lczerner@redhat.com Thu Dec 9 05:01:16 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB9B1Gqe237089 for ; Thu, 9 Dec 2010 05:01:16 -0600 X-ASG-Debug-ID: 1291892584-46ac00e40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 669961C9A025 for ; Thu, 9 Dec 2010 03:03:04 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ED3pvaWjGVHV2tXQ for ; Thu, 09 Dec 2010 03:03:04 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation 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.13.8/8.13.8) with ESMTP id oB9B2wBo012891 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 9 Dec 2010 06:02:58 -0500 Received: from dhcp-lab-213.englab.brq.redhat.com (dhcp-27-109.brq.redhat.com [10.34.27.109]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id oB9B2tME007164 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 9 Dec 2010 06:02:56 -0500 Date: Thu, 9 Dec 2010 12:02:52 +0100 (CET) From: Lukas Czerner X-X-Sender: lukas@dhcp-lab-213.englab.brq.redhat.com To: Eric Sandeen cc: Lukas Czerner , xfs@oss.sgi.com, hch@infradead.org, esandeen@redhat.com X-ASG-Orig-Subj: Re: [PATCH] Add test 248: Check filesystem FITRIM implementation Subject: Re: [PATCH] Add test 248: Check filesystem FITRIM implementation In-Reply-To: <4D0065E6.6010009@sandeen.net> Message-ID: References: <1290780743-12112-1-git-send-email-lczerner@redhat.com> <4D0065E6.6010009@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.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1291892585 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 8 Dec 2010, Eric Sandeen wrote: > On 11/26/10 8:12 AM, Lukas Czerner wrote: > > FITRIM ioctl is used on a mounted filesystem to discard (or "trim") > > blocks which are not in use by the filesystem. This is useful for > > solid-state drives (SSDs) and thinly-provi-sioned storage. This test > > helps to verify filesystem FITRIM implementation to assure that it > > does not corrupts data. > > > > This test creates checksums of all files in /usr/share/doc directory and > > run several processes which clear its working directory on SCRATCH_MNT, > > then copy everything from /usr/share/doc into its working directory, create > > list of files in working directory and its checksums and compare it with the > > original list of checksums. Every process works in the loop so it repeat > > remove->copy->check, while fstrim tool is running simultaneously. > > > > Fstrim is just a helper tool which uses FITRIM ioctl to actually do the > > filesystem discard. > > > > I found this very useful because when the FITRIM is really buggy (thus > > data-destroying) the 248 test will notice, because checksums will most > > likely change. > > > > Signed-off-by: Lukas Czerner -snip- > > + > > +fstrim_loop() > > +{ > > + trap "_destroy_fstrim; exit \$status" 2 15 > > + fsize=$(df | grep $SCRATCH_MNT | grep $SCRATCH_DEV | awk '{print $2}') > > + > > + while true ; do > > + step=1048576 > > + start=0 > > + $here/src/fstrim $SCRATCH_MNT & > > + fpid=$! > > + wait $fpid > > + while [ $start -lt $fsize ] ; do > > + $here/src/fstrim -s ${start}k -l ${step}k $SCRATCH_MNT & > > + fpid=$! > > + wait $fpid > > + start=$(( $start + $step )) > > + done > > I may be dense here but > > a) why do you background and then immediately wait? > b) does this start a whole-device trim followed by several > smaller range-trims? > > I could do with some comments, I suppose. Hi Eric, all the waiting is done because Bash is incredibly stupid. As you know, fstrim_loop is run at background and when the test is over, or when it is killed (with ^C), because of trap, it tries to kill fstrim_loop. However, it does not kill currently running commands, so fstrim might be still running making it impossible to umount the SCRATCH_MNT. So this way, I can kill the running process directly. I believe I am not the first one running into this troubles, so maybe there is a better way ? > > > + done > > +} > > + > > +function check_sums() { > > + dir=$1 > > + > > + ( > > + cd $SCRATCH_MNT/$p > > + find -P . -xdev -type f -print0 | xargs -0 md5sum | sort -o $tmp/stress.$$.$p > > + ) > > + > > + diff $tmp/content.sums $tmp/stress.$$.$p > > + if [ $? -ne 0 ]; then > > + echo "!!!Checksums has changed - Filesystem possibly corrupted!!!\n" > > + kill $mypid > > what is $mypid? Oh right $$ ... why not: > > _fail "!!!Checksums has changed - Filesystem possibly corrupted!!!" oh, that's better, thanks. > > > + fi > > + rm -f $tmp/stress.$$.$p > > +} > > + > > +function run_process() { > > + local p=$1 > > + repeat=10 > > + > > + sleep $((5*$p))s & > > + export chpid=$! && wait $chpid &> /dev/null > > I guess I don't sight-read bash very well. What's going > on with all the backgrounding/waiting here? > > > + chpid=0 > > + > > + while [ $repeat -gt 0 ]; do > > + > > + # Remove old directories. > > + rm -rf $SCRATCH_MNT/$p > > + export chpid=$! && wait $chpid &> /dev/null > > and here? The same thing here, the process will still be running when xfstests will attempt to umount SCRATCH_MNT, resulting in error. This way I can kill it directly. > > > + # Copy content -> partition. > > + mkdir $SCRATCH_MNT/$p > > + cp -ax $content/* $SCRATCH_MNT/$p > > + export chpid=$! && wait $chpid &> /dev/null > > + > > + check_sums > > + repeat=$(( $repeat - 1 )) > > + done > > +} > > + > > +nproc=20 > > +content=/usr/share/doc > > + > > +# Check for FITRIM support > > +echo -n "Checking FITRIM support: " > > +$here/src/fstrim -l 10M $SCRATCH_MNT > > +[ $? -ne 0 ] && exit > > +echo "done." > > + > > +mkdir -p $tmp > > + > > +( > > +cd $content > > +find -P . -xdev -type f -print0 | xargs -0 md5sum | sort -o $tmp/content.sums > > +) > > + > > +echo -n "Running the test: " > > +pids="" > > +fstrim_loop & > > +fstrim_pid=$! > > +p=1 > > +while [ $p -le $nproc ]; do > > + run_process $p & > > + pids="$pids $!" > > + p=$(($p+1)) > > +done > > +echo "done." > > + > > +wait $pids > > +kill $fstrim_pid > > +wait $fstrim_pid > > + > > +status=0 > > +_check_scratch_fs > > Scratch fs should get checked automatically after the test I think? > I guess other tests do this, but I'm not sure it's necessary > unless filesystems are made, remounted, etc in a loop during > the test Ok, I'll get rid of it. > > > +exit > > diff --git a/248.out b/248.out > > new file mode 100644 > > index 0000000..880d9c7 > > --- /dev/null > > +++ b/248.out > > @@ -0,0 +1,3 @@ > > +QA output created by 248 > > +Checking FITRIM support: done. > > +Running the test: done. > > diff --git a/group b/group > > index 0f94dd9..fea84ed 100644 > > --- a/group > > +++ b/group > > @@ -361,3 +361,4 @@ deprecated > > 245 auto quick dir > > 246 auto quick rw > > 247 auto quick rw > > +248 ioctl > > I suppose maybe a trim group would be worthwhile at some point ... Added. > > > diff --git a/src/Makefile b/src/Makefile > > index b827bd0..885fd65 100644 > > --- a/src/Makefile > > +++ b/src/Makefile > > @@ -17,7 +17,7 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ > > preallo_rw_pattern_writer ftrunc trunc fs_perms testx looptest \ > > locktest unwritten_mmap bulkstat_unlink_test t_stripealign \ > > bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable \ > > - stale_handle > > + stale_handle fstrim > > > > SUBDIRS = > > > > diff --git a/src/fstrim.c b/src/fstrim.c > > new file mode 100644 > > index 0000000..6686c99 > > --- /dev/null > > +++ b/src/fstrim.c > > @@ -0,0 +1,257 @@ > > +/* > > + * fstrim.c -- discard the part (or whole) of mounted filesystem. > > + * > > + * Copyright (C) 2009 Red Hat, Inc., Lukas Czerner > > 2010 I think :) Hmm, still living in the past :). Thanks for review Eric! -Lukas -snip- From lczerner@redhat.com Thu Dec 9 05:09:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB9B9cUx238856 for ; Thu, 9 Dec 2010 05:09:38 -0600 X-ASG-Debug-ID: 1291893086-14e303c10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7B6921D80E8 for ; Thu, 9 Dec 2010 03:11:26 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 2oaAii4xP99OmyQL for ; Thu, 09 Dec 2010 03:11:26 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation 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.13.8/8.13.8) with ESMTP id oB9BBNYX014336 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 9 Dec 2010 06:11:24 -0500 Received: from dhcp-lab-213.englab.brq.redhat.com (dhcp-27-109.brq.redhat.com [10.34.27.109]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id oB9BBLfg018056 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 9 Dec 2010 06:11:22 -0500 Date: Thu, 9 Dec 2010 12:11:20 +0100 (CET) From: Lukas Czerner X-X-Sender: lukas@dhcp-lab-213.englab.brq.redhat.com To: Lukas Czerner cc: Eric Sandeen , xfs@oss.sgi.com, hch@infradead.org, esandeen@redhat.com X-ASG-Orig-Subj: Re: [PATCH] Add test 248: Check filesystem FITRIM implementation Subject: Re: [PATCH] Add test 248: Check filesystem FITRIM implementation In-Reply-To: Message-ID: References: <1290780743-12112-1-git-send-email-lczerner@redhat.com> <4D0065E6.6010009@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.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1291893087 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, 9 Dec 2010, Lukas Czerner wrote: > On Wed, 8 Dec 2010, Eric Sandeen wrote: > > > On 11/26/10 8:12 AM, Lukas Czerner wrote: > > > FITRIM ioctl is used on a mounted filesystem to discard (or "trim") > > > blocks which are not in use by the filesystem. This is useful for > > > solid-state drives (SSDs) and thinly-provi-sioned storage. This test > > > helps to verify filesystem FITRIM implementation to assure that it > > > does not corrupts data. > > > > > > This test creates checksums of all files in /usr/share/doc directory and > > > run several processes which clear its working directory on SCRATCH_MNT, > > > then copy everything from /usr/share/doc into its working directory, create > > > list of files in working directory and its checksums and compare it with the > > > original list of checksums. Every process works in the loop so it repeat > > > remove->copy->check, while fstrim tool is running simultaneously. > > > > > > Fstrim is just a helper tool which uses FITRIM ioctl to actually do the > > > filesystem discard. > > > > > > I found this very useful because when the FITRIM is really buggy (thus > > > data-destroying) the 248 test will notice, because checksums will most > > > likely change. > > > > > > Signed-off-by: Lukas Czerner > > -snip- > > > > + > > > +fstrim_loop() > > > +{ > > > + trap "_destroy_fstrim; exit \$status" 2 15 > > > + fsize=$(df | grep $SCRATCH_MNT | grep $SCRATCH_DEV | awk '{print $2}') > > > + > > > + while true ; do > > > + step=1048576 > > > + start=0 > > > + $here/src/fstrim $SCRATCH_MNT & > > > + fpid=$! > > > + wait $fpid > > > + while [ $start -lt $fsize ] ; do > > > + $here/src/fstrim -s ${start}k -l ${step}k $SCRATCH_MNT & > > > + fpid=$! > > > + wait $fpid > > > + start=$(( $start + $step )) > > > + done > > > > I may be dense here but > > > > a) why do you background and then immediately wait? > > b) does this start a whole-device trim followed by several > > smaller range-trims? I forgot about this one. The reason for this is, that this way we can get better test coverage of the kernel code, because the code path of smaller trims (especially not ag-aligned) might be slightly different, so we test that case as well. -Lukas > > > > I could do with some comments, I suppose. > > Hi Eric, > > all the waiting is done because Bash is incredibly stupid. As you know, > fstrim_loop is run at background and when the test is over, or when it > is killed (with ^C), because of trap, it tries to kill fstrim_loop. > However, it does not kill currently running commands, so fstrim might be > still running making it impossible to umount the SCRATCH_MNT. > > So this way, I can kill the running process directly. I believe I am not > the first one running into this troubles, so maybe there is a better way > ? > From branto@redhat.com Thu Dec 9 07:03:59 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB9D3wWj258219 for ; Thu, 9 Dec 2010 07:03:58 -0600 X-ASG-Debug-ID: 1291899947-46f203da0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 204901CA9E4E for ; Thu, 9 Dec 2010 05:05:47 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8fNaJe8Tg6CrEuKD for ; Thu, 09 Dec 2010 05:05:47 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation 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.13.8/8.13.8) with ESMTP id oB9D5kHF021986 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 9 Dec 2010 08:05:46 -0500 Received: from [10.34.26.208] (dhcp-26-208.brq.redhat.com [10.34.26.208]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id oB9D5iQn006710 for ; Thu, 9 Dec 2010 08:05:45 -0500 X-ASG-Orig-Subj: xfstests: ignore absolute address in filename in test case 237 Subject: xfstests: ignore absolute address in filename in test case 237 From: Boris Ranto To: xfs@oss.sgi.com Content-Type: text/plain; charset="UTF-8" Date: Thu, 09 Dec 2010 14:05:44 +0100 Message-ID: <1291899944.3196.11.camel@dhcp-31-190.brq.redhat.com> Mime-Version: 1.0 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: 1291899948 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Test case 237 checks for setfacl output. The setfacl can use both relative address or absolute address for filename. Following patch ignores the unnecessary part of absolute address and therefore the test case can pass on systems that output absolute address: diff -urpN a/xfstests/237 b/xfstests/237 --- a/xfstests/237 2010-12-09 11:24:48.587432718 +0100 +++ b/xfstests/237 2010-12-09 13:46:29.008245581 +0100 @@ -72,7 +72,7 @@ touch file1 chown $acl1.$acl1 file1 echo "Expect to FAIL" -$runas -u $acl2 -g $acl2 -- `which setfacl` -m u::rwx file1 2>&1 +$runas -u $acl2 -g $acl2 -- `which setfacl` -m u::rwx file1 2>&1 | sed 's/^setfacl: \/.*file1: Operation not permitted$/setfacl: file1: Operation not permitted/' echo "Test over." # success, all done Signed-off-by: Boris Ranto From lists@nabble.com Thu Dec 9 07:15:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB9DFFld260535 for ; Thu, 9 Dec 2010 07:15:15 -0600 X-ASG-Debug-ID: 1291900623-5a0502c20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from kuber.nabble.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1749B1D8868 for ; Thu, 9 Dec 2010 05:17:03 -0800 (PST) Received: from kuber.nabble.com (kuber.nabble.com [216.139.236.158]) by cuda.sgi.com with ESMTP id VcHcD7PAbIJhwYCS for ; Thu, 09 Dec 2010 05:17:03 -0800 (PST) Received: from isper.nabble.com ([192.168.236.156]) by kuber.nabble.com with esmtp (Exim 4.63) (envelope-from ) id 1PQgMp-0003K0-3B for xfs@oss.sgi.com; Thu, 09 Dec 2010 05:17:03 -0800 Message-ID: <30416394.post@talk.nabble.com> Date: Thu, 9 Dec 2010 05:17:03 -0800 (PST) From: blacknred To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: kernel panic-xfs errors Subject: Re: kernel panic-xfs errors In-Reply-To: <4D005E99.2030400@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Nabble-From: leo1783@hotmail.co.uk References: <30397503.post@talk.nabble.com> <20101207222558.GC29333@dastard> <30403823.post@talk.nabble.com> <20101209005944.GD32766@dastard> <4D005E99.2030400@sandeen.net> X-Barracuda-Connect: kuber.nabble.com[216.139.236.158] X-Barracuda-Start-Time: 1291900624 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48924 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean >which is NOT a rhel 5.0 kernel, and it says x86_64. >But the addresses are all 32 bits? My apologies there, somehow it all got jumbled up, pasting it again: BUG: unable to handle kernel NULL pointer dereference at virtual address 00000098 printing eip: *pde = 2c621001 Oops: 0000 [#1] SMP CPU: 2 EIP: 0060:[] Tainted: GF VLI EFLAGS: 00010282 (2.6.18-164.11.1.el5PAE #1) EIP is at do_page_fault+0x205/0x607 eax: ec6de000 ebx: 00000000 ecx: ec6de074 edx: 0000000d esi: 00014005 edi: ec6de0a4 ebp: 00000014 esp: ec6de054 ds: 007b es: 007b ss: 0068 Process bm (pid: 2910, ti=ec6dd000 task=ec6e3550 task.ti=ec6dd000) Stack: 00000000 00000000 ec6de0a4 00000014 00000098 f7180000 00000001 00000000 ec6de0a4 c0639439 00000000 0000000e 0000000b 00000000 00000000 00000000 00014005 c0619b9c 00000014 c0405a89 00000000 ec6de0f8 0000000d 00014005 Call Trace: [] do_page_fault+0x0/0x607 [] error_code+0x39/0x40 [] do_page_fault+0x205/0x607 [] elv_next_request+0x127/0x134 [] do_cciss_request+0x398/0x3a3 [cciss] [] do_page_fault+0x0/0x607 [] error_code+0x39/0x40 [] do_page_fault+0x205/0x607 [] deadline_set_request+0x16/0x57 [] do_page_fault+0x0/0x607 [] error_code+0x39/0x40 [] do_page_fault+0x205/0x607 [] do_page_fault+0x0/0x607 [] error_code+0x39/0x40 [] do_page_fault+0x205/0x607 [] do_page_fault+0x0/0x607 [] error_code+0x39/0x40 [] __down+0x2b/0xbb [] default_wake_function+0x0/0xc [] __down_failed+0x7/0xc [] .text.lock.xfs_buf+0x17/0x5f [xfs] [] xfs_buf_read_flags+0x48/0x76 [xfs] [] xfs_trans_read_buf+0x1bb/0x2c0 [xfs] [] xfs_btree_read_bufl+0x96/0xb3 [xfs] [] xfs_bmbt_lookup+0x135/0x478 [xfs] [] xfs_bmap_add_extent+0xd2b/0x1e30 [xfs] [] xfs_alloc_update+0x3a/0xbc [xfs] [] xfs_alloc_fixup_trees+0x217/0x29a [xfs] [] xfs_trans_log_buf+0x49/0x6c [xfs] [] xfs_alloc_search_busy+0x20/0xae [xfs] [] xfs_iext_bno_to_ext+0xd8/0x191 [xfs] [] kmem_zone_zalloc+0x1d/0x41 [xfs] [] xfs_bmapi+0x15fe/0x2016 [xfs] [] xfs_iext_bno_to_ext+0x48/0x191 [xfs] [] xfs_bmap_search_multi_extents+0x8a/0xc5 [xfs] [] xfs_iomap_write_allocate+0x29c/0x469 [xfs] [] lock_timer_base+0x15/0x2f [] del_timer+0x41/0x47 [] xfs_iomap+0x409/0x71d [xfs] [] xfs_map_blocks+0x29/0x52 [xfs] [] xfs_page_state_convert+0x37b/0xd2e [xfs] [] xfs_bmap_add_extent+0x1dcf/0x1e30 [xfs] [] xfs_bmap_search_multi_extents+0x8a/0xc5 [xfs] [] xfs_bmapi+0x272/0x2016 [xfs] [] xfs_bmapi+0x1853/0x2016 [xfs] [] find_get_pages_tag+0x30/0x75 [] xfs_vm_writepage+0x8f/0xc2 [xfs] [] mpage_writepages+0x1a7/0x310 [] xfs_vm_writepage+0x0/0xc2 [xfs] [] do_writepages+0x20/0x32 [] __writeback_single_inode+0x170/0x2af [] write_inode_now+0x66/0xa7 [] file_fsync+0xf/0x6c [] moddw_ioctl+0x420/0x669 [mod_dw] [] __cond_resched+0x16/0x34 [] do_ioctl+0x47/0x5d [] vfs_ioctl+0x47b/0x4d3 [] sys_ioctl+0x48/0x5f [] sysenter_past_esp+0x56/0x79 Thanks, sorry for the confusion.... Eric Sandeen-3 wrote: > > On 12/8/10 6:59 PM, Dave Chinner wrote: >> On Wed, Dec 08, 2010 at 01:39:10AM -0800, blacknred wrote: >>> >>> >>>> You've done a forced module load. No guarantee your kernel is in any >>>> sane shape if you've done that.... >>> >>> Agree, but I'm reasonably convinced that module isn't the issue, because >>> it >>> works fine with my other servers...... >>> >>>> Strange failure. Hmmm - i386 arch and fedora - are you running with >>> 4k stacks? If so, maybe it blew the stack... >>> >>> i386 arch, rhel 5.0 >> >> Yup, 4k stacks. This is definitely smelling like a stack blowout. > > well, hang on. The oops said: > > EIP: 0060:[] Tainted: GF VLI > EFLAGS: 00010272 (2.6.33.3-85.fc13.x86_64 #1) > EIP is at do_page_fault+0x245/0x617 > eax: ec5ee000 ebx: 00000000 ecx: eb5de084 edx: 0000000e > esi: 00013103 edi: ec5de0b3 ebp: 00000023 esp: ec5de024 > ds: 008b es: 008b ss: 0078 > > which is NOT a rhel 5.0 kernel, and it says x86_64. > > But the addresses are all 32 bits? > > So what's going on here? > >> esi: 00013103 edi: ec5de0b3 ebp: 00000023 esp: ec5de024 >> ds: 008b es: 008b ss: 0078 >> Process bm (pid: 3210, ti=ec622000 task=ec5e3450 task.ti=ec6ee000) > > end of the stack is ec6ee000, stack grows up, esp is at ec5de024, > well past it (i.e. yes, overrun) if I remember my stack math > right... but that's a pretty huge difference so either I have it > wrong, or things are really a huge mess here. > > -Eric > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > > -- View this message in context: http://old.nabble.com/kernel-panic-xfs-errors-tp30397503p30416394.html Sent from the Xfs - General mailing list archive at Nabble.com. From lists@nabble.com Thu Dec 9 07:21:47 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB9DLlmc001433 for ; Thu, 9 Dec 2010 07:21:47 -0600 X-ASG-Debug-ID: 1291901015-5fa103620000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from kuber.nabble.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E9A791E974D8 for ; Thu, 9 Dec 2010 05:23:35 -0800 (PST) Received: from kuber.nabble.com (kuber.nabble.com [216.139.236.158]) by cuda.sgi.com with ESMTP id 7CXP3s18Os9H1E4U for ; Thu, 09 Dec 2010 05:23:35 -0800 (PST) Received: from isper.nabble.com ([192.168.236.156]) by kuber.nabble.com with esmtp (Exim 4.63) (envelope-from ) id 1PQgT9-0003nW-1s for xfs@oss.sgi.com; Thu, 09 Dec 2010 05:23:35 -0800 Message-ID: <30416451.post@talk.nabble.com> Date: Thu, 9 Dec 2010 05:23:35 -0800 (PST) From: blacknred To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: kernel panic-xfs errors Subject: Re: kernel panic-xfs errors In-Reply-To: <20101209005944.GD32766@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Nabble-From: leo1783@hotmail.co.uk References: <30397503.post@talk.nabble.com> <20101207222558.GC29333@dastard> <30403823.post@talk.nabble.com> <20101209005944.GD32766@dastard> X-Barracuda-Connect: kuber.nabble.com[216.139.236.158] X-Barracuda-Start-Time: 1291901015 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48926 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean >Is the version 7.x firmware certified with such an old kernel? Yes, it is... It hung again today and dmesg said XFS: bad magic number XFS: SB validate failed But when I do dd if=/dev/cciss/c0d0 bs=512 count=1 |od -c I get below which suggests its a valid XFS superblock magic number as per your reply, correct? I couldn't unmount the partition to do a xfs_repair -n 1+0 records in 1+0 records out 0000000 X F S B \0 \0 020 \0 \0 \0 \0 \0 + 251 262 ^ 512 bytes (512 B) copied0000020 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 0000040 354 B \b 277 ) 376 @ 333 267 232 304 326 * L 344 322 0000060 \0 \0 \0 \0 \0 \0 @ \0 \0 \0 \0 \0 \0 \0 200 0000100 \0 \0 \0 \0 \0 \0 \0 201 \0 \0 \0 \0 \0 \0 \0 202 0000120 \0 \0 \0 001 \n 352 l 300 \0 \0 \0 004 \0 \0 \0 \0 , 0.000190895 seconds, 2.7 MB/s 0000140 \0 \0 200 \0 265 244 002 \0 \b \0 \0 002 \0 \0 \0 \0 0000160 \0 \0 \0 \0 \0 \0 \0 \0 \b \t \v 001 034 \0 \0 005 0000200 \0 \0 \0 \0 \0 \0 \v \0 \0 \0 \0 \0 \0 \0 \t . 0000220 \0 \0 \0 \0 030 243 275 267 \0 \0 \0 \0 \0 \0 \0 \0 0000240 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 0000260 \0 \0 \0 \0 \0 \0 \0 002 \0 \0 \0 @ \0 \0 001 \0 0000300 \0 \0 \0 \0 \0 004 \0 \0 \0 \0 \0 \b \0 \0 \0 \b 0000320 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 * 0001000 Dave Chinner wrote: > > On Wed, Dec 08, 2010 at 01:39:10AM -0800, blacknred wrote: >> >> >> >You've done a forced module load. No guarantee your kernel is in any >> >sane shape if you've done that.... >> >> Agree, but I'm reasonably convinced that module isn't the issue, because >> it >> works fine with my other servers...... >> >> >Strange failure. Hmmm - i386 arch and fedora - are you running with >> 4k stacks? If so, maybe it blew the stack... >> >> i386 arch, rhel 5.0 > > Yup, 4k stacks. This is definitely smelling like a stack blowout. > > XFS on 4k stacks is a ticking timebomb - it will explode and you've > got no idea of when it will go boom. Recompile your kernel with 8k > stacks or move to x86_64. > >> ># dd if= bs=512 count=1 | od -c >> This is what i get now, but now server's been rebooted and running OK, >> what >> should i be expecting or rather what are we looking for in this output at >> point of failure? > > Well, what you see here: > >> 0000000 X F S B \0 \0 020 \0 \0 \0 \0 \0 025 324 304 \0 > ^^^^^^^^^^^^^ > Is a valid XFS superblock magic number. > > If you are getting this error: > >> >> XFS: bad magic number >> >> XFS: SB validate failed > > Then I'd expect to see anything other than "XFSB" as the magic > number. Of course, if you smashed the stack during mount, then there > will most likely be nothing wrong with the value on disk... > >> >why did I flash the controller >> I was on 5.22 fw version which has a known 'lockup' issue which is fixed >> in >> 7.x ver. >> This is a critical fix. > > Is the version 7.x firmware certified with such an old kernel? It's > not uncommon for different firmware versions to only be supported on > specific releases/kernel versions. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > > -- View this message in context: http://old.nabble.com/kernel-panic-xfs-errors-tp30397503p30416451.html Sent from the Xfs - General mailing list archive at Nabble.com. From branto@redhat.com Thu Dec 9 07:39:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB9Dd046008000 for ; Thu, 9 Dec 2010 07:39:01 -0600 X-ASG-Debug-ID: 1291902049-5fa803c70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2575E1E97855 for ; Thu, 9 Dec 2010 05:40:49 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id doEind54yKDS33GZ for ; Thu, 09 Dec 2010 05:40:49 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation 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.13.8/8.13.8) with ESMTP id oB9DemXI027963 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 9 Dec 2010 08:40:49 -0500 Received: from [10.34.26.208] (dhcp-26-208.brq.redhat.com [10.34.26.208]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id oB9DelMI016524 for ; Thu, 9 Dec 2010 08:40:48 -0500 X-ASG-Orig-Subj: Re: xfstests: ignore absolute address in filename in test case 237 Subject: Re: xfstests: ignore absolute address in filename in test case 237 From: Boris Ranto To: xfs@oss.sgi.com In-Reply-To: <1291899944.3196.11.camel@dhcp-31-190.brq.redhat.com> References: <1291899944.3196.11.camel@dhcp-31-190.brq.redhat.com> Content-Type: text/plain; charset="UTF-8" Date: Thu, 09 Dec 2010 14:40:47 +0100 Message-ID: <1291902047.3196.26.camel@dhcp-31-190.brq.redhat.com> Mime-Version: 1.0 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: 1291902050 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, 2010-12-09 at 14:05 +0100, Boris Ranto wrote: > Test case 237 checks for setfacl output. The setfacl can use both > relative address or absolute address for filename. > > Following patch ignores the unnecessary part of absolute address and > therefore the test case can pass on systems that output absolute > address: > > diff -urpN a/xfstests/237 b/xfstests/237 > --- a/xfstests/237 2010-12-09 11:24:48.587432718 +0100 > +++ b/xfstests/237 2010-12-09 13:46:29.008245581 +0100 > @@ -72,7 +72,7 @@ touch file1 > chown $acl1.$acl1 file1 > > echo "Expect to FAIL" > -$runas -u $acl2 -g $acl2 -- `which setfacl` -m u::rwx file1 2>&1 > +$runas -u $acl2 -g $acl2 -- `which setfacl` -m u::rwx file1 2>&1 | sed 's/^setfacl: \/.*file1: Operation not permitted$/setfacl: file1: Operation not permitted/' > > echo "Test over." > # success, all done > > Signed-off-by: Boris Ranto I noticed that text is usually filtered in a little different way therefore I'd rather suggest the following patch: diff -urpN a/xfstests/237 b/xfstests/237 --- a/xfstests/237 2010-12-09 11:24:48.587432718 +0100 +++ b/xfstests/237 2010-12-09 14:24:09.463402051 +0100 @@ -47,6 +47,11 @@ _cleanup() _cleanup_testdir } +# Allow absolute path in setfacl output +_filter_absolute_path() +{ + sed 's/^setfacl: \/.*file1: Operation not permitted$/setfacl: file1: Operation not permitted/' +} # real QA test starts here _supported_fs generic # only Linux supports fallocate @@ -72,7 +77,7 @@ touch file1 chown $acl1.$acl1 file1 echo "Expect to FAIL" -$runas -u $acl2 -g $acl2 -- `which setfacl` -m u::rwx file1 2>&1 +$runas -u $acl2 -g $acl2 -- `which setfacl` -m u::rwx file1 2>&1 | _filter_absolute_path echo "Test over." # success, all done From branto@redhat.com Thu Dec 9 08:38:26 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_34 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB9EcPXu017339 for ; Thu, 9 Dec 2010 08:38:26 -0600 X-ASG-Debug-ID: 1291905614-610001ad0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5E3CC1D8A10 for ; Thu, 9 Dec 2010 06:40:14 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id LqB3eRtOQPH79z6f for ; Thu, 09 Dec 2010 06:40:14 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation 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.13.8/8.13.8) with ESMTP id oB9EeEFB015374 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 9 Dec 2010 09:40:14 -0500 Received: from [10.34.26.208] (dhcp-26-208.brq.redhat.com [10.34.26.208]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id oB9EeDLZ008302 for ; Thu, 9 Dec 2010 09:40:13 -0500 X-ASG-Orig-Subj: xfstests: fix 108 through config mechanism Subject: xfstests: fix 108 through config mechanism From: Boris Ranto To: xfs@oss.sgi.com Content-Type: text/plain; charset="UTF-8" Date: Thu, 09 Dec 2010 15:40:12 +0100 Message-ID: <1291905612.3196.49.camel@dhcp-31-190.brq.redhat.com> 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: 1291905615 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Test case 108 can fail beacuse of the incorrect amount of spaces in its output. This can be overrided by passing -b option to diff (quotation of man page): -b --ignore-space-change Ignore changes in the amount of white space. Since there is currently no mechanism to pass any option to diff I suggest following mechanism: Every test can have its config file ($sef.config) where all its test-run configuration can be stored. Also it should contain variable CONFIG_OPTIONS that specifies what options are created/modified. The check script'll only source the config file if it exists and unset all the modified variables that are listed in CONFIG_OPTIONS variable once they're not needed. This configuration mechanism could (with additional patch to the file check) also help handle multiple output files that might be beneficial in few test cases. Patch that fixes test case 108 and adds described mechanism of test configuration: diff -urpN a/xfstests/108.config b/xfstests/108.config --- a/xfstests/108.config 1970-01-01 01:00:00.000000000 +0100 +++ b/xfstests/108.config 2010-12-09 11:24:51.626367533 +0100 @@ -0,0 +1,2 @@ +export CONFIG_OPTIONS="DIFF_OPTIONS CONFIG_OPTIONS" +export DIFF_OPTIONS="-b" diff -urpN a/xfstests/check b/xfstests/check --- a/xfstests/check 2010-12-09 11:34:26.709247611 +0100 +++ b/xfstests/check 2010-12-09 11:37:13.857370558 +0100 @@ -226,6 +226,11 @@ do else # really going to try and run this one # + CONFIG_OPTIONS="CONFIG_OPTIONS" + if [ -f $seq.config ] + then + source $seq.config + fi rm -f $seq.out.bad lasttime=`sed -n -e "/^$seq /s/.* //p" /dev/null 2>&1 + if diff $DIFF_OPTIONS $seq.out $tmp.out >/dev/null 2>&1 then if $err then @@ -286,12 +291,12 @@ do else echo " - output mismatch (see $seq.out.bad)" mv $tmp.out $seq.out.bad - $diff $seq.out $seq.out.bad + $diff $DIFF_OPTIONS $seq.out $seq.out.bad err=true fi fi fi - + unset $CONFIG_OPTIONS fi # come here for each test, except when $showme is true Signed-off-by: Boris Ranto From sandeen@sandeen.net Thu Dec 9 08:55:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_42 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB9Et1RR020314 for ; Thu, 9 Dec 2010 08:55:03 -0600 X-ASG-Debug-ID: 1291906609-6ac603010000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 56E221E97C4F for ; Thu, 9 Dec 2010 06:56:49 -0800 (PST) Received: from mail.sandeen.net (64-131-28-21.usfamily.net [64.131.28.21]) by cuda.sgi.com with ESMTP id q0SbsOPDLLkNEB4r for ; Thu, 09 Dec 2010 06:56:49 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id D4DB44817CFA; Thu, 9 Dec 2010 08:56:48 -0600 (CST) Message-ID: <4D00EE30.2000408@sandeen.net> Date: Thu, 09 Dec 2010 08:56:48 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.12) Gecko/20101027 Thunderbird/3.1.6 MIME-Version: 1.0 To: blacknred CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: kernel panic-xfs errors Subject: Re: kernel panic-xfs errors References: <30397503.post@talk.nabble.com> <20101207222558.GC29333@dastard> <30403823.post@talk.nabble.com> <20101209005944.GD32766@dastard> <4D005E99.2030400@sandeen.net> <30416394.post@talk.nabble.com> In-Reply-To: <30416394.post@talk.nabble.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-28-21.usfamily.net[64.131.28.21] X-Barracuda-Start-Time: 1291906610 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_SA210e, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48932 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.00 BSF_SC5_SA210e Custom Rule SA210e X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 12/9/10 7:17 AM, blacknred wrote: > >> which is NOT a rhel 5.0 kernel, and it says x86_64. >> But the addresses are all 32 bits? > > My apologies there, somehow it all got jumbled up, pasting it again: > > BUG: unable to handle kernel NULL pointer dereference at virtual address > 00000098 > printing eip: > *pde = 2c621001 > Oops: 0000 [#1] > SMP > CPU: 2 > EIP: 0060:[] Tainted: GF VLI > EFLAGS: 00010282 (2.6.18-164.11.1.el5PAE #1) > EIP is at do_page_fault+0x205/0x607 > eax: ec6de000 ebx: 00000000 ecx: ec6de074 edx: 0000000d > esi: 00014005 edi: ec6de0a4 ebp: 00000014 esp: ec6de054 > ds: 007b es: 007b ss: 0068 > Process bm (pid: 2910, ti=ec6dd000 task=ec6e3550 task.ti=ec6dd000) > Stack: 00000000 00000000 ec6de0a4 00000014 00000098 f7180000 00000001 > 00000000 > ec6de0a4 c0639439 00000000 0000000e 0000000b 00000000 00000000 > 00000000 > 00014005 c0619b9c 00000014 c0405a89 00000000 ec6de0f8 0000000d > 00014005 ok, same task.ti and esp though, so same massive stack overflow. Is this really RHEL, or CentOS? RHEL doesn't ship xfs for i386, and using the xfs-kmod is a very unsupported/unmaintained solution. If it is "real RHEL" you could try requesting actual i386 support, but these stack issues are one of the reasons it's unlikely. CentOS would do well to ship the same xfs code as is in the x86_64 kernel and drop the kmod-xfs altogether. Some stack issues have been resolved since then, but probably not as much as we see here. I also am suspicious of whatever "moddw_ioctl" is in mod_dw; I assume that's the proprietary kernel module. It may have a really bad stack footprint, although the callchain below looks bad enough. What does: # objdump -d /path/to/mod_dw.ko | grep -A30 ":" | grep sub say? -Eric From john@stoffel.org Thu Dec 9 09:04:25 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB9F4PR0022071 for ; Thu, 9 Dec 2010 09:04:25 -0600 X-ASG-Debug-ID: 1291907172-64ae02530000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mycroft.westnet.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DA9031D8BD5; Thu, 9 Dec 2010 07:06:12 -0800 (PST) Received: from mycroft.westnet.com (Mycroft.westnet.com [216.187.52.7]) by cuda.sgi.com with ESMTP id X7cj7RLCOjsrRgTN; Thu, 09 Dec 2010 07:06:12 -0800 (PST) Received: from jfsnew.stoffel.org (97-95-180-151.dhcp.oxfr.ma.charter.com [97.95.180.151]) (authenticated bits=0) by mycroft.westnet.com (8.14.4/8.14.4) with ESMTP id oB9F5Dxn022512 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 9 Dec 2010 10:05:14 -0500 (EST) Received: by jfsnew.stoffel.org (Postfix, from userid 1000) id 5EA90A073D; Thu, 9 Dec 2010 10:05:47 -0500 (EST) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <19712.61515.201226.938553@quad.stoffel.home> Date: Thu, 9 Dec 2010 10:05:47 -0500 From: "John Stoffel" To: Eric Paris Cc: xfs-masters@oss.sgi.com, linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, cluster-devel@redhat.com, linux-mtd@lists.infradead.org, jfs-discussion@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, xfs@oss.sgi.com, linux-mm@kvack.org, linux-security-module@vger.kernel.org, chris.mason@oracle.com, jack@suse.cz, akpm@linux-foundation.org, adilger.kernel@dilger.ca, tytso@mit.edu, swhiteho@redhat.com, dwmw2@infradead.org, shaggy@linux.vnet.ibm.com, mfasheh@suse.com, joel.becker@oracle.com, aelder@sgi.com, hughd@google.com, jmorris@namei.org, sds@tycho.nsa.gov, eparis@parisplace.org, hch@lst.de, dchinner@redhat.com, viro@zeniv.linux.org.uk, tao.ma@oracle.com, shemminger@vyatta.com, jeffm@suse.com, serue@us.ibm.com, paul.moore@hp.com, penguin-kernel@I-love.SAKURA.ne.jp, casey@schaufler-ca.com, kees.cook@canonical.com, dhowells@redhat.com X-ASG-Orig-Subj: Re: [PATCH] fs/vfs/security: pass last path component to LSM on inode creation Subject: Re: [PATCH] fs/vfs/security: pass last path component to LSM on inode creation In-Reply-To: <20101208194527.13537.77202.stgit@paris.rdu.redhat.com> References: <20101208194527.13537.77202.stgit@paris.rdu.redhat.com> X-Mailer: VM 8.1.1 under 23.2.1 (x86_64-pc-linux-gnu) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: clamav-milter 0.96.5 at mycroft X-Virus-Status: Clean X-Barracuda-Connect: Mycroft.westnet.com[216.187.52.7] X-Barracuda-Start-Time: 1291907173 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48932 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- >>>>> "Eric" == Eric Paris writes: Eric> SELinux would like to implement a new labeling behavior of newly Eric> created inodes. We currently label new inodes based on the Eric> parent and the creating process. This new behavior would also Eric> take into account the name of the new object when deciding the Eric> new label. This is not the (supposed) full path, just the last Eric> component of the path. Eric> This is very useful because creating /etc/shadow is different Eric> than creating /etc/passwd but the kernel hooks are unable to Eric> differentiate these operations. We currently require that Eric> userspace realize it is doing some difficult operation like that Eric> and than userspace jumps through SELinux hoops to get things set Eric> up correctly. This patch does not implement new behavior, that Eric> is obviously contained in a seperate SELinux patch, but it does Eric> pass the needed name down to the correct LSM hook. If no such Eric> name exists it is fine to pass NULL. I've looked this patch over, and maybe I'm missing something, but how does knowing the name of the file really tell you anything, esp when you only get the filename, not the path? What threat are you addressing with this change? So what happens when I create a file /home/john/shadow, does selinux (or LSM in general) then run extra checks because the filename is 'shadow' in your model? I *think* the overhead shouldn't be there if SELINUX is disabled, but have you confirmed this? How you run performance tests before/after this change when doing lots of creations of inodes to see what sort of performance changes might be there? Thanks, John From yad.naveen@gmail.com Thu Dec 9 09:30:29 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB9FUTnH026129 for ; Thu, 9 Dec 2010 09:30:29 -0600 X-ASG-Debug-ID: 1291908737-239602170000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-vw0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 52C5C1435C5F for ; Thu, 9 Dec 2010 07:32:17 -0800 (PST) Received: from mail-vw0-f53.google.com (mail-vw0-f53.google.com [209.85.212.53]) by cuda.sgi.com with ESMTP id fWaDZ5Q7aCWz3IPL for ; Thu, 09 Dec 2010 07:32:17 -0800 (PST) Received: by vws8 with SMTP id 8so1723779vws.26 for ; Thu, 09 Dec 2010 07:32:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:date:message-id :subject:from:to:content-type; bh=kc0vkT6SAqI5zUUcidzQwdq4GtCatsuUKBMZ97Krq18=; b=Il8D8135kn2m3ux+uJFonJCjTd9HawYAJRY4Scv1+LNRbpWk6tpJNrCngSSZNKHg65 0ho2tRN3vgcCvw2KDo6GQPyD6wMcquUkvA/49Mhx8VwdtKSZdTqbOzjCHsFEAl+qcmSh fgTAX+7VuPG+mfkqyf47kl7L+Yw1TOWYahp2I= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=Fpi7tlVX0EsMdivCm7UWpqTfnIudnPX6DcjUGMolBY2y5RO9BxduuUWSl7K/s8seRt 4FSmNMo+TN7ZxvO5X/8CivSfICGvjmqsrSdMEFRwtVjkD/Og8xDJ1hOZmiy9PXr3wTmX ZKCAO+kh8MFuvfuxuvaZPTT9Q5t+M70YsBdfo= MIME-Version: 1.0 Received: by 10.229.246.83 with SMTP id lx19mr3179304qcb.210.1291908736123; Thu, 09 Dec 2010 07:32:16 -0800 (PST) Received: by 10.229.75.13 with HTTP; Thu, 9 Dec 2010 07:32:15 -0800 (PST) Date: Thu, 9 Dec 2010 21:02:15 +0530 Message-ID: X-ASG-Orig-Subj: XFS Testsuite Subject: XFS Testsuite From: naveen yadav To: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-vw0-f53.google.com[209.85.212.53] X-Barracuda-Start-Time: 1291908738 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2213 1.0000 -0.7176 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.72 X-Barracuda-Spam-Status: No, SCORE=-0.72 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48933 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi all, I want to setup XFS testsuite for my embedded ARM Target, Is it possible ? If any body have already done, Please help me. I am trying but there are lots of constrain and problem Thanks From eparis@redhat.com Thu Dec 9 09:52:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB9FqpMs029997 for ; Thu, 9 Dec 2010 09:52:51 -0600 X-ASG-Debug-ID: 1291910079-17da03a50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 73DFA14343F3; Thu, 9 Dec 2010 07:54:39 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id oPNSgEVerTZ5EQgE; Thu, 09 Dec 2010 07:54:39 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation 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.13.8/8.13.8) with ESMTP id oB9FqVs9030130 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 9 Dec 2010 10:52:31 -0500 Received: from [10.11.231.139] (dhcp231-139.rdu.redhat.com [10.11.231.139]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id oB9FqMN9030453; Thu, 9 Dec 2010 10:52:22 -0500 X-ASG-Orig-Subj: Re: [PATCH] fs/vfs/security: pass last path component to LSM on inode creation Subject: Re: [PATCH] fs/vfs/security: pass last path component to LSM on inode creation From: Eric Paris To: John Stoffel Cc: xfs-masters@oss.sgi.com, linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, cluster-devel@redhat.com, linux-mtd@lists.infradead.org, jfs-discussion@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, xfs@oss.sgi.com, linux-mm@kvack.org, linux-security-module@vger.kernel.org, chris.mason@oracle.com, jack@suse.cz, akpm@linux-foundation.org, adilger.kernel@dilger.ca, tytso@mit.edu, swhiteho@redhat.com, dwmw2@infradead.org, shaggy@linux.vnet.ibm.com, mfasheh@suse.com, joel.becker@oracle.com, aelder@sgi.com, hughd@google.com, jmorris@namei.org, sds@tycho.nsa.gov, eparis@parisplace.org, hch@lst.de, dchinner@redhat.com, viro@zeniv.linux.org.uk, tao.ma@oracle.com, shemminger@vyatta.com, jeffm@suse.com, paul.moore@hp.com, penguin-kernel@I-love.SAKURA.ne.jp, casey@schaufler-ca.com, kees.cook@canonical.com, dhowells@redhat.com In-Reply-To: <19712.61515.201226.938553@quad.stoffel.home> References: <20101208194527.13537.77202.stgit@paris.rdu.redhat.com> <19712.61515.201226.938553@quad.stoffel.home> Content-Type: text/plain; charset="UTF-8" Date: Thu, 09 Dec 2010 10:52:21 -0500 Message-ID: <1291909941.3072.70.camel@localhost.localdomain> Mime-Version: 1.0 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: 1291910080 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, 2010-12-09 at 10:05 -0500, John Stoffel wrote: > >>>>> "Eric" == Eric Paris writes: > So what happens when I create a file /home/john/shadow, does selinux > (or LSM in general) then run extra checks because the filename is > 'shadow' in your model? It's entirely a question of labeling and one that was discussed on the LSM list in some detail: http://marc.info/?t=129141308200002&r=1&w=2 The basic synopsis is that when a new inode is created SELinux must apply some label. It makes the decision for what label to apply based on 3 pieces of information. The label of the parent inode. The label of the process creating the new inode. The 'class' of the inode, S_ISREG, S_ISDIR, S_ISLNK, etc This patch adds a 4th piece of information, the name of the object being created. An obvious situation where this will be useful is devtmpfs (although you'll find other examples in the above thread). devtmpfs when it creates char/block devices is unable to distinguish between kmem and console and so they are created with a generic label. hotplug/udev is then called which does some pathname like matching and relabels them to something more specific. We've found that many people are able to race against this particular updating and get spurious denials in /dev. With this patch devtmpfs will be able to get the labels correct to begin with. I'm certainly willing to discuss the security implications of this patch, but that would probably be best done with a significantly shortened cc-list. You'll see in the above mentioned thread that a number of 'security' people (even those who are staunchly anti-SELinux) recognize there is value in this and that it is certainly much better than we have today. > I *think* the overhead shouldn't be there if SELINUX is disabled, but > have you confirmed this? How you run performance tests before/after > this change when doing lots of creations of inodes to see what sort of > performance changes might be there? I've actually recently done some perf testing on creating large numbers of inodes using bonnie++, since SELinux was a noticeable overhead in that operation. Doing that same test with SELinux disabled (or enabled) I do not see a noticeable difference when this patch is applied or not. It's just an extra argument to a function that goes unused. -Eric From serge.hallyn@canonical.com Thu Dec 9 10:04:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB9G4Wap032174 for ; Thu, 9 Dec 2010 10:04:32 -0600 X-ASG-Debug-ID: 1291910780-4f0f004f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from adelie.canonical.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 168E51D8F0E; Thu, 9 Dec 2010 08:06:20 -0800 (PST) Received: from adelie.canonical.com (adelie.canonical.com [91.189.90.139]) by cuda.sgi.com with ESMTP id orYmieJYxgitvNBy; Thu, 09 Dec 2010 08:06:20 -0800 (PST) Received: from hutte.canonical.com ([91.189.90.181]) by adelie.canonical.com with esmtp (Exim 4.69 #1 (Debian)) id 1PQj0K-0003ei-O3; Thu, 09 Dec 2010 16:06:02 +0000 Received: from [64.202.139.114] (helo=peq) by hutte.canonical.com with esmtpsa (TLS-1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.69) (envelope-from ) id 1PQj0J-0006Ab-KJ; Thu, 09 Dec 2010 16:06:00 +0000 Date: Thu, 9 Dec 2010 10:05:49 -0600 From: Serge Hallyn To: John Stoffel Cc: Eric Paris , xfs-masters@oss.sgi.com, linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, cluster-devel@redhat.com, linux-mtd@lists.infradead.org, jfs-discussion@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, xfs@oss.sgi.com, linux-mm@kvack.org, linux-security-module@vger.kernel.org, chris.mason@oracle.com, jack@suse.cz, akpm@linux-foundation.org, adilger.kernel@dilger.ca, tytso@mit.edu, swhiteho@redhat.com, dwmw2@infradead.org, shaggy@linux.vnet.ibm.com, mfasheh@suse.com, joel.becker@oracle.com, aelder@sgi.com, hughd@google.com, jmorris@namei.org, sds@tycho.nsa.gov, eparis@parisplace.org, hch@lst.de, dchinner@redhat.com, viro@zeniv.linux.org.uk, tao.ma@oracle.com, shemminger@vyatta.com, jeffm@suse.com, serue@us.ibm.com, paul.moore@hp.com, penguin-kernel@I-love.SAKURA.ne.jp, casey@schaufler-ca.com, kees.cook@canonical.com, dhowells@redhat.com X-ASG-Orig-Subj: Re: [PATCH] fs/vfs/security: pass last path component to LSM on inode creation Subject: Re: [PATCH] fs/vfs/security: pass last path component to LSM on inode creation Message-ID: <20101209160549.GA2315@peq> References: <20101208194527.13537.77202.stgit@paris.rdu.redhat.com> <19712.61515.201226.938553@quad.stoffel.home> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <19712.61515.201226.938553@quad.stoffel.home> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: adelie.canonical.com[91.189.90.139] X-Barracuda-Start-Time: 1291910781 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48936 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Quoting John Stoffel (john@stoffel.org): > >>>>> "Eric" == Eric Paris writes: > > Eric> SELinux would like to implement a new labeling behavior of newly > Eric> created inodes. We currently label new inodes based on the > Eric> parent and the creating process. This new behavior would also > Eric> take into account the name of the new object when deciding the > Eric> new label. This is not the (supposed) full path, just the last > Eric> component of the path. > > Eric> This is very useful because creating /etc/shadow is different > Eric> than creating /etc/passwd but the kernel hooks are unable to > Eric> differentiate these operations. We currently require that > Eric> userspace realize it is doing some difficult operation like that > Eric> and than userspace jumps through SELinux hoops to get things set > Eric> up correctly. This patch does not implement new behavior, that > Eric> is obviously contained in a seperate SELinux patch, but it does > Eric> pass the needed name down to the correct LSM hook. If no such > Eric> name exists it is fine to pass NULL. > > I've looked this patch over, and maybe I'm missing something, but how > does knowing the name of the file really tell you anything, esp when > you only get the filename, not the path? What threat are you > addressing with this change? Like you, I keep thinking back to this patch and going back and forth. But to answer your question: in some cases, the name of the file (plus the context of the directory in which it is created) can tell you what assumptions userspace will make about it. And userspace most definately is a part of the TCB, i.e. /bin/passwd and /bin/login. -serge From sandeen@sandeen.net Thu Dec 9 11:46:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB9HkT6B047431 for ; Thu, 9 Dec 2010 11:46:30 -0600 X-ASG-Debug-ID: 1291916897-37af011c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A1BFB1436751 for ; Thu, 9 Dec 2010 09:48:17 -0800 (PST) Received: from mail.sandeen.net (64-131-28-21.usfamily.net [64.131.28.21]) by cuda.sgi.com with ESMTP id 4aMMzKCZLFqLJCFS for ; Thu, 09 Dec 2010 09:48:17 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 067C848E8B05; Thu, 9 Dec 2010 11:48:17 -0600 (CST) Message-ID: <4D011660.200@sandeen.net> Date: Thu, 09 Dec 2010 11:48:16 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.12) Gecko/20101027 Thunderbird/3.1.6 MIME-Version: 1.0 To: naveen yadav CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS Testsuite Subject: Re: XFS Testsuite References: In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-28-21.usfamily.net[64.131.28.21] X-Barracuda-Start-Time: 1291916898 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0209 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48943 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 12/9/10 9:32 AM, naveen yadav wrote: > Hi all, > > I want to setup XFS testsuite for my embedded ARM Target, Is it possible ? > If any body have already done, Please help me. I am trying but there > are lots of constrain and problem It certainly is possible, and a very good idea - what problems have you encountered? I assume you've started with the README instructions? -Eric > Thanks > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From john@stoffel.org Thu Dec 9 11:46:56 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB9HkuGE047533 for ; Thu, 9 Dec 2010 11:46:56 -0600 X-ASG-Debug-ID: 1291916925-2a6c006b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mycroft.westnet.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0440C1D9DF8; Thu, 9 Dec 2010 09:48:45 -0800 (PST) Received: from mycroft.westnet.com (Mycroft.westnet.com [216.187.52.7]) by cuda.sgi.com with ESMTP id nZsGgoIhxfISrETN; Thu, 09 Dec 2010 09:48:45 -0800 (PST) Received: from jfsnew.stoffel.org (97-95-180-151.dhcp.oxfr.ma.charter.com [97.95.180.151]) (authenticated bits=0) by mycroft.westnet.com (8.14.4/8.14.4) with ESMTP id oB9HlruS002884 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 9 Dec 2010 12:47:53 -0500 (EST) Received: by jfsnew.stoffel.org (Postfix, from userid 1000) id D3637A073F; Thu, 9 Dec 2010 12:48:26 -0500 (EST) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <19713.5738.653711.301814@quad.stoffel.home> Date: Thu, 9 Dec 2010 12:48:26 -0500 From: "John Stoffel" To: Eric Paris Cc: John Stoffel , xfs-masters@oss.sgi.com, linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, cluster-devel@redhat.com, linux-mtd@lists.infradead.org, jfs-discussion@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, xfs@oss.sgi.com, linux-mm@kvack.org, linux-security-module@vger.kernel.org, chris.mason@oracle.com, jack@suse.cz, akpm@linux-foundation.org, adilger.kernel@dilger.ca, tytso@mit.edu, swhiteho@redhat.com, dwmw2@infradead.org, shaggy@linux.vnet.ibm.com, mfasheh@suse.com, joel.becker@oracle.com, aelder@sgi.com, hughd@google.com, jmorris@namei.org, sds@tycho.nsa.gov, eparis@parisplace.org, hch@lst.de, dchinner@redhat.com, viro@zeniv.linux.org.uk, tao.ma@oracle.com, shemminger@vyatta.com, jeffm@suse.com, paul.moore@hp.com, penguin-kernel@I-love.SAKURA.ne.jp, casey@schaufler-ca.com, kees.cook@canonical.com, dhowells@redhat.com X-ASG-Orig-Subj: Re: [PATCH] fs/vfs/security: pass last path component to LSM on inode creation Subject: Re: [PATCH] fs/vfs/security: pass last path component to LSM on inode creation In-Reply-To: <1291909941.3072.70.camel@localhost.localdomain> References: <20101208194527.13537.77202.stgit@paris.rdu.redhat.com> <19712.61515.201226.938553@quad.stoffel.home> <1291909941.3072.70.camel@localhost.localdomain> X-Mailer: VM 8.1.1 under 23.2.1 (x86_64-pc-linux-gnu) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: clamav-milter 0.96.5 at mycroft X-Virus-Status: Clean X-Barracuda-Connect: Mycroft.westnet.com[216.187.52.7] X-Barracuda-Start-Time: 1291916926 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-ASG-Whitelist: BODY (http://marc\.info/\?) >>>>> "Eric" == Eric Paris writes: Eric> On Thu, 2010-12-09 at 10:05 -0500, John Stoffel wrote: >> >>>>> "Eric" == Eric Paris writes: >> So what happens when I create a file /home/john/shadow, does selinux >> (or LSM in general) then run extra checks because the filename is >> 'shadow' in your model? Eric> It's entirely a question of labeling and one that was discussed on the Eric> LSM list in some detail: Eric> http://marc.info/?t=129141308200002&r=1&w=2 Thank you for pointing me at this discussion. I'm working my way through it, but so far I'm not seeing any consensus that this is really the proper thing to do. I personally feel this should be in userspace if at all possible. Eric> The basic synopsis is that when a new inode is created SELinux Eric> must apply some label. It makes the decision for what label to Eric> apply based on 3 pieces of information. Eric> The label of the parent inode. Eric> The label of the process creating the new inode. Eric> The 'class' of the inode, S_ISREG, S_ISDIR, S_ISLNK, etc These seem to be ok, if you're using label based security. But since I freely admit I'm not an expert or even a user, I'm just trying to understand and push back to make sure we do what's good. And which doesn't impact non-SElinux users. Eric> This patch adds a 4th piece of information, the name of the Eric> object being created. An obvious situation where this will be Eric> useful is devtmpfs (although you'll find other examples in the Eric> above thread). devtmpfs when it creates char/block devices is Eric> unable to distinguish between kmem and console and so they are Eric> created with a generic label. hotplug/udev is then called which Eric> does some pathname like matching and relabels them to something Eric> more specific. We've found that many people are able to race Eric> against this particular updating and get spurious denials in Eric> /dev. With this patch devtmpfs will be able to get the labels Eric> correct to begin with. So your Label based access controls are *also* based on pathnames? Right? Eric> I'm certainly willing to discuss the security implications of this Eric> patch, but that would probably be best done with a significantly Eric> shortened cc-list. You'll see in the above mentioned thread that a Eric> number of 'security' people (even those who are staunchly anti-SELinux) Eric> recognize there is value in this and that it is certainly much better Eric> than we have today. >> I *think* the overhead shouldn't be there if SELINUX is disabled, but >> have you confirmed this? How you run performance tests before/after >> this change when doing lots of creations of inodes to see what sort of >> performance changes might be there? Eric> I've actually recently done some perf testing on creating large Eric> numbers of inodes using bonnie++, since SELinux was a noticeable Eric> overhead in that operation. Doing that same test with SELinux Eric> disabled (or enabled) I do not see a noticeable difference when Eric> this patch is applied or not. It's just an extra argument to a Eric> function that goes unused. That answers alot of my concerns then. Not having it impact users in a non-SELinux context is vitally important to me. Thanks, John From eparis@redhat.com Thu Dec 9 12:05:54 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB9I5sgW050863 for ; Thu, 9 Dec 2010 12:05:54 -0600 X-ASG-Debug-ID: 1291918062-5b3e01440000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4FA901CAA578; Thu, 9 Dec 2010 10:07:42 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id fkhXafT85bMVo6Dy; Thu, 09 Dec 2010 10:07:42 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation 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.13.8/8.13.8) with ESMTP id oB9I5Ttk031827 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 9 Dec 2010 13:05:29 -0500 Received: from [10.11.231.139] (dhcp231-139.rdu.redhat.com [10.11.231.139]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id oB9I5LfX014858; Thu, 9 Dec 2010 13:05:21 -0500 X-ASG-Orig-Subj: Re: [PATCH] fs/vfs/security: pass last path component to LSM on inode creation Subject: Re: [PATCH] fs/vfs/security: pass last path component to LSM on inode creation From: Eric Paris To: John Stoffel Cc: xfs-masters@oss.sgi.com, linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, cluster-devel@redhat.com, linux-mtd@lists.infradead.org, jfs-discussion@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, xfs@oss.sgi.com, linux-mm@kvack.org, linux-security-module@vger.kernel.org, chris.mason@oracle.com, jack@suse.cz, akpm@linux-foundation.org, adilger.kernel@dilger.ca, tytso@mit.edu, swhiteho@redhat.com, dwmw2@infradead.org, shaggy@linux.vnet.ibm.com, mfasheh@suse.com, joel.becker@oracle.com, aelder@sgi.com, hughd@google.com, jmorris@namei.org, sds@tycho.nsa.gov, eparis@parisplace.org, hch@lst.de, dchinner@redhat.com, viro@zeniv.linux.org.uk, shemminger@vyatta.com, jeffm@suse.com, paul.moore@hp.com, penguin-kernel@I-love.SAKURA.ne.jp, casey@schaufler-ca.com, kees.cook@canonical.com, dhowells@redhat.com In-Reply-To: <19713.5738.653711.301814@quad.stoffel.home> References: <20101208194527.13537.77202.stgit@paris.rdu.redhat.com> <19712.61515.201226.938553@quad.stoffel.home> <1291909941.3072.70.camel@localhost.localdomain> <19713.5738.653711.301814@quad.stoffel.home> Content-Type: text/plain; charset="UTF-8" Date: Thu, 09 Dec 2010 13:05:21 -0500 Message-ID: <1291917921.12683.4.camel@localhost.localdomain> Mime-Version: 1.0 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: 1291918063 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, 2010-12-09 at 12:48 -0500, John Stoffel wrote: > >>>>> "Eric" == Eric Paris writes: > > Eric> On Thu, 2010-12-09 at 10:05 -0500, John Stoffel wrote: > >> >>>>> "Eric" == Eric Paris writes: > > Eric> This patch adds a 4th piece of information, the name of the > Eric> object being created. An obvious situation where this will be > Eric> useful is devtmpfs (although you'll find other examples in the > Eric> above thread). devtmpfs when it creates char/block devices is > Eric> unable to distinguish between kmem and console and so they are > Eric> created with a generic label. hotplug/udev is then called which > Eric> does some pathname like matching and relabels them to something > Eric> more specific. We've found that many people are able to race > Eric> against this particular updating and get spurious denials in > Eric> /dev. With this patch devtmpfs will be able to get the labels > Eric> correct to begin with. > > So your Label based access controls are *also* based on pathnames? > Right? Access decisions are still based solely on the label. This patch can influence how new objects get their label, which makes the access decisions indirectly path based. You'll find a reasonable summary and commentary on lwn in this weeks security section. From aelder@sgi.com Thu Dec 9 15:17:54 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB9LHstr082640 for ; Thu, 9 Dec 2010 15:17:54 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6031D30407A; Thu, 9 Dec 2010 13:19:41 -0800 (PST) Received: from [127.0.0.1] ([198.149.20.12]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 9 Dec 2010 15:19:41 -0600 Subject: Re: [PATCH] xfstests: fix 108 golden output From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: xfs@oss.sgi.com, branto@redhat.com In-Reply-To: <20101110125855.GA18357@infradead.org> References: <20101110125855.GA18357@infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Thu, 09 Dec 2010 15:19:39 -0600 Message-ID: <1291929579.13355.30.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 09 Dec 2010 21:19:41.0215 (UTC) FILETIME=[CAE022F0:01CB97E6] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 2010-11-10 at 07:58 -0500, Christoph Hellwig wrote: > The new common scratch mount filter produces slightly different > whitespaces than the old home grown filter, so adjust the golden > output. > > Signed-off-by: Christoph Hellwig I found out why this is happening. I get no such error, and Dave Chinner said he wasn't seeing it either. xfs_quota is formatting its output such that the second and later columns always align at a certain offset from the beginning of the line. As a result, path names assigned as SCRATCH_DEV of different lengths will produce different (filtered) output, with more or fewer blanks between SCRATCH_DEV and the usage number. Boris Ranto has proposed a change that would add the "-b" flag to diff when checking output against golden output. That should fix it, but it's possible we *want* differences in white space to matter in some cases. Have to look into this. -Alex From Natashal19@terra.com Thu Dec 9 17:37:14 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=2.0 required=5.0 tests=BAYES_50,FREEMAIL_FROM, FREEMAIL_REPLYTO_END_DIGIT autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oB9NbDgP106574 for ; Thu, 9 Dec 2010 17:37:14 -0600 X-ASG-Debug-ID: 1291937940-484c02fc0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from if00-mail-fb03-mia.mta.terra.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 950351437D92 for ; Thu, 9 Dec 2010 15:39:00 -0800 (PST) Received: from if00-mail-fb03-mia.mta.terra.com (if00-mail-fb03-mia.mta.terra.com [208.84.243.137]) by cuda.sgi.com with ESMTP id TcOqWcfJlyMXLhsZ for ; Thu, 09 Dec 2010 15:39:00 -0800 (PST) Received: from midland.terra.com (midland.tpn.terra.com [10.235.200.8]) by mail-fb03-mia.tpn.terra.com (Postfix) with ESMTP id E92A420061948 for ; Thu, 9 Dec 2010 23:38:59 +0000 (UTC) X-Terra-Karma: 0% X-Terra-Hash: 430f18e1c27bb7f65046f499c10b12a6 Received-SPF: pass (midland.terra.com: domain of terra.com designates 208.84.242.62 as permitted sender) client-ip=208.84.242.62; envelope-from=Natashal19@terra.com; helo=192.168.0.61; Received: from 192.168.0.61 (unknown [112.201.180.129]) (authenticated user Natashal19@terra.com) by midland.terra.com (Postfix) with ESMTPA id D0286280000BD for ; Thu, 9 Dec 2010 23:38:58 +0000 (UTC) Date: Thu, 9 Dec 2010 23:39:02 +0000 To: name From: Reply-To: X-ASG-Orig-Subj: I highly recommend this service... Subject: I highly recommend this service... Message-ID: <1670c2cba3c44b78e05d4e07df32fa98@192.168.0.61> X-Priority: 3 X-Mailer: PHPMailer [version 1.72] MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="iso-8859-1" X-CLX-Rate-Response: fi=10.235.200.253:2001; rg=B; GT=0; fs=1011; PS=xfs@oss.sgi.com:0; ns=0; id=a123GLF880yS0VH-B92338x; rv=6379/208.84.242.253:14051; ts=ENw0u; fl=I; ip=112.201.180.129; he=JDa5SbeTwlN; ho=Pk32Ts6EzWt; hd=MiyMN+lL6Vc; hf=BF13h35vIwV; hF=G+4YOwgYe68; hj=GeFvTR2LT0F; hr=BFhjH927n/M; ZB=KbC1t8/GAkc; ZB=Mq0XGtSZ79v; ZB=LVpJV8p3w7q; ZB=BKOXUBnr8ru; ZB=KnxIPk5NlnV; ZU=OiqF3SSFNvb; Zu=GhfXyw5Xp8M; X-Barracuda-Connect: if00-mail-fb03-mia.mta.terra.com[208.84.243.137] X-Barracuda-Start-Time: 1291937941 X-Barracuda-Bayes: INNOCENT GLOBAL 0.6524 1.0000 1.0367 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.04 X-Barracuda-Spam-Status: No, SCORE=1.04 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.48967 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi, Want to earn 10,000 every month, just working part time from home? Go here fast: http://379aday.Co.CC It's a really cool new work at home recruiting service that will help you start working at home. They say it's only available in select city's, for a limited time, so you should hurry. I highly recommend this service. Go here now: http://379aday.Co.CC To your success, Carolyn Griffith P.S.: Don't delay - this could be gone any second now... ...If you are serious about cashing 6 figures per month affiliates cheques you can't miss this out -- go there NOW: => http://379aday.Co.CC 64 Bridgeport Drive Waynesboro VA 22980 Reply *remove* if you wish to be removed in our system From aelder@oss.sgi.com Thu Dec 9 20:10:25 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBA2APsT134279 for ; Thu, 9 Dec 2010 20:10:25 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id oBA2APVN134251; Thu, 9 Dec 2010 20:10:25 -0600 Date: Thu, 9 Dec 2010 20:10:25 -0600 Message-Id: <201012100210.oBA2APVN134251@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v2.6.37-rc4-6-g05340d4 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: c76febef574fd86566bbdf1a73a547a439115c25 X-Git-Newrev: 05340d4ab2ec2b6b4962c1c41c6ea8fb550f947b This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, master has been updated 05340d4 xfs: log timestamp changes to the source inode in rename from c76febef574fd86566bbdf1a73a547a439115c25 (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 05340d4ab2ec2b6b4962c1c41c6ea8fb550f947b Author: Christoph Hellwig Date: Tue Dec 7 10:16:41 2010 +0000 xfs: log timestamp changes to the source inode in rename Now that we don't mark VFS inodes dirty anymore for internal timestamp changes, but rely on the transaction subsystem to push them out, we need to explicitly log the source inode in rename after updating it's timestamps to make sure the changes actually get forced out by sync/fsync or an AIL push. We already account for the fourth inode in the log reservation, as a rename of directories needs to update the nlink field, so just adding the xfs_trans_log_inode call is enough. This fixes the xfsqa 065 regression introduced by: "xfs: don't use vfs writeback for pure metadata modifications" Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Alex Elder ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_rename.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) hooks/post-receive -- XFS development tree From aelder@oss.sgi.com Thu Dec 9 20:10:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBA2AZbe134402 for ; Thu, 9 Dec 2010 20:10:35 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id oBA2AZbT134375; Thu, 9 Dec 2010 20:10:35 -0600 Date: Thu, 9 Dec 2010 20:10:35 -0600 Message-Id: <201012100210.oBA2AZbT134375@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-linus, updated. v2.6.37-rc4-6-g05340d4 X-Git-Refname: refs/heads/for-linus X-Git-Reftype: branch X-Git-Oldrev: c76febef574fd86566bbdf1a73a547a439115c25 X-Git-Newrev: 05340d4ab2ec2b6b4962c1c41c6ea8fb550f947b This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-linus has been updated 05340d4 xfs: log timestamp changes to the source inode in rename from c76febef574fd86566bbdf1a73a547a439115c25 (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 05340d4ab2ec2b6b4962c1c41c6ea8fb550f947b Author: Christoph Hellwig Date: Tue Dec 7 10:16:41 2010 +0000 xfs: log timestamp changes to the source inode in rename Now that we don't mark VFS inodes dirty anymore for internal timestamp changes, but rely on the transaction subsystem to push them out, we need to explicitly log the source inode in rename after updating it's timestamps to make sure the changes actually get forced out by sync/fsync or an AIL push. We already account for the fourth inode in the log reservation, as a rename of directories needs to update the nlink field, so just adding the xfs_trans_log_inode call is enough. This fixes the xfsqa 065 regression introduced by: "xfs: don't use vfs writeback for pure metadata modifications" Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Alex Elder ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_rename.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) hooks/post-receive -- XFS development tree From BATV+870d71e9bf4a5d360c11+2665+infradead.org+hch@bombadil.srs.infradead.org Fri Dec 10 02:41:14 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBA8fE4q205194 for ; Fri, 10 Dec 2010 02:41:14 -0600 X-ASG-Debug-ID: 1291970583-626f03170000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 06144160F98E for ; Fri, 10 Dec 2010 00:43:03 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id beg1NP4dVCRIg084 for ; Fri, 10 Dec 2010 00:43:03 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PQyZD-0006RQ-Be for xfs@oss.sgi.com; Fri, 10 Dec 2010 08:43:03 +0000 Message-Id: <20101210084303.320837611@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Fri, 10 Dec 2010 03:42:24 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 09/10] xfs: refactor xfs_vm_writepage Subject: [PATCH 09/10] xfs: refactor xfs_vm_writepage References: <20101210084215.259628825@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-factor-writepage X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291970584 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean After the last patches the code for overwrites is the same as for delayed and unwritten extents except that it doesn't need to call xfs_map_at_offset. Take care of that fact to simplify xfs_vm_writepage. The buffer loop now first checks the type of buffer and checks/sets the ioend type, or continues to the next buffer if it's not interesting to us. Only after that we validate the iomap and perform the block mapping if needed, all in common code for the cases where we have to do work. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Index: xfs/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-12-09 15:52:12.718004124 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-12-09 15:52:23.144273297 +0100 @@ -999,74 +999,55 @@ xfs_vm_writepage( continue; } - if (imap_valid) - imap_valid = xfs_imap_valid(inode, &imap, offset); - - if (buffer_unwritten(bh) || buffer_delay(bh)) { - if (buffer_unwritten(bh)) { - if (type != IO_UNWRITTEN) { - type = IO_UNWRITTEN; - imap_valid = 0; - } - } else if (buffer_delay(bh)) { - if (type != IO_DELALLOC) { - type = IO_DELALLOC; - imap_valid = 0; - } - } - - if (!imap_valid) { - /* - * If we didn't have a valid mapping then we - * need to ensure that we put the new mapping - * in a new ioend structure. This needs to be - * done to ensure that the ioends correctly - * reflect the block mappings at io completion - * for unwritten extent conversion. - */ - new_ioend = 1; - err = xfs_map_blocks(inode, offset, &imap, - type, nonblocking); - if (err) - goto error; - imap_valid = xfs_imap_valid(inode, &imap, - offset); + if (buffer_unwritten(bh)) { + if (type != IO_UNWRITTEN) { + type = IO_UNWRITTEN; + imap_valid = 0; } - if (imap_valid) { - xfs_map_at_offset(inode, bh, &imap, offset); - xfs_add_to_ioend(inode, bh, offset, type, - &ioend, new_ioend); - count++; + } else if (buffer_delay(bh)) { + if (type != IO_DELALLOC) { + type = IO_DELALLOC; + imap_valid = 0; } } else if (buffer_uptodate(bh)) { - /* - * we got here because the buffer is already mapped. - * That means it must already have extents allocated - * underneath it. Map the extent by reading it. - */ if (type != IO_OVERWRITE) { type = IO_OVERWRITE; imap_valid = 0; } - if (!imap_valid) { - new_ioend = 1; - err = xfs_map_blocks(inode, offset, - &imap, type, nonblocking); - if (err) - goto error; - imap_valid = xfs_imap_valid(inode, &imap, - offset); + } else { + if (PageUptodate(page)) { + ASSERT(buffer_mapped(bh)); + imap_valid = 0; } + continue; + } - if (imap_valid) { + if (imap_valid) + imap_valid = xfs_imap_valid(inode, &imap, offset); + if (!imap_valid) { + /* + * If we didn't have a valid mapping then we need to + * put the new mapping into a separate ioend structure. + * This ensures non-contiguous extents always have + * separate ioends, which is particularly important + * for unwritten extent conversion at I/O completion + * time. + */ + new_ioend = 1; + err = xfs_map_blocks(inode, offset, &imap, type, + nonblocking); + if (err) + goto error; + imap_valid = xfs_imap_valid(inode, &imap, offset); + } + if (imap_valid) { + if (type == IO_OVERWRITE) lock_buffer(bh); - xfs_add_to_ioend(inode, bh, offset, type, - &ioend, new_ioend); - count++; - } - } else if (PageUptodate(page)) { - ASSERT(buffer_mapped(bh)); - imap_valid = 0; + else + xfs_map_at_offset(inode, bh, &imap, offset); + xfs_add_to_ioend(inode, bh, offset, type, &ioend, + new_ioend); + count++; } if (!iohead) From BATV+870d71e9bf4a5d360c11+2665+infradead.org+hch@bombadil.srs.infradead.org Fri Dec 10 02:41:14 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_35, LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBA8fDLU205184 for ; Fri, 10 Dec 2010 02:41:14 -0600 X-ASG-Debug-ID: 1291970583-626b03820000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8AF65160F98F for ; Fri, 10 Dec 2010 00:43:03 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Zb2agampurAibyfE for ; Fri, 10 Dec 2010 00:43:03 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PQyZC-0006QO-Tc for xfs@oss.sgi.com; Fri, 10 Dec 2010 08:43:02 +0000 Message-Id: <20101210084302.878788913@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Fri, 10 Dec 2010 03:42:22 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 07/10] xfs: remove xfs_probe_cluster Subject: [PATCH 07/10] xfs: remove xfs_probe_cluster References: <20101210084215.259628825@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-kill-xfs_probe_cluster X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291970583 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean xfs_map_blocks always calls xfs_bmapi with the XFS_BMAPI_ENTIRE entire flag, which tells it to not cap the extent at the passed in size, but just treat the size as an minimum to map. This means xfs_probe_cluster is entirely useless as we'll always get the whole extent back anyway. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Index: xfs/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-12-09 15:51:10.367274204 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-12-09 15:51:41.609272318 +0100 @@ -304,13 +304,13 @@ STATIC int xfs_map_blocks( struct inode *inode, loff_t offset, - ssize_t count, struct xfs_bmbt_irec *imap, int type, int nonblocking) { struct xfs_inode *ip = XFS_I(inode); struct xfs_mount *mp = ip->i_mount; + ssize_t count = 1 << inode->i_blkbits; xfs_fileoff_t offset_fsb, end_fsb; int error = 0; int bmapi_flags = XFS_BMAPI_ENTIRE; @@ -635,108 +635,6 @@ xfs_map_at_offset( } /* - * Look for a page at index that is suitable for clustering. - */ -STATIC unsigned int -xfs_probe_page( - struct page *page, - unsigned int pg_offset) -{ - struct buffer_head *bh, *head; - int ret = 0; - - if (PageWriteback(page)) - return 0; - if (!PageDirty(page)) - return 0; - if (!page->mapping) - return 0; - if (!page_has_buffers(page)) - return 0; - - bh = head = page_buffers(page); - do { - if (!buffer_uptodate(bh)) - break; - if (!buffer_mapped(bh)) - break; - ret += bh->b_size; - if (ret >= pg_offset) - break; - } while ((bh = bh->b_this_page) != head); - - return ret; -} - -STATIC size_t -xfs_probe_cluster( - struct inode *inode, - struct page *startpage, - struct buffer_head *bh, - struct buffer_head *head) -{ - struct pagevec pvec; - pgoff_t tindex, tlast, tloff; - size_t total = 0; - int done = 0, i; - - /* First sum forwards in this page */ - do { - if (!buffer_uptodate(bh) || !buffer_mapped(bh)) - return total; - total += bh->b_size; - } while ((bh = bh->b_this_page) != head); - - /* if we reached the end of the page, sum forwards in following pages */ - tlast = i_size_read(inode) >> PAGE_CACHE_SHIFT; - tindex = startpage->index + 1; - - /* Prune this back to avoid pathological behavior */ - tloff = min(tlast, startpage->index + 64); - - pagevec_init(&pvec, 0); - while (!done && tindex <= tloff) { - unsigned len = min_t(pgoff_t, PAGEVEC_SIZE, tlast - tindex + 1); - - if (!pagevec_lookup(&pvec, inode->i_mapping, tindex, len)) - break; - - for (i = 0; i < pagevec_count(&pvec); i++) { - struct page *page = pvec.pages[i]; - size_t pg_offset, pg_len = 0; - - if (tindex == tlast) { - pg_offset = - i_size_read(inode) & (PAGE_CACHE_SIZE - 1); - if (!pg_offset) { - done = 1; - break; - } - } else - pg_offset = PAGE_CACHE_SIZE; - - if (page->index == tindex && trylock_page(page)) { - pg_len = xfs_probe_page(page, pg_offset); - unlock_page(page); - } - - if (!pg_len) { - done = 1; - break; - } - - total += pg_len; - tindex++; - } - - pagevec_release(&pvec); - cond_resched(); - } - - return total; -} - -/* * Test if a given page is suitable for writing as part of an unwritten * or delayed allocate extent. */ @@ -1028,7 +926,7 @@ xfs_vm_writepage( unsigned int type; __uint64_t end_offset; pgoff_t end_index, last_index; - ssize_t size, len; + ssize_t len; int err, imap_valid = 0, uptodate = 1; int count = 0; int all_bh = 0; @@ -1133,7 +1031,7 @@ xfs_vm_writepage( * for unwritten extent conversion. */ new_ioend = 1; - err = xfs_map_blocks(inode, offset, len, &imap, + err = xfs_map_blocks(inode, offset, &imap, type, nonblocking); if (err) goto error; @@ -1158,8 +1056,7 @@ xfs_vm_writepage( } if (!imap_valid) { new_ioend = 1; - size = xfs_probe_cluster(inode, page, bh, head); - err = xfs_map_blocks(inode, offset, size, + err = xfs_map_blocks(inode, offset, &imap, type, nonblocking); if (err) goto error; From BATV+870d71e9bf4a5d360c11+2665+infradead.org+hch@bombadil.srs.infradead.org Fri Dec 10 02:41:14 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBA8fDga205177 for ; Fri, 10 Dec 2010 02:41:14 -0600 X-ASG-Debug-ID: 1291970582-523d027b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 508E11DC53D for ; Fri, 10 Dec 2010 00:43:03 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id hba4f68hXimpJO5P for ; Fri, 10 Dec 2010 00:43:03 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PQyZC-0006Ps-MB for xfs@oss.sgi.com; Fri, 10 Dec 2010 08:43:02 +0000 Message-Id: <20101210084302.641592786@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Fri, 10 Dec 2010 03:42:21 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 06/10] xfs: simplify xfs_map_blocks Subject: [PATCH 06/10] xfs: simplify xfs_map_blocks References: <20101210084215.259628825@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-simplify-map_blocks X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291970583 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean No need to lock the extent map exclusive when performing an overwrite, we know the extent map must already have been loaded by get_blocks. Apply the non-blocking inode semantics to all mapping types instead of just delayed allocations. Remove the handling of not yet allocated blocks for the IO_UNWRITTEN case - if an extent is marked as unwritten allocated in the buffer it must already have an extent on disk. Add asserts to verify all the assumptions above in debug builds. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Index: xfs/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-10-31 15:10:59.000000000 -0400 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-10-31 15:13:27.777719469 -0400 @@ -313,81 +313,54 @@ xfs_map_blocks( struct xfs_mount *mp = ip->i_mount; xfs_fileoff_t offset_fsb, end_fsb; int error = 0; - int lockmode = 0; int bmapi_flags = XFS_BMAPI_ENTIRE; int nimaps = 1; if (XFS_FORCED_SHUTDOWN(mp)) return -XFS_ERROR(EIO); - switch (type) { - case IO_OVERWRITE: - lockmode = xfs_ilock_map_shared(ip); - break; - case IO_UNWRITTEN: - lockmode = XFS_ILOCK_EXCL; + if (type == IO_UNWRITTEN) bmapi_flags |= XFS_BMAPI_IGSTATE; - xfs_ilock(ip, lockmode); - break; - case IO_DELALLOC: - lockmode = XFS_ILOCK_SHARED; - - if (!xfs_ilock_nowait(ip, lockmode)) { - if (nonblocking) - return -XFS_ERROR(EAGAIN); - xfs_ilock(ip, lockmode); - } - break; + + if (!xfs_ilock_nowait(ip, XFS_ILOCK_SHARED)) { + if (nonblocking) + return -XFS_ERROR(EAGAIN); + xfs_ilock(ip, XFS_ILOCK_SHARED); } + ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE || + (ip->i_df.if_flags & XFS_IFEXTENTS)); ASSERT(offset <= mp->m_maxioffset); + if (offset + count > mp->m_maxioffset) count = mp->m_maxioffset - offset; end_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)offset + count); offset_fsb = XFS_B_TO_FSBT(mp, offset); - error = xfs_bmapi(NULL, ip, offset_fsb, end_fsb - offset_fsb, bmapi_flags, NULL, 0, imap, &nimaps, NULL); - if (error) - goto out; - - switch (type) { - case IO_UNWRITTEN: - /* If we found an extent, return it */ - if (nimaps && - (imap->br_startblock != HOLESTARTBLOCK) && - (imap->br_startblock != DELAYSTARTBLOCK)) { - trace_xfs_map_blocks_found(ip, offset, count, type, imap); - break; - } + xfs_iunlock(ip, XFS_ILOCK_SHARED); - error = xfs_iomap_write_delay(ip, offset, count, imap); - if (!error) - trace_xfs_map_blocks_alloc(ip, offset, count, type, imap); - break; - case IO_DELALLOC: - /* If we found an extent, return it */ - xfs_iunlock(ip, lockmode); - lockmode = 0; - - if (nimaps && !isnullstartblock(imap->br_startblock)) { - trace_xfs_map_blocks_found(ip, offset, count, type, imap); - break; - } + if (error) + return -XFS_ERROR(error); + if (type == IO_DELALLOC && + (!nimaps || isnullstartblock(imap->br_startblock))) { error = xfs_iomap_write_allocate(ip, offset, count, imap); if (!error) trace_xfs_map_blocks_alloc(ip, offset, count, type, imap); - break; - default: - if (nimaps) - trace_xfs_map_blocks_found(ip, offset, count, type, imap); + return -XFS_ERROR(error); } -out: - if (lockmode) - xfs_iunlock(ip, lockmode); - return -XFS_ERROR(error); +#ifdef DEBUG + if (type == IO_UNWRITTEN) { + ASSERT(nimaps); + ASSERT(imap->br_startblock != HOLESTARTBLOCK); + ASSERT(imap->br_startblock != DELAYSTARTBLOCK); + } +#endif + if (nimaps) + trace_xfs_map_blocks_found(ip, offset, count, type, imap); + return 0; } STATIC int From BATV+870d71e9bf4a5d360c11+2665+infradead.org+hch@bombadil.srs.infradead.org Fri Dec 10 02:41:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBA8fChh205170 for ; Fri, 10 Dec 2010 02:41:14 -0600 X-ASG-Debug-ID: 1291970582-776801a00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9AD161CAE1E8 for ; Fri, 10 Dec 2010 00:43:02 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id DDrZtgYEqMD834yV for ; Fri, 10 Dec 2010 00:43:02 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PQyZC-0006OG-2S for xfs@oss.sgi.com; Fri, 10 Dec 2010 08:43:02 +0000 Message-Id: <20101210084302.036988910@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Fri, 10 Dec 2010 03:42:18 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 03/10] xfs: a few small tweaks for overwrites in xfs_vm_writepage Subject: [PATCH 03/10] xfs: a few small tweaks for overwrites in xfs_vm_writepage References: <20101210084215.259628825@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-stop-trylocking-buffers X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291970582 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Don't trylock the buffer. We are the only one ever locking it for a regular file address space, and trylock was only copied from the generic code which did it due to the old buffer based writeout in jbd. Also make sure to only write out the buffer if the iomap actually is valid, because we wouldn't have a proper mapping otherwise. In practice we will never get an invalid mapping here as the page lock guarantees truncate doesn't race with us, but better be safe than sorry. Also make sure we allocate a new ioend when crossing boundaries between mappings, just like we do for delalloc and unwritten extents. Again this currently doesn't matter as the I/O end handler only cares for the boundaries for unwritten extents, but this makes the code fully correct and the same as for delalloc/unwritten extents. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Index: xfs/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-12-09 15:47:31.707272459 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-12-09 15:47:44.805272667 +0100 @@ -1051,6 +1051,8 @@ xfs_vm_writepage( type = IO_NEW; do { + int new_ioend = 0; + if (offset >= end_offset) break; if (!buffer_uptodate(bh)) @@ -1071,8 +1073,6 @@ xfs_vm_writepage( imap_valid = xfs_imap_valid(inode, &imap, offset); if (buffer_unwritten(bh) || buffer_delay(bh)) { - int new_ioend = 0; - if (buffer_unwritten(bh)) { if (type != IO_UNWRITTEN) { type = IO_UNWRITTEN; @@ -1124,6 +1124,7 @@ xfs_vm_writepage( imap_valid = 0; } if (!imap_valid) { + new_ioend = 1; size = xfs_probe_cluster(inode, page, bh, head); err = xfs_map_blocks(inode, offset, size, &imap, flags); @@ -1142,14 +1143,12 @@ xfs_vm_writepage( * that we are writing into for the first time. */ type = IO_NEW; - if (trylock_buffer(bh)) { - if (imap_valid) - all_bh = 1; + if (imap_valid) { + all_bh = 1; + lock_buffer(bh); xfs_add_to_ioend(inode, bh, offset, type, - &ioend, !imap_valid); + &ioend, new_ioend); count++; - } else { - imap_valid = 0; } } else if (PageUptodate(page)) { ASSERT(buffer_mapped(bh)); From BATV+870d71e9bf4a5d360c11+2665+infradead.org+hch@bombadil.srs.infradead.org Fri Dec 10 02:41:14 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBA8fDY0205176 for ; Fri, 10 Dec 2010 02:41:14 -0600 X-ASG-Debug-ID: 1291970582-4666035a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4D8F71DC53B for ; Fri, 10 Dec 2010 00:43:02 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id IW2obc0CbT3nKfQN for ; Fri, 10 Dec 2010 00:43:02 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PQyZC-0006PI-Fw for xfs@oss.sgi.com; Fri, 10 Dec 2010 08:43:02 +0000 Message-Id: <20101210084302.454258243@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Fri, 10 Dec 2010 03:42:20 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 05/10] xfs: kill xfs_iomap Subject: [PATCH 05/10] xfs: kill xfs_iomap References: <20101210084215.259628825@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-kill-xfs_iomap X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291970583 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Opencode the xfs_iomap code in it's two callers. The overlap of passed flags already was minimal and will be further reduced in the next patch. As a side effect the BMAPI_* flags for xfs_bmapi and the IO_* flags for I/O end processing are merged into a single set of flags, which should be a bit more descriptive of the operation we perform. Also improve the tracing by giving each caller it's own type set of tracepoints. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Index: xfs/fs/xfs/xfs_iomap.h =================================================================== --- xfs.orig/fs/xfs/xfs_iomap.h 2010-12-02 12:38:03.719005800 +0100 +++ xfs/fs/xfs/xfs_iomap.h 2010-12-09 15:48:23.779003915 +0100 @@ -18,30 +18,15 @@ #ifndef __XFS_IOMAP_H__ #define __XFS_IOMAP_H__ -/* base extent manipulation calls */ -#define BMAPI_READ (1 << 0) /* read extents */ -#define BMAPI_WRITE (1 << 1) /* create extents */ -#define BMAPI_ALLOCATE (1 << 2) /* delayed allocate to real extents */ - -/* modifiers */ -#define BMAPI_IGNSTATE (1 << 4) /* ignore unwritten state on read */ -#define BMAPI_DIRECT (1 << 5) /* direct instead of buffered write */ -#define BMAPI_MMA (1 << 6) /* allocate for mmap write */ -#define BMAPI_TRYLOCK (1 << 7) /* non-blocking request */ - -#define BMAPI_FLAGS \ - { BMAPI_READ, "READ" }, \ - { BMAPI_WRITE, "WRITE" }, \ - { BMAPI_ALLOCATE, "ALLOCATE" }, \ - { BMAPI_IGNSTATE, "IGNSTATE" }, \ - { BMAPI_DIRECT, "DIRECT" }, \ - { BMAPI_TRYLOCK, "TRYLOCK" } - struct xfs_inode; struct xfs_bmbt_irec; -extern int xfs_iomap(struct xfs_inode *, xfs_off_t, ssize_t, int, - struct xfs_bmbt_irec *, int *, int *); +extern int xfs_iomap_write_direct(struct xfs_inode *, xfs_off_t, size_t, + struct xfs_bmbt_irec *, int); +extern int xfs_iomap_write_delay(struct xfs_inode *, xfs_off_t, size_t, + struct xfs_bmbt_irec *); +extern int xfs_iomap_write_allocate(struct xfs_inode *, xfs_off_t, size_t, + struct xfs_bmbt_irec *); extern int xfs_iomap_write_unwritten(struct xfs_inode *, xfs_off_t, size_t); #endif /* __XFS_IOMAP_H__*/ Index: xfs/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-12-09 15:47:44.805272667 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-12-09 15:49:29.815255698 +0100 @@ -38,15 +38,6 @@ #include #include -/* - * Types of I/O for bmap clustering and I/O completion tracking. - */ -enum { - IO_READ, /* mapping for a read */ - IO_DELAY, /* mapping covers delalloc region */ - IO_UNWRITTEN, /* mapping covers allocated but uninitialized data */ - IO_NEW /* just allocated */ -}; /* * Prime number of hash buckets since address is used as the key. @@ -182,9 +173,6 @@ xfs_setfilesize( xfs_inode_t *ip = XFS_I(ioend->io_inode); xfs_fsize_t isize; - ASSERT((ip->i_d.di_mode & S_IFMT) == S_IFREG); - ASSERT(ioend->io_type != IO_READ); - if (unlikely(ioend->io_error)) return 0; @@ -244,10 +232,8 @@ xfs_end_io( * We might have to update the on-disk file size after extending * writes. */ - if (ioend->io_type != IO_READ) { - error = xfs_setfilesize(ioend); - ASSERT(!error || error == EAGAIN); - } + error = xfs_setfilesize(ioend); + ASSERT(!error || error == EAGAIN); /* * If we didn't complete processing of the ioend, requeue it to the @@ -320,12 +306,88 @@ xfs_map_blocks( loff_t offset, ssize_t count, struct xfs_bmbt_irec *imap, - int flags) + int type, + int nonblocking) { - int nmaps = 1; - int new = 0; + struct xfs_inode *ip = XFS_I(inode); + struct xfs_mount *mp = ip->i_mount; + xfs_fileoff_t offset_fsb, end_fsb; + int error = 0; + int lockmode = 0; + int bmapi_flags = XFS_BMAPI_ENTIRE; + int nimaps = 1; + + if (XFS_FORCED_SHUTDOWN(mp)) + return -XFS_ERROR(EIO); + + switch (type) { + case IO_OVERWRITE: + lockmode = xfs_ilock_map_shared(ip); + break; + case IO_UNWRITTEN: + lockmode = XFS_ILOCK_EXCL; + bmapi_flags |= XFS_BMAPI_IGSTATE; + xfs_ilock(ip, lockmode); + break; + case IO_DELALLOC: + lockmode = XFS_ILOCK_SHARED; + + if (!xfs_ilock_nowait(ip, lockmode)) { + if (nonblocking) + return -XFS_ERROR(EAGAIN); + xfs_ilock(ip, lockmode); + } + break; + } + + ASSERT(offset <= mp->m_maxioffset); + if (offset + count > mp->m_maxioffset) + count = mp->m_maxioffset - offset; + end_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)offset + count); + offset_fsb = XFS_B_TO_FSBT(mp, offset); + + error = xfs_bmapi(NULL, ip, offset_fsb, end_fsb - offset_fsb, + bmapi_flags, NULL, 0, imap, &nimaps, NULL); + if (error) + goto out; + + switch (type) { + case IO_UNWRITTEN: + /* If we found an extent, return it */ + if (nimaps && + (imap->br_startblock != HOLESTARTBLOCK) && + (imap->br_startblock != DELAYSTARTBLOCK)) { + trace_xfs_map_blocks_found(ip, offset, count, type, imap); + break; + } + + error = xfs_iomap_write_delay(ip, offset, count, imap); + if (!error) + trace_xfs_map_blocks_alloc(ip, offset, count, type, imap); + break; + case IO_DELALLOC: + /* If we found an extent, return it */ + xfs_iunlock(ip, lockmode); + lockmode = 0; + + if (nimaps && !isnullstartblock(imap->br_startblock)) { + trace_xfs_map_blocks_found(ip, offset, count, type, imap); + break; + } + + error = xfs_iomap_write_allocate(ip, offset, count, imap); + if (!error) + trace_xfs_map_blocks_alloc(ip, offset, count, type, imap); + break; + default: + if (nimaps) + trace_xfs_map_blocks_found(ip, offset, count, type, imap); + } - return -xfs_iomap(XFS_I(inode), offset, count, flags, imap, &nmaps, &new); +out: + if (lockmode) + xfs_iunlock(ip, lockmode); + return -XFS_ERROR(error); } STATIC int @@ -722,9 +784,9 @@ xfs_is_delayed_page( if (buffer_unwritten(bh)) acceptable = (type == IO_UNWRITTEN); else if (buffer_delay(bh)) - acceptable = (type == IO_DELAY); + acceptable = (type == IO_DELALLOC); else if (buffer_dirty(bh) && buffer_mapped(bh)) - acceptable = (type == IO_NEW); + acceptable = (type == IO_OVERWRITE); else break; } while ((bh = bh->b_this_page) != head); @@ -809,7 +871,7 @@ xfs_convert_page( if (buffer_unwritten(bh)) type = IO_UNWRITTEN; else - type = IO_DELAY; + type = IO_DELALLOC; if (!xfs_imap_valid(inode, imap, offset)) { done = 1; @@ -826,7 +888,7 @@ xfs_convert_page( page_dirty--; count++; } else { - type = IO_NEW; + type = IO_OVERWRITE; if (buffer_mapped(bh) && all_bh) { lock_buffer(bh); xfs_add_to_ioend(inode, bh, offset, @@ -926,7 +988,7 @@ xfs_aops_discard_page( struct buffer_head *bh, *head; loff_t offset = page_offset(page); - if (!xfs_is_delayed_page(page, IO_DELAY)) + if (!xfs_is_delayed_page(page, IO_DELALLOC)) goto out_invalidate; if (XFS_FORCED_SHUTDOWN(ip->i_mount)) @@ -994,9 +1056,10 @@ xfs_vm_writepage( __uint64_t end_offset; pgoff_t end_index, last_index; ssize_t size, len; - int flags, err, imap_valid = 0, uptodate = 1; + int err, imap_valid = 0, uptodate = 1; int count = 0; int all_bh = 0; + int nonblocking = 0; trace_xfs_writepage(inode, page, 0); @@ -1047,8 +1110,10 @@ xfs_vm_writepage( bh = head = page_buffers(page); offset = page_offset(page); - flags = BMAPI_READ; - type = IO_NEW; + type = IO_OVERWRITE; + + if (wbc->sync_mode == WB_SYNC_NONE && wbc->nonblocking) + nonblocking = 1; do { int new_ioend = 0; @@ -1078,16 +1143,11 @@ xfs_vm_writepage( type = IO_UNWRITTEN; imap_valid = 0; } - flags = BMAPI_WRITE | BMAPI_IGNSTATE; } else if (buffer_delay(bh)) { - if (type != IO_DELAY) { - type = IO_DELAY; + if (type != IO_DELALLOC) { + type = IO_DELALLOC; imap_valid = 0; } - flags = BMAPI_ALLOCATE; - - if (wbc->sync_mode == WB_SYNC_NONE) - flags |= BMAPI_TRYLOCK; } if (!imap_valid) { @@ -1100,8 +1160,8 @@ xfs_vm_writepage( * for unwritten extent conversion. */ new_ioend = 1; - err = xfs_map_blocks(inode, offset, len, - &imap, flags); + err = xfs_map_blocks(inode, offset, len, &imap, + type, nonblocking); if (err) goto error; imap_valid = xfs_imap_valid(inode, &imap, @@ -1119,30 +1179,21 @@ xfs_vm_writepage( * That means it must already have extents allocated * underneath it. Map the extent by reading it. */ - if (flags != BMAPI_READ) { - flags = BMAPI_READ; + if (type != IO_OVERWRITE) { + type = IO_OVERWRITE; imap_valid = 0; } if (!imap_valid) { new_ioend = 1; size = xfs_probe_cluster(inode, page, bh, head); err = xfs_map_blocks(inode, offset, size, - &imap, flags); + &imap, type, nonblocking); if (err) goto error; imap_valid = xfs_imap_valid(inode, &imap, offset); } - /* - * We set the type to IO_NEW in case we are doing a - * small write at EOF that is extending the file but - * without needing an allocation. We need to update the - * file size on I/O completion in this case so it is - * the same case as having just allocated a new extent - * that we are writing into for the first time. - */ - type = IO_NEW; if (imap_valid) { all_bh = 1; lock_buffer(bh); @@ -1250,13 +1301,19 @@ __xfs_get_blocks( int create, int direct) { - int flags = create ? BMAPI_WRITE : BMAPI_READ; + struct xfs_inode *ip = XFS_I(inode); + struct xfs_mount *mp = ip->i_mount; + xfs_fileoff_t offset_fsb, end_fsb; + int error = 0; + int lockmode = 0; struct xfs_bmbt_irec imap; + int nimaps = 1; xfs_off_t offset; ssize_t size; - int nimap = 1; int new = 0; - int error; + + if (XFS_FORCED_SHUTDOWN(mp)) + return -XFS_ERROR(EIO); offset = (xfs_off_t)iblock << inode->i_blkbits; ASSERT(bh_result->b_size >= (1 << inode->i_blkbits)); @@ -1265,15 +1322,45 @@ __xfs_get_blocks( if (!create && direct && offset >= i_size_read(inode)) return 0; - if (direct && create) - flags |= BMAPI_DIRECT; + if (create) { + lockmode = XFS_ILOCK_EXCL; + xfs_ilock(ip, lockmode); + } else { + lockmode = xfs_ilock_map_shared(ip); + } + + ASSERT(offset <= mp->m_maxioffset); + if (offset + size > mp->m_maxioffset) + size = mp->m_maxioffset - offset; + end_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)offset + size); + offset_fsb = XFS_B_TO_FSBT(mp, offset); - error = xfs_iomap(XFS_I(inode), offset, size, flags, &imap, &nimap, - &new); + error = xfs_bmapi(NULL, ip, offset_fsb, end_fsb - offset_fsb, + XFS_BMAPI_ENTIRE, NULL, 0, &imap, &nimaps, NULL); if (error) - return -error; - if (nimap == 0) - return 0; + goto out_unlock; + + if (create && + (!nimaps || + (imap.br_startblock == HOLESTARTBLOCK || + imap.br_startblock == DELAYSTARTBLOCK))) { + if (direct) { + error = xfs_iomap_write_direct(ip, offset, size, + &imap, nimaps); + } else { + error = xfs_iomap_write_delay(ip, offset, size, &imap); + } + if (error) + goto out_unlock; + + trace_xfs_get_blocks_alloc(ip, offset, size, 0, &imap); + } else if (nimaps) { + trace_xfs_get_blocks_found(ip, offset, size, 0, &imap); + } else { + trace_xfs_get_blocks_notfound(ip, offset, size); + goto out_unlock; + } + xfs_iunlock(ip, lockmode); if (imap.br_startblock != HOLESTARTBLOCK && imap.br_startblock != DELAYSTARTBLOCK) { @@ -1340,6 +1427,10 @@ __xfs_get_blocks( } return 0; + +out_unlock: + xfs_iunlock(ip, lockmode); + return -error; } int @@ -1427,7 +1518,7 @@ xfs_vm_direct_IO( ssize_t ret; if (rw & WRITE) { - iocb->private = xfs_alloc_ioend(inode, IO_NEW); + iocb->private = xfs_alloc_ioend(inode, IO_DIRECT); ret = __blockdev_direct_IO(rw, iocb, inode, bdev, iov, offset, nr_segs, Index: xfs/fs/xfs/linux-2.6/xfs_trace.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_trace.h 2010-12-09 15:45:46.367254159 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_trace.h 2010-12-09 15:48:23.784010410 +0100 @@ -935,10 +935,10 @@ DEFINE_PAGE_EVENT(xfs_writepage); DEFINE_PAGE_EVENT(xfs_releasepage); DEFINE_PAGE_EVENT(xfs_invalidatepage); -DECLARE_EVENT_CLASS(xfs_iomap_class, +DECLARE_EVENT_CLASS(xfs_imap_class, TP_PROTO(struct xfs_inode *ip, xfs_off_t offset, ssize_t count, - int flags, struct xfs_bmbt_irec *irec), - TP_ARGS(ip, offset, count, flags, irec), + int type, struct xfs_bmbt_irec *irec), + TP_ARGS(ip, offset, count, type, irec), TP_STRUCT__entry( __field(dev_t, dev) __field(xfs_ino_t, ino) @@ -946,7 +946,7 @@ DECLARE_EVENT_CLASS(xfs_iomap_class, __field(loff_t, new_size) __field(loff_t, offset) __field(size_t, count) - __field(int, flags) + __field(int, type) __field(xfs_fileoff_t, startoff) __field(xfs_fsblock_t, startblock) __field(xfs_filblks_t, blockcount) @@ -958,13 +958,13 @@ DECLARE_EVENT_CLASS(xfs_iomap_class, __entry->new_size = ip->i_new_size; __entry->offset = offset; __entry->count = count; - __entry->flags = flags; + __entry->type = type; __entry->startoff = irec ? irec->br_startoff : 0; __entry->startblock = irec ? irec->br_startblock : 0; __entry->blockcount = irec ? irec->br_blockcount : 0; ), TP_printk("dev %d:%d ino 0x%llx size 0x%llx new_size 0x%llx " - "offset 0x%llx count %zd flags %s " + "offset 0x%llx count %zd type %s " "startoff 0x%llx startblock %lld blockcount 0x%llx", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->ino, @@ -972,20 +972,21 @@ DECLARE_EVENT_CLASS(xfs_iomap_class, __entry->new_size, __entry->offset, __entry->count, - __print_flags(__entry->flags, "|", BMAPI_FLAGS), + __print_symbolic(__entry->type, XFS_IO_TYPES), __entry->startoff, (__int64_t)__entry->startblock, __entry->blockcount) ) #define DEFINE_IOMAP_EVENT(name) \ -DEFINE_EVENT(xfs_iomap_class, name, \ +DEFINE_EVENT(xfs_imap_class, name, \ TP_PROTO(struct xfs_inode *ip, xfs_off_t offset, ssize_t count, \ - int flags, struct xfs_bmbt_irec *irec), \ - TP_ARGS(ip, offset, count, flags, irec)) -DEFINE_IOMAP_EVENT(xfs_iomap_enter); -DEFINE_IOMAP_EVENT(xfs_iomap_found); -DEFINE_IOMAP_EVENT(xfs_iomap_alloc); + int type, struct xfs_bmbt_irec *irec), \ + TP_ARGS(ip, offset, count, type, irec)) +DEFINE_IOMAP_EVENT(xfs_map_blocks_found); +DEFINE_IOMAP_EVENT(xfs_map_blocks_alloc); +DEFINE_IOMAP_EVENT(xfs_get_blocks_found); +DEFINE_IOMAP_EVENT(xfs_get_blocks_alloc); DECLARE_EVENT_CLASS(xfs_simple_io_class, TP_PROTO(struct xfs_inode *ip, xfs_off_t offset, ssize_t count), @@ -1022,6 +1023,7 @@ DEFINE_EVENT(xfs_simple_io_class, name, TP_ARGS(ip, offset, count)) DEFINE_SIMPLE_IO_EVENT(xfs_delalloc_enospc); DEFINE_SIMPLE_IO_EVENT(xfs_unwritten_convert); +DEFINE_SIMPLE_IO_EVENT(xfs_get_blocks_notfound); TRACE_EVENT(xfs_itruncate_start, Index: xfs/fs/xfs/linux-2.6/xfs_aops.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_aops.h 2010-12-02 12:38:03.745004124 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_aops.h 2010-12-09 15:49:31.585257930 +0100 @@ -23,6 +23,22 @@ extern struct workqueue_struct *xfsconve extern mempool_t *xfs_ioend_pool; /* + * Types of I/O for bmap clustering and I/O completion tracking. + */ +enum { + IO_DIRECT = 0, /* special case for direct I/O ioends */ + IO_DELALLOC, /* mapping covers delalloc region */ + IO_UNWRITTEN, /* mapping covers allocated but uninitialized data */ + IO_OVERWRITE, /* mapping covers already allocated extent */ +}; + +#define XFS_IO_TYPES \ + { 0, "" }, \ + { IO_DELALLOC, "delalloc" }, \ + { IO_UNWRITTEN, "unwritten" }, \ + { IO_OVERWRITE, "overwrite" } + +/* * xfs_ioend struct manages large extent writes for XFS. * It can manage several multi-page bio's at once. */ Index: xfs/fs/xfs/xfs_iomap.c =================================================================== --- xfs.orig/fs/xfs/xfs_iomap.c 2010-12-09 15:48:00.407254089 +0100 +++ xfs/fs/xfs/xfs_iomap.c 2010-12-09 15:48:23.789003845 +0100 @@ -47,124 +47,8 @@ #define XFS_WRITEIO_ALIGN(mp,off) (((off) >> mp->m_writeio_log) \ << mp->m_writeio_log) -#define XFS_STRAT_WRITE_IMAPS 2 #define XFS_WRITE_IMAPS XFS_BMAP_MAX_NMAP -STATIC int xfs_iomap_write_direct(struct xfs_inode *, xfs_off_t, size_t, - struct xfs_bmbt_irec *, int); -STATIC int xfs_iomap_write_delay(struct xfs_inode *, xfs_off_t, size_t, - struct xfs_bmbt_irec *); -STATIC int xfs_iomap_write_allocate(struct xfs_inode *, xfs_off_t, size_t, - struct xfs_bmbt_irec *); - -int -xfs_iomap( - struct xfs_inode *ip, - xfs_off_t offset, - ssize_t count, - int flags, - struct xfs_bmbt_irec *imap, - int *nimaps, - int *new) -{ - struct xfs_mount *mp = ip->i_mount; - xfs_fileoff_t offset_fsb, end_fsb; - int error = 0; - int lockmode = 0; - int bmapi_flags = 0; - - ASSERT((ip->i_d.di_mode & S_IFMT) == S_IFREG); - - *new = 0; - - if (XFS_FORCED_SHUTDOWN(mp)) - return XFS_ERROR(EIO); - - trace_xfs_iomap_enter(ip, offset, count, flags, NULL); - - switch (flags & (BMAPI_READ | BMAPI_WRITE | BMAPI_ALLOCATE)) { - case BMAPI_READ: - lockmode = xfs_ilock_map_shared(ip); - bmapi_flags = XFS_BMAPI_ENTIRE; - break; - case BMAPI_WRITE: - lockmode = XFS_ILOCK_EXCL; - if (flags & BMAPI_IGNSTATE) - bmapi_flags |= XFS_BMAPI_IGSTATE|XFS_BMAPI_ENTIRE; - xfs_ilock(ip, lockmode); - break; - case BMAPI_ALLOCATE: - lockmode = XFS_ILOCK_SHARED; - bmapi_flags = XFS_BMAPI_ENTIRE; - - /* Attempt non-blocking lock */ - if (flags & BMAPI_TRYLOCK) { - if (!xfs_ilock_nowait(ip, lockmode)) - return XFS_ERROR(EAGAIN); - } else { - xfs_ilock(ip, lockmode); - } - break; - default: - BUG(); - } - - ASSERT(offset <= mp->m_maxioffset); - if ((xfs_fsize_t)offset + count > mp->m_maxioffset) - count = mp->m_maxioffset - offset; - end_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)offset + count); - offset_fsb = XFS_B_TO_FSBT(mp, offset); - - error = xfs_bmapi(NULL, ip, offset_fsb, - (xfs_filblks_t)(end_fsb - offset_fsb), - bmapi_flags, NULL, 0, imap, - nimaps, NULL); - - if (error) - goto out; - - switch (flags & (BMAPI_WRITE|BMAPI_ALLOCATE)) { - case BMAPI_WRITE: - /* If we found an extent, return it */ - if (*nimaps && - (imap->br_startblock != HOLESTARTBLOCK) && - (imap->br_startblock != DELAYSTARTBLOCK)) { - trace_xfs_iomap_found(ip, offset, count, flags, imap); - break; - } - - if (flags & BMAPI_DIRECT) { - error = xfs_iomap_write_direct(ip, offset, count, imap, - *nimaps); - } else { - error = xfs_iomap_write_delay(ip, offset, count, imap); - } - - if (!error) { - trace_xfs_iomap_alloc(ip, offset, count, flags, imap); - } - *new = 1; - break; - case BMAPI_ALLOCATE: - /* If we found an extent, return it */ - xfs_iunlock(ip, lockmode); - lockmode = 0; - - if (*nimaps && !isnullstartblock(imap->br_startblock)) { - trace_xfs_iomap_found(ip, offset, count, flags, imap); - break; - } - - error = xfs_iomap_write_allocate(ip, offset, count, imap); - break; - } - -out: - if (lockmode) - xfs_iunlock(ip, lockmode); - return XFS_ERROR(error); -} - STATIC int xfs_iomap_eof_align_last_fsb( xfs_mount_t *mp, @@ -233,7 +117,7 @@ xfs_cmn_err_fsblock_zero( return EFSCORRUPTED; } -STATIC int +int xfs_iomap_write_direct( xfs_inode_t *ip, xfs_off_t offset, @@ -428,7 +312,7 @@ xfs_iomap_eof_want_preallocate( return 0; } -STATIC int +int xfs_iomap_write_delay( xfs_inode_t *ip, xfs_off_t offset, @@ -527,7 +411,7 @@ retry: * We no longer bother to look at the incoming map - all we have to * guarantee is that whatever we allocate fills the required range. */ -STATIC int +int xfs_iomap_write_allocate( xfs_inode_t *ip, xfs_off_t offset, From BATV+870d71e9bf4a5d360c11+2665+infradead.org+hch@bombadil.srs.infradead.org Fri Dec 10 02:41:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBA8fDil205183 for ; Fri, 10 Dec 2010 02:41:15 -0600 X-ASG-Debug-ID: 1291970582-626903890000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 717C9160F98E for ; Fri, 10 Dec 2010 00:43:02 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id J8n7knZmSKLWXGHM for ; Fri, 10 Dec 2010 00:43:02 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PQyZC-0006Om-8o for xfs@oss.sgi.com; Fri, 10 Dec 2010 08:43:02 +0000 Message-Id: <20101210084302.229951279@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Fri, 10 Dec 2010 03:42:19 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 04/10] xfs: cleanup the xfs_iomap_write_* helpers Subject: [PATCH 04/10] xfs: cleanup the xfs_iomap_write_* helpers References: <20101210084215.259628825@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-cleanup-iomap-helpers X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291970583 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Remove passing the BMAPI_* flags to these helpers, in xfs_iomap_write_direct the check BMAPI_DIRECT was always true, and in the xfs_iomap_write_delay path is was never checked at all. Remove the nmap return value as we never make use of it. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Index: xfs/fs/xfs/xfs_iomap.c =================================================================== --- xfs.orig/fs/xfs/xfs_iomap.c 2010-11-02 11:10:15.000103373 -0400 +++ xfs/fs/xfs/xfs_iomap.c 2010-11-02 11:14:14.640103375 -0400 @@ -51,11 +51,11 @@ #define XFS_WRITE_IMAPS XFS_BMAP_MAX_NMAP STATIC int xfs_iomap_write_direct(struct xfs_inode *, xfs_off_t, size_t, - int, struct xfs_bmbt_irec *, int *); -STATIC int xfs_iomap_write_delay(struct xfs_inode *, xfs_off_t, size_t, int, - struct xfs_bmbt_irec *, int *); + struct xfs_bmbt_irec *, int); +STATIC int xfs_iomap_write_delay(struct xfs_inode *, xfs_off_t, size_t, + struct xfs_bmbt_irec *); STATIC int xfs_iomap_write_allocate(struct xfs_inode *, xfs_off_t, size_t, - struct xfs_bmbt_irec *, int *); + struct xfs_bmbt_irec *); int xfs_iomap( @@ -134,12 +134,12 @@ xfs_iomap( } if (flags & BMAPI_DIRECT) { - error = xfs_iomap_write_direct(ip, offset, count, flags, - imap, nimaps); + error = xfs_iomap_write_direct(ip, offset, count, imap, + *nimaps); } else { - error = xfs_iomap_write_delay(ip, offset, count, flags, - imap, nimaps); + error = xfs_iomap_write_delay(ip, offset, count, imap); } + if (!error) { trace_xfs_iomap_alloc(ip, offset, count, flags, imap); } @@ -155,13 +155,10 @@ xfs_iomap( break; } - error = xfs_iomap_write_allocate(ip, offset, count, - imap, nimaps); + error = xfs_iomap_write_allocate(ip, offset, count, imap); break; } - ASSERT(*nimaps <= 1); - out: if (lockmode) xfs_iunlock(ip, lockmode); @@ -241,9 +238,8 @@ xfs_iomap_write_direct( xfs_inode_t *ip, xfs_off_t offset, size_t count, - int flags, xfs_bmbt_irec_t *imap, - int *nmaps) + int nmaps) { xfs_mount_t *mp = ip->i_mount; xfs_fileoff_t offset_fsb; @@ -279,7 +275,7 @@ xfs_iomap_write_direct( if (error) goto error_out; } else { - if (*nmaps && (imap->br_startblock == HOLESTARTBLOCK)) + if (nmaps && (imap->br_startblock == HOLESTARTBLOCK)) last_fsb = MIN(last_fsb, (xfs_fileoff_t) imap->br_blockcount + imap->br_startoff); @@ -331,7 +327,7 @@ xfs_iomap_write_direct( xfs_trans_ijoin(tp, ip); bmapi_flag = XFS_BMAPI_WRITE; - if ((flags & BMAPI_DIRECT) && (offset < ip->i_size || extsz)) + if (offset < ip->i_size || extsz) bmapi_flag |= XFS_BMAPI_PREALLOC; /* @@ -370,7 +366,6 @@ xfs_iomap_write_direct( goto error_out; } - *nmaps = 1; return 0; error0: /* Cancel bmap, unlock inode, unreserve quota blocks, cancel trans */ @@ -379,7 +374,6 @@ error0: /* Cancel bmap, unlock inode, un error1: /* Just cancel transaction */ xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); - *nmaps = 0; /* nothing set-up here */ error_out: return XFS_ERROR(error); @@ -396,7 +390,6 @@ xfs_iomap_eof_want_preallocate( xfs_inode_t *ip, xfs_off_t offset, size_t count, - int ioflag, xfs_bmbt_irec_t *imap, int nimaps, int *prealloc) @@ -440,9 +433,7 @@ xfs_iomap_write_delay( xfs_inode_t *ip, xfs_off_t offset, size_t count, - int ioflag, - xfs_bmbt_irec_t *ret_imap, - int *nmaps) + xfs_bmbt_irec_t *ret_imap) { xfs_mount_t *mp = ip->i_mount; xfs_fileoff_t offset_fsb; @@ -470,7 +461,7 @@ xfs_iomap_write_delay( offset_fsb = XFS_B_TO_FSBT(mp, offset); error = xfs_iomap_eof_want_preallocate(mp, ip, offset, count, - ioflag, imap, XFS_WRITE_IMAPS, &prealloc); + imap, XFS_WRITE_IMAPS, &prealloc); if (error) return error; @@ -523,8 +514,6 @@ retry: return xfs_cmn_err_fsblock_zero(ip, &imap[0]); *ret_imap = imap[0]; - *nmaps = 1; - return 0; } @@ -543,8 +532,7 @@ xfs_iomap_write_allocate( xfs_inode_t *ip, xfs_off_t offset, size_t count, - xfs_bmbt_irec_t *imap, - int *retmap) + xfs_bmbt_irec_t *imap) { xfs_mount_t *mp = ip->i_mount; xfs_fileoff_t offset_fsb, last_block; @@ -557,8 +545,6 @@ xfs_iomap_write_allocate( int error = 0; int nres; - *retmap = 0; - /* * Make sure that the dquots are there. */ @@ -680,7 +666,6 @@ xfs_iomap_write_allocate( if ((offset_fsb >= imap->br_startoff) && (offset_fsb < (imap->br_startoff + imap->br_blockcount))) { - *retmap = 1; XFS_STATS_INC(xs_xstrat_quick); return 0; } From BATV+870d71e9bf4a5d360c11+2665+infradead.org+hch@bombadil.srs.infradead.org Fri Dec 10 02:41:14 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBA8fDqU205182 for ; Fri, 10 Dec 2010 02:41:14 -0600 X-ASG-Debug-ID: 1291970583-648901350000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 84DD21DC540 for ; Fri, 10 Dec 2010 00:43:03 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id GTCfWTwAMfGrqwmh for ; Fri, 10 Dec 2010 00:43:03 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PQyZD-0006Qu-41 for xfs@oss.sgi.com; Fri, 10 Dec 2010 08:43:03 +0000 Message-Id: <20101210084303.084674092@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Fri, 10 Dec 2010 03:42:23 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 08/10] xfs: remove the all_bh flag from xfs_convert_page Subject: [PATCH 08/10] xfs: remove the all_bh flag from xfs_convert_page References: <20101210084215.259628825@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-kill-all-bh X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291970583 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean The all_bh flag is always set when entering the page clustering machinery with a regular written extent, which means the check for it is superflous. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Index: xfs/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-12-09 15:51:41.609272318 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-12-09 15:52:12.718004124 +0100 @@ -682,8 +682,7 @@ xfs_convert_page( loff_t tindex, struct xfs_bmbt_irec *imap, xfs_ioend_t **ioendp, - struct writeback_control *wbc, - int all_bh) + struct writeback_control *wbc) { struct buffer_head *bh, *head; xfs_off_t end_offset; @@ -738,11 +737,14 @@ xfs_convert_page( continue; } - if (buffer_unwritten(bh) || buffer_delay(bh)) { + if (buffer_unwritten(bh) || buffer_delay(bh) || + buffer_mapped(bh)) { if (buffer_unwritten(bh)) type = IO_UNWRITTEN; - else + else if (buffer_delay(bh)) type = IO_DELALLOC; + else + type = IO_OVERWRITE; if (!xfs_imap_valid(inode, imap, offset)) { done = 1; @@ -752,23 +754,17 @@ xfs_convert_page( ASSERT(imap->br_startblock != HOLESTARTBLOCK); ASSERT(imap->br_startblock != DELAYSTARTBLOCK); - xfs_map_at_offset(inode, bh, imap, offset); + if (type == IO_OVERWRITE) + lock_buffer(bh); + else + xfs_map_at_offset(inode, bh, imap, offset); xfs_add_to_ioend(inode, bh, offset, type, ioendp, done); page_dirty--; count++; } else { - type = IO_OVERWRITE; - if (buffer_mapped(bh) && all_bh) { - lock_buffer(bh); - xfs_add_to_ioend(inode, bh, offset, - type, ioendp, done); - count++; - page_dirty--; - } else { - done = 1; - } + done = 1; } } while (offset += len, (bh = bh->b_this_page) != head); @@ -800,7 +796,6 @@ xfs_cluster_write( struct xfs_bmbt_irec *imap, xfs_ioend_t **ioendp, struct writeback_control *wbc, - int all_bh, pgoff_t tlast) { struct pagevec pvec; @@ -815,7 +810,7 @@ xfs_cluster_write( for (i = 0; i < pagevec_count(&pvec); i++) { done = xfs_convert_page(inode, pvec.pages[i], tindex++, - imap, ioendp, wbc, all_bh); + imap, ioendp, wbc); if (done) break; } @@ -929,7 +924,6 @@ xfs_vm_writepage( ssize_t len; int err, imap_valid = 0, uptodate = 1; int count = 0; - int all_bh = 0; int nonblocking = 0; trace_xfs_writepage(inode, page, 0); @@ -1065,7 +1059,6 @@ xfs_vm_writepage( } if (imap_valid) { - all_bh = 1; lock_buffer(bh); xfs_add_to_ioend(inode, bh, offset, type, &ioend, new_ioend); @@ -1102,7 +1095,7 @@ xfs_vm_writepage( end_index = last_index; xfs_cluster_write(inode, page->index + 1, &imap, &ioend, - wbc, all_bh, end_index); + wbc, end_index); } if (iohead) From BATV+870d71e9bf4a5d360c11+2665+infradead.org+hch@bombadil.srs.infradead.org Fri Dec 10 02:41:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBA8fDRe205179 for ; Fri, 10 Dec 2010 02:41:15 -0600 X-ASG-Debug-ID: 1291970582-5e3e03c90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4CD66160F98B for ; Fri, 10 Dec 2010 00:43:02 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id AUrICICJOTst1Dfw for ; Fri, 10 Dec 2010 00:43:02 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PQyZB-0006ND-LB for xfs@oss.sgi.com; Fri, 10 Dec 2010 08:43:01 +0000 Message-Id: <20101210084301.616302405@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Fri, 10 Dec 2010 03:42:16 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 01/10] xfs: improve mapping type check in xfs_vm_writepage Subject: [PATCH 01/10] xfs: improve mapping type check in xfs_vm_writepage References: <20101210084215.259628825@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-fix-iomap-type-checking X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291970583 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Currently we only refuse a "read-only" mapping for writing out unwritten and delayed buffers, and refuse any other for overwrites. Improve the checks to require delalloc mappings for delayed buffers, and unwritten extent mappings for unwritten extents. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Index: xfs/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-12-09 15:46:04.943253809 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-12-09 15:47:20.583004194 +0100 @@ -1082,17 +1082,17 @@ xfs_vm_writepage( if (buffer_unwritten(bh) || buffer_delay(bh)) { int new_ioend = 0; - /* - * Make sure we don't use a read-only iomap - */ - if (flags == BMAPI_READ) - imap_valid = 0; - if (buffer_unwritten(bh)) { - type = IO_UNWRITTEN; + if (type != IO_UNWRITTEN) { + type = IO_UNWRITTEN; + imap_valid = 0; + } flags = BMAPI_WRITE | BMAPI_IGNSTATE; } else if (buffer_delay(bh)) { - type = IO_DELAY; + if (type != IO_DELAY) { + type = IO_DELAY; + imap_valid = 0; + } flags = BMAPI_ALLOCATE; if (wbc->sync_mode == WB_SYNC_NONE) @@ -1128,8 +1128,11 @@ xfs_vm_writepage( * That means it must already have extents allocated * underneath it. Map the extent by reading it. */ - if (!imap_valid || flags != BMAPI_READ) { + if (flags != BMAPI_READ) { flags = BMAPI_READ; + imap_valid = 0; + } + if (!imap_valid) { size = xfs_probe_cluster(inode, page, bh, head); err = xfs_map_blocks(inode, offset, size, &imap, flags); From BATV+870d71e9bf4a5d360c11+2665+infradead.org+hch@bombadil.srs.infradead.org Fri Dec 10 02:41:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBA8fEcO205193 for ; Fri, 10 Dec 2010 02:41:14 -0600 X-ASG-Debug-ID: 1291970584-466f037c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3357C1DC540 for ; Fri, 10 Dec 2010 00:43:04 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 2qit0vwMH5fbBRiF for ; Fri, 10 Dec 2010 00:43:04 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PQyZB-0006Nk-SY for xfs@oss.sgi.com; Fri, 10 Dec 2010 08:43:01 +0000 Message-Id: <20101210084301.858316107@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Fri, 10 Dec 2010 03:42:17 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 02/10] xfs: remove some dead bio handling code Subject: [PATCH 02/10] xfs: remove some dead bio handling code References: <20101210084215.259628825@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-aop-cleanups X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291970584 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean We'll never have BIO_EOPNOTSUPP set after calling submit_bio as this can only happen for discards, and used to happen for barriers, none of which is every submitted by xfs_submit_ioend_bio. Also remove the loop around bio_alloc as it will never fail due to it's mempool backing. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Index: xfs/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-11-19 14:49:28.115261980 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-11-19 14:49:29.417024168 +0100 @@ -380,26 +380,18 @@ xfs_submit_ioend_bio( submit_bio(wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC_PLUG : WRITE, bio); - ASSERT(!bio_flagged(bio, BIO_EOPNOTSUPP)); - bio_put(bio); } STATIC struct bio * xfs_alloc_ioend_bio( struct buffer_head *bh) { - struct bio *bio; int nvecs = bio_get_nr_vecs(bh->b_bdev); - - do { - bio = bio_alloc(GFP_NOIO, nvecs); - nvecs >>= 1; - } while (!bio); + struct bio *bio = bio_alloc(GFP_NOIO, nvecs); ASSERT(bio->bi_private == NULL); bio->bi_sector = bh->b_blocknr * (bh->b_size >> 9); bio->bi_bdev = bh->b_bdev; - bio_get(bio); return bio; } @@ -470,9 +462,8 @@ xfs_submit_ioend( /* Pass 1 - start writeback */ do { next = ioend->io_list; - for (bh = ioend->io_buffer_head; bh; bh = bh->b_private) { + for (bh = ioend->io_buffer_head; bh; bh = bh->b_private) xfs_start_buffer_writeback(bh); - } } while ((ioend = next) != NULL); /* Pass 2 - submit I/O */ From BATV+870d71e9bf4a5d360c11+2665+infradead.org+hch@bombadil.srs.infradead.org Fri Dec 10 02:41:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBA8fCsI205167 for ; Fri, 10 Dec 2010 02:41:14 -0600 X-ASG-Debug-ID: 1291970582-0d8300140000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9019D1CAE1E3 for ; Fri, 10 Dec 2010 00:43:02 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id s2wTjFL5Sz94HG7Y for ; Fri, 10 Dec 2010 00:43:02 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PQyZB-0006Me-9F for xfs@oss.sgi.com; Fri, 10 Dec 2010 08:43:01 +0000 Message-Id: <20101210084215.259628825@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Fri, 10 Dec 2010 03:42:15 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 00/10] writeback updates V2 Subject: [PATCH 00/10] writeback updates V2 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291970582 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean - add IO_DIRECT per Dave's review comment - fix up a commit message as per Dave's review comment - add Reviewed-by: tags for Dave's reviews From BATV+870d71e9bf4a5d360c11+2665+infradead.org+hch@bombadil.srs.infradead.org Fri Dec 10 02:41:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBA8fE6N205197 for ; Fri, 10 Dec 2010 02:41:14 -0600 X-ASG-Debug-ID: 1291970583-5e3f03950000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3DB91160F98F for ; Fri, 10 Dec 2010 00:43:04 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Ro4r6ARB8ko6TmeQ for ; Fri, 10 Dec 2010 00:43:04 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PQyZD-0006Rw-Ia for xfs@oss.sgi.com; Fri, 10 Dec 2010 08:43:03 +0000 Message-Id: <20101210084303.537974157@bombadil.infradead.org> User-Agent: quilt/0.48-1 Date: Fri, 10 Dec 2010 03:42:25 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 10/10] xfs: simplify xfs_map_at_offset Subject: [PATCH 10/10] xfs: simplify xfs_map_at_offset References: <20101210084215.259628825@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-simplify-xfs_map_at_offset X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1291970584 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Move the buffer locking into the callers as they need to do it wether they call xfs_map_at_offset or not. Remove the b_bdev assignment, which is already done by get_blocks. Remove the duplicate extent type asserts in xfs_convert_page just before calling xfs_map_at_offset. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Index: xfs/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-12-09 15:52:23.144273297 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-12-09 15:52:41.846254159 +0100 @@ -626,9 +626,7 @@ xfs_map_at_offset( ASSERT(imap->br_startblock != HOLESTARTBLOCK); ASSERT(imap->br_startblock != DELAYSTARTBLOCK); - lock_buffer(bh); xfs_map_buffer(inode, bh, imap, offset); - bh->b_bdev = xfs_find_bdev_for_inode(inode); set_buffer_mapped(bh); clear_buffer_delay(bh); clear_buffer_unwritten(bh); @@ -751,12 +749,8 @@ xfs_convert_page( continue; } - ASSERT(imap->br_startblock != HOLESTARTBLOCK); - ASSERT(imap->br_startblock != DELAYSTARTBLOCK); - - if (type == IO_OVERWRITE) - lock_buffer(bh); - else + lock_buffer(bh); + if (type != IO_OVERWRITE) xfs_map_at_offset(inode, bh, imap, offset); xfs_add_to_ioend(inode, bh, offset, type, ioendp, done); @@ -1041,9 +1035,8 @@ xfs_vm_writepage( imap_valid = xfs_imap_valid(inode, &imap, offset); } if (imap_valid) { - if (type == IO_OVERWRITE) - lock_buffer(bh); - else + lock_buffer(bh); + if (type != IO_OVERWRITE) xfs_map_at_offset(inode, bh, &imap, offset); xfs_add_to_ioend(inode, bh, offset, type, &ioend, new_ioend); From branto@redhat.com Fri Dec 10 04:05:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBAA58Lf221316 for ; Fri, 10 Dec 2010 04:05:08 -0600 X-ASG-Debug-ID: 1291975617-0e1a01c50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 730DB1CAEC64; Fri, 10 Dec 2010 02:06:57 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id dGPWk9vB5r8B2Ddu; Fri, 10 Dec 2010 02:06:57 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation 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.13.8/8.13.8) with ESMTP id oBAA6pus022927 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 10 Dec 2010 05:06:52 -0500 Received: from [10.34.26.208] (dhcp-26-208.brq.redhat.com [10.34.26.208]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id oBAA6o9B002883; Fri, 10 Dec 2010 05:06:50 -0500 X-ASG-Orig-Subj: Re: [PATCH] xfstests: fix 108 golden output Subject: Re: [PATCH] xfstests: fix 108 golden output From: Boris Ranto To: aelder@sgi.com Cc: Christoph Hellwig , xfs@oss.sgi.com In-Reply-To: <1291929579.13355.30.camel@doink> References: <20101110125855.GA18357@infradead.org> <1291929579.13355.30.camel@doink> Content-Type: text/plain; charset="UTF-8" Date: Fri, 10 Dec 2010 11:06:49 +0100 Message-ID: <1291975609.3282.7.camel@dhcp-31-190.brq.redhat.com> Mime-Version: 1.0 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1291975618 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, 2010-12-09 at 15:19 -0600, Alex Elder wrote: > On Wed, 2010-11-10 at 07:58 -0500, Christoph Hellwig wrote: > > The new common scratch mount filter produces slightly different > > whitespaces than the old home grown filter, so adjust the golden > > output. > > > > Signed-off-by: Christoph Hellwig > > I found out why this is happening. I get no > such error, and Dave Chinner said he wasn't seeing > it either. > > xfs_quota is formatting its output such that the > second and later columns always align at a certain > offset from the beginning of the line. As a result, > path names assigned as SCRATCH_DEV of different > lengths will produce different (filtered) output, > with more or fewer blanks between SCRATCH_DEV and > the usage number. > > Boris Ranto has proposed a change that would > add the "-b" flag to diff when checking output > against golden output. That should fix it, but > it's possible we *want* differences in white > space to matter in some cases. Have to look > into this. > > -Alex > The change was designed to add the "-b" flag only for this test case. Any other test case could also modify its diff options through DIFF_OPTIONS variable in its config file ($seq.config). -Boris From BATV+870d71e9bf4a5d360c11+2665+infradead.org+hch@bombadil.srs.infradead.org Fri Dec 10 07:27:50 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_32, J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBADRnPJ257855 for ; Fri, 10 Dec 2010 07:27:50 -0600 X-ASG-Debug-ID: 1291987779-068c00d70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 418EA1CB11D7 for ; Fri, 10 Dec 2010 05:29:39 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id YEPyLRg9sR2kSd2v for ; Fri, 10 Dec 2010 05:29:39 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PR32V-0006wp-QO; Fri, 10 Dec 2010 13:29:35 +0000 Date: Fri, 10 Dec 2010 08:29:35 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: prevent NMI timeouts in cmn_err Subject: Re: [PATCH] xfs: prevent NMI timeouts in cmn_err Message-ID: <20101210132935.GA24210@infradead.org> References: <1291341315-31338-1-git-send-email-david@fromorbit.com> <20101203043846.GB23339@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101203043846.GB23339@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[18.85.46.34] X-Barracuda-Start-Time: 1291987779 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, Dec 03, 2010 at 03:38:46PM +1100, Dave Chinner wrote: > FWIW, while these macros are the best way to make a simple backport > is possible, I just discovered that mainline has a %pV format > operator that allows an implementation like: > > void > xfs_fs_cmn_err( > const char *lvl, > struct xfs_mount *mp, > const char *fmt, > ...) > { > struct va_format vaf; > va_list args; > > va_start(args, fmt); > vaf.fmt = fmt; > vaf.va = &args; > > printk("%sFilesystem %s: %pV", lvl, mp->m_fsname, &vaf); > va_end(args); > > BUG_ON(strncmp(lvl, KERN_EMERG, strlen(KERN_EMERG)) == 0); > } With this we can also keep the existing integer-based CE_ values and do trivial array lookup. That also avoids having to do a strcmp for every message printed. From BATV+870d71e9bf4a5d360c11+2665+infradead.org+hch@bombadil.srs.infradead.org Fri Dec 10 08:34:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBAEY5wX008575 for ; Fri, 10 Dec 2010 08:34:08 -0600 X-ASG-Debug-ID: 1291991755-34a301900000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D29D316102D4 for ; Fri, 10 Dec 2010 06:35:55 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id no34PHDiQFd7dlrR for ; Fri, 10 Dec 2010 06:35:55 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PR44g-0000QH-Ne; Fri, 10 Dec 2010 14:35:54 +0000 Date: Fri, 10 Dec 2010 09:35:54 -0500 From: Christoph Hellwig To: Boris Ranto Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfstests: ignore absolute address in filename in test case 237 Subject: Re: xfstests: ignore absolute address in filename in test case 237 Message-ID: <20101210143554.GA1415@infradead.org> References: <1291899944.3196.11.camel@dhcp-31-190.brq.redhat.com> <1291902047.3196.26.camel@dhcp-31-190.brq.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1291902047.3196.26.camel@dhcp-31-190.brq.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[18.85.46.34] X-Barracuda-Start-Time: 1291991755 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean I don't mind the patch, but what version of getfacl would produce an absolute filename? From BATV+870d71e9bf4a5d360c11+2665+infradead.org+hch@bombadil.srs.infradead.org Fri Dec 10 08:35:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBAEZSC1008868 for ; Fri, 10 Dec 2010 08:35:28 -0600 X-ASG-Debug-ID: 1291991837-5b3d02d80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 23AF91DD3D2 for ; Fri, 10 Dec 2010 06:37:18 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id PL7wRchtucD3EIRQ for ; Fri, 10 Dec 2010 06:37:18 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PR461-0000UV-N1; Fri, 10 Dec 2010 14:37:17 +0000 Date: Fri, 10 Dec 2010 09:37:17 -0500 From: Christoph Hellwig To: Boris Ranto Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfstests: fix 108 through config mechanism Subject: Re: xfstests: fix 108 through config mechanism Message-ID: <20101210143717.GB1415@infradead.org> References: <1291905612.3196.49.camel@dhcp-31-190.brq.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1291905612.3196.49.camel@dhcp-31-190.brq.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[18.85.46.34] X-Barracuda-Start-Time: 1291991838 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean I don't rally like the per-test option. What about adding a _filter_xfs_quota helper that uses sed to output a canonical number of whitespaces? From BATV+870d71e9bf4a5d360c11+2665+infradead.org+hch@bombadil.srs.infradead.org Fri Dec 10 09:02:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_64 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBAF271j014086 for ; Fri, 10 Dec 2010 09:02:07 -0600 X-ASG-Debug-ID: 1291993437-6401039a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A72E01DD9E6 for ; Fri, 10 Dec 2010 07:03:57 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id nXXEmtB1TClcLKz9 for ; Fri, 10 Dec 2010 07:03:57 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PR4Vp-0005OZ-96 for xfs@oss.sgi.com; Fri, 10 Dec 2010 15:03:57 +0000 Date: Fri, 10 Dec 2010 10:03:57 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: clean up xfs_alloc_ag_vextent_exact Subject: [PATCH] xfs: clean up xfs_alloc_ag_vextent_exact Message-ID: <20101210150357.GA20726@infradead.org> 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[18.85.46.34] X-Barracuda-Start-Time: 1291993437 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Use a goto label to consolidate all block not found cases, and add a tracepoint for them. Also clean up a few whitespace issues. Based on an earlier patch from Dave Chinner. Signed-off-by: Christoph Hellwig Index: linux-2.6/fs/xfs/linux-2.6/xfs_trace.h =================================================================== --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_trace.h +++ linux-2.6/fs/xfs/linux-2.6/xfs_trace.h @@ -1421,6 +1421,7 @@ DEFINE_EVENT(xfs_alloc_class, name, \ TP_PROTO(struct xfs_alloc_arg *args), \ TP_ARGS(args)) DEFINE_ALLOC_EVENT(xfs_alloc_exact_done); +DEFINE_ALLOC_EVENT(xfs_alloc_exact_notfound); DEFINE_ALLOC_EVENT(xfs_alloc_exact_error); DEFINE_ALLOC_EVENT(xfs_alloc_near_nominleft); DEFINE_ALLOC_EVENT(xfs_alloc_near_first); Index: linux-2.6/fs/xfs/xfs_alloc.c =================================================================== --- linux-2.6.orig/fs/xfs/xfs_alloc.c +++ linux-2.6/fs/xfs/xfs_alloc.c @@ -577,61 +577,58 @@ xfs_alloc_ag_vextent_exact( xfs_extlen_t rlen; /* length of returned extent */ ASSERT(args->alignment == 1); + /* * Allocate/initialize a cursor for the by-number freespace btree. */ bno_cur = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp, - args->agno, XFS_BTNUM_BNO); + args->agno, XFS_BTNUM_BNO); + /* * Lookup bno and minlen in the btree (minlen is irrelevant, really). * Look for the closest free block <= bno, it must contain bno * if any free block does. */ - if ((error = xfs_alloc_lookup_le(bno_cur, args->agbno, args->minlen, &i))) + error = xfs_alloc_lookup_le(bno_cur, args->agbno, args->minlen, &i); + if (error) goto error0; - if (!i) { - /* - * Didn't find it, return null. - */ - xfs_btree_del_cursor(bno_cur, XFS_BTREE_NOERROR); - args->agbno = NULLAGBLOCK; - return 0; - } + if (!i) + goto not_found; + /* * Grab the freespace record. */ - if ((error = xfs_alloc_get_rec(bno_cur, &fbno, &flen, &i))) + error = xfs_alloc_get_rec(bno_cur, &fbno, &flen, &i); + if (error) goto error0; XFS_WANT_CORRUPTED_GOTO(i == 1, error0); ASSERT(fbno <= args->agbno); minend = args->agbno + args->minlen; maxend = args->agbno + args->maxlen; fend = fbno + flen; + /* * Give up if the freespace isn't long enough for the minimum request. */ - if (fend < minend) { - xfs_btree_del_cursor(bno_cur, XFS_BTREE_NOERROR); - args->agbno = NULLAGBLOCK; - return 0; - } + if (fend < minend) + goto not_found; + /* * End of extent will be smaller of the freespace end and the * maximal requested end. - */ - end = XFS_AGBLOCK_MIN(fend, maxend); - /* + * * Fix the length according to mod and prod if given. */ + end = XFS_AGBLOCK_MIN(fend, maxend); args->len = end - args->agbno; xfs_alloc_fix_len(args); - if (!xfs_alloc_fix_minleft(args)) { - xfs_btree_del_cursor(bno_cur, XFS_BTREE_NOERROR); - return 0; - } + if (!xfs_alloc_fix_minleft(args)) + goto not_found; + rlen = args->len; ASSERT(args->agbno + rlen <= fend); end = args->agbno + rlen; + /* * We are allocating agbno for rlen [agbno .. end] * Allocate/initialize a cursor for the by-size btree. @@ -640,16 +637,25 @@ xfs_alloc_ag_vextent_exact( args->agno, XFS_BTNUM_CNT); ASSERT(args->agbno + args->len <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length)); - if ((error = xfs_alloc_fixup_trees(cnt_cur, bno_cur, fbno, flen, - args->agbno, args->len, XFSA_FIXUP_BNO_OK))) { + error = xfs_alloc_fixup_trees(cnt_cur, bno_cur, fbno, flen, args->agbno, + args->len, XFSA_FIXUP_BNO_OK); + if (error) { xfs_btree_del_cursor(cnt_cur, XFS_BTREE_ERROR); goto error0; } + xfs_btree_del_cursor(bno_cur, XFS_BTREE_NOERROR); xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); - trace_xfs_alloc_exact_done(args); args->wasfromfl = 0; + trace_xfs_alloc_exact_done(args); + return 0; + +not_found: + /* Didn't find it, return null. */ + xfs_btree_del_cursor(bno_cur, XFS_BTREE_NOERROR); + args->agbno = NULLAGBLOCK; + trace_xfs_alloc_exact_notfound(args); return 0; error0: From BATV+870d71e9bf4a5d360c11+2665+infradead.org+hch@bombadil.srs.infradead.org Fri Dec 10 09:02:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBAF2MQ4014147 for ; Fri, 10 Dec 2010 09:02:22 -0600 X-ASG-Debug-ID: 1291993452-441702030000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 582381CB1B0E for ; Fri, 10 Dec 2010 07:04:12 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id n2w9BkPur0QVIXQi for ; Fri, 10 Dec 2010 07:04:12 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PR4W3-0005Oh-U4 for xfs@oss.sgi.com; Fri, 10 Dec 2010 15:04:11 +0000 Date: Fri, 10 Dec 2010 10:04:11 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: factor duplicate code in xfs_alloc_ag_vextent_near into a helper Subject: [PATCH] xfs: factor duplicate code in xfs_alloc_ag_vextent_near into a helper Message-ID: <20101210150411.GB20726@infradead.org> 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[18.85.46.34] X-Barracuda-Start-Time: 1291993452 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Add a new xfs_alloc_find_best_extent that does a forward/backward search in the allocation btree. That code previously was existed two times in xfs_alloc_ag_vextent_near, once for each search direction. Based on an earlier patch from Dave Chinner. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_alloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.c 2010-12-10 09:50:07.681023471 +0100 +++ xfs/fs/xfs/xfs_alloc.c 2010-12-10 09:51:32.874005592 +0100 @@ -665,6 +665,95 @@ error0: } /* + * Search the btree in a given direction via the search cursor and compare + * the records found against the good extent we've already found. + */ +STATIC int +xfs_alloc_find_best_extent( + struct xfs_alloc_arg *args, /* allocation argument structure */ + struct xfs_btree_cur **gcur, /* good cursor */ + struct xfs_btree_cur **scur, /* searching cursor */ + xfs_agblock_t gdiff, /* difference for search comparison */ + xfs_agblock_t *sbno, /* extent found by search */ + xfs_extlen_t *slen, + xfs_extlen_t *slena, /* aligned length */ + int dir) /* 0 = search right, 1 = search left */ +{ + xfs_agblock_t bno; + xfs_agblock_t new; + xfs_agblock_t sdiff; + int error; + int i; + + /* The good extent is perfect, no need to search. */ + if (!gdiff) + goto out_use_good; + + /* + * Look until we find a better one, run out of space or run off the end. + */ + do { + error = xfs_alloc_get_rec(*scur, sbno, slen, &i); + if (error) + goto error0; + XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + xfs_alloc_compute_aligned(*sbno, *slen, args->alignment, + args->minlen, &bno, slena); + + /* + * The good extent is closer than this one. + */ + if (!dir) { + if (bno >= args->agbno + gdiff) + goto out_use_good; + } else { + if (bno <= args->agbno - gdiff) + goto out_use_good; + } + + /* + * Same distance, compare length and pick the best. + */ + if (*slena >= args->minlen) { + args->len = XFS_EXTLEN_MIN(*slena, args->maxlen); + xfs_alloc_fix_len(args); + + sdiff = xfs_alloc_compute_diff(args->agbno, args->len, + args->alignment, *sbno, + *slen, &new); + + /* + * Choose closer size and invalidate other cursor. + */ + if (sdiff < gdiff) + goto out_use_search; + goto out_use_good; + } + + if (!dir) + error = xfs_btree_increment(*scur, 0, &i); + else + error = xfs_btree_decrement(*scur, 0, &i); + if (error) + goto error0; + } while (i); + +out_use_good: + xfs_btree_del_cursor(*scur, XFS_BTREE_NOERROR); + *scur = NULL; + return 0; + +out_use_search: + xfs_btree_del_cursor(*gcur, XFS_BTREE_NOERROR); + *gcur = NULL; + return 0; + +error0: + /* caller invalidates cursors */ + return error; +} + +/* * Allocate a variable extent near bno in the allocation group agno. * Extent's length (returned in len) will be between minlen and maxlen, * and of the form k * prod + mod unless there's nothing that large. @@ -931,203 +1020,45 @@ xfs_alloc_ag_vextent_near( } } } while (bno_cur_lt || bno_cur_gt); + /* * Got both cursors still active, need to find better entry. */ if (bno_cur_lt && bno_cur_gt) { - /* - * Left side is long enough, look for a right side entry. - */ if (ltlena >= args->minlen) { /* - * Fix up the length. + * Left side is good, look for a right side entry. */ args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen); xfs_alloc_fix_len(args); - rlen = args->len; - ltdiff = xfs_alloc_compute_diff(args->agbno, rlen, + ltdiff = xfs_alloc_compute_diff(args->agbno, args->len, args->alignment, ltbno, ltlen, <new); + + error = xfs_alloc_find_best_extent(args, + &bno_cur_lt, &bno_cur_gt, + ltdiff, >bno, >len, >lena, + 0 /* search right */); + } else { + ASSERT(gtlena >= args->minlen); + /* - * Not perfect. - */ - if (ltdiff) { - /* - * Look until we find a better one, run out of - * space, or run off the end. - */ - while (bno_cur_lt && bno_cur_gt) { - if ((error = xfs_alloc_get_rec( - bno_cur_gt, >bno, - >len, &i))) - goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); - xfs_alloc_compute_aligned(gtbno, gtlen, - args->alignment, args->minlen, - >bnoa, >lena); - /* - * The left one is clearly better. - */ - if (gtbnoa >= args->agbno + ltdiff) { - xfs_btree_del_cursor( - bno_cur_gt, - XFS_BTREE_NOERROR); - bno_cur_gt = NULL; - break; - } - /* - * If we reach a big enough entry, - * compare the two and pick the best. - */ - if (gtlena >= args->minlen) { - args->len = - XFS_EXTLEN_MIN(gtlena, - args->maxlen); - xfs_alloc_fix_len(args); - rlen = args->len; - gtdiff = xfs_alloc_compute_diff( - args->agbno, rlen, - args->alignment, - gtbno, gtlen, >new); - /* - * Right side is better. - */ - if (gtdiff < ltdiff) { - xfs_btree_del_cursor( - bno_cur_lt, - XFS_BTREE_NOERROR); - bno_cur_lt = NULL; - } - /* - * Left side is better. - */ - else { - xfs_btree_del_cursor( - bno_cur_gt, - XFS_BTREE_NOERROR); - bno_cur_gt = NULL; - } - break; - } - /* - * Fell off the right end. - */ - if ((error = xfs_btree_increment( - bno_cur_gt, 0, &i))) - goto error0; - if (!i) { - xfs_btree_del_cursor( - bno_cur_gt, - XFS_BTREE_NOERROR); - bno_cur_gt = NULL; - break; - } - } - } - /* - * The left side is perfect, trash the right side. - */ - else { - xfs_btree_del_cursor(bno_cur_gt, - XFS_BTREE_NOERROR); - bno_cur_gt = NULL; - } - } - /* - * It's the right side that was found first, look left. - */ - else { - /* - * Fix up the length. + * Right side is good, look for a left side entry. */ args->len = XFS_EXTLEN_MIN(gtlena, args->maxlen); xfs_alloc_fix_len(args); - rlen = args->len; - gtdiff = xfs_alloc_compute_diff(args->agbno, rlen, + gtdiff = xfs_alloc_compute_diff(args->agbno, args->len, args->alignment, gtbno, gtlen, >new); - /* - * Right side entry isn't perfect. - */ - if (gtdiff) { - /* - * Look until we find a better one, run out of - * space, or run off the end. - */ - while (bno_cur_lt && bno_cur_gt) { - if ((error = xfs_alloc_get_rec( - bno_cur_lt, <bno, - <len, &i))) - goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); - xfs_alloc_compute_aligned(ltbno, ltlen, - args->alignment, args->minlen, - <bnoa, <lena); - /* - * The right one is clearly better. - */ - if (ltbnoa <= args->agbno - gtdiff) { - xfs_btree_del_cursor( - bno_cur_lt, - XFS_BTREE_NOERROR); - bno_cur_lt = NULL; - break; - } - /* - * If we reach a big enough entry, - * compare the two and pick the best. - */ - if (ltlena >= args->minlen) { - args->len = XFS_EXTLEN_MIN( - ltlena, args->maxlen); - xfs_alloc_fix_len(args); - rlen = args->len; - ltdiff = xfs_alloc_compute_diff( - args->agbno, rlen, - args->alignment, - ltbno, ltlen, <new); - /* - * Left side is better. - */ - if (ltdiff < gtdiff) { - xfs_btree_del_cursor( - bno_cur_gt, - XFS_BTREE_NOERROR); - bno_cur_gt = NULL; - } - /* - * Right side is better. - */ - else { - xfs_btree_del_cursor( - bno_cur_lt, - XFS_BTREE_NOERROR); - bno_cur_lt = NULL; - } - break; - } - /* - * Fell off the left end. - */ - if ((error = xfs_btree_decrement( - bno_cur_lt, 0, &i))) - goto error0; - if (!i) { - xfs_btree_del_cursor(bno_cur_lt, - XFS_BTREE_NOERROR); - bno_cur_lt = NULL; - break; - } - } - } - /* - * The right side is perfect, trash the left side. - */ - else { - xfs_btree_del_cursor(bno_cur_lt, - XFS_BTREE_NOERROR); - bno_cur_lt = NULL; - } + + error = xfs_alloc_find_best_extent(args, + &bno_cur_gt, &bno_cur_lt, + gtdiff, <bno, <len, <lena, + 1 /* search left */); } + + if (error) + goto error0; } + /* * If we couldn't get anything, give up. */ @@ -1136,6 +1067,7 @@ xfs_alloc_ag_vextent_near( args->agbno = NULLAGBLOCK; return 0; } + /* * At this point we have selected a freespace entry, either to the * left or to the right. If it's on the right, copy all the @@ -1152,6 +1084,7 @@ xfs_alloc_ag_vextent_near( j = 1; } else j = 0; + /* * Fix up the length and compute the useful address. */ From lczerner@redhat.com Fri Dec 10 09:51:48 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_44,J_CHICKENPOX_64,J_CHICKENPOX_66,J_CHICKENPOX_73, LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBAFpm7J023337 for ; Fri, 10 Dec 2010 09:51:48 -0600 X-ASG-Debug-ID: 1291996417-5c5002db0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2E1EF1CAA020 for ; Fri, 10 Dec 2010 07:53:37 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id doGYPOhAEjCKUZ0N for ; Fri, 10 Dec 2010 07:53:37 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation 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.13.8/8.13.8) with ESMTP id oBAFrWKh019682 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 10 Dec 2010 10:53:32 -0500 Received: from dhcp-lab-213.englab.brq.redhat.com (dhcp-27-109.brq.redhat.com [10.34.27.109]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id oBAFrUNT008797; Fri, 10 Dec 2010 10:53:30 -0500 From: Lukas Czerner To: xfs@oss.sgi.com Cc: esandeen@redhat.com, hch@infradead.org, lczerner@redhat.com X-ASG-Orig-Subj: [PATCH] Add test 248: Check filesystem FITRIM implementation Subject: [PATCH] Add test 248: Check filesystem FITRIM implementation Date: Fri, 10 Dec 2010 16:53:27 +0100 Message-Id: <1291996407-26251-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1291996418 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean FITRIM ioctl is used on a mounted filesystem to discard (or "trim") blocks which are not in use by the filesystem. This is useful for solid-state drives (SSDs) and thinly-provi-sioned storage. This test helps to verify filesystem FITRIM implementation to assure that it does not corrupts data. This test creates checksums of all files in /usr/share/doc directory and run several processes which clear its working directory on SCRATCH_MNT, then copy everything from /usr/share/doc into its working directory, create list of files in working directory and its checksums and compare it with the original list of checksums. Every process works in the loop so it repeat remove->copy->check, while fstrim tool is running simultaneously. Fstrim is just a helper tool which uses FITRIM ioctl to actually do the filesystem discard. I found this very useful because when the FITRIM is really buggy (thus data-destroying) the 248 test will notice, because checksums will most likely change. Signed-off-by: Lukas Czerner --- 248 | 184 +++++++++++++++++++++++++++++++++++++++++ 248.out | 3 + group | 1 + src/Makefile | 2 +- src/fstrim.c | 257 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 446 insertions(+), 1 deletions(-) create mode 100755 248 create mode 100644 248.out create mode 100644 src/fstrim.c diff --git a/248 b/248 new file mode 100755 index 0000000..a6cfce2 --- /dev/null +++ b/248 @@ -0,0 +1,184 @@ +#!/bin/bash +# FS QA Test No. 248 +# +# This test was created in order to verify filesystem FITRIM implementation. +# By many concurrent copy and remove operations and checking that files +# does not change after copied into SCRATCH_MNT test if FITRIM implementation +# corrupts the filesystem (data/metadata). +# +#----------------------------------------------------------------------- +# Copyright 2010 (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 +#----------------------------------------------------------------------- + +owner=lczerner@redhat.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=`mktemp -d` +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 3 +trap "_destroy; exit \$status" 2 15 +chpid=0 +mypid=$$ + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_require_scratch +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +_cleanup() +{ + rm -rf $tmp +} + +_destroy() +{ + kill $pids $fstrim_pid + wait $pids $fstrim_pid + rm -rf $tmp +} + +_destroy_fstrim() +{ + kill $fpid + wait $fpid +} + +_fail() +{ + echo "$1" + kill $mypid +} + +## +# Background FSTRIM loop. We are trimming the device in the loop and for +# better test coverage, we are doing whole device trim followed by several +# smaller trims. +## +fstrim_loop() +{ + trap "_destroy_fstrim; exit \$status" 2 15 + fsize=$(df | grep $SCRATCH_MNT | grep $SCRATCH_DEV | awk '{print $2}') + + while true ; do + step=1048576 + start=0 + $here/src/fstrim $SCRATCH_MNT & + fpid=$! + wait $fpid + while [ $start -lt $fsize ] ; do + $here/src/fstrim -s ${start}k -l ${step}k $SCRATCH_MNT & + fpid=$! + + ## + # All the waiting is done because Bash is incredibly + # stupid. As you know, fstrim_loop is run at background + # and when the test is over, or when it is killed (with + # ^C), because of trap, it tries to kill fstrim_loop. + # However, it does not kill currently running commands, + # so fstrim might be still running making it impossible + # to umount the SCRATCH_MNT and hence resulting in + # error. + ## + wait $fpid + start=$(( $start + $step )) + done + done +} + +function check_sums() { + dir=$1 + + ( + cd $SCRATCH_MNT/$p + find -P . -xdev -type f -print0 | xargs -0 md5sum | sort -o $tmp/stress.$$.$p + ) + + diff $tmp/content.sums $tmp/stress.$$.$p + if [ $? -ne 0 ]; then + _fail "!!!Checksums has changed - Filesystem possibly corrupted!!!\n" + fi + rm -f $tmp/stress.$$.$p +} + +function run_process() { + local p=$1 + repeat=10 + trap "kill $chpid; wait $chpid" 2 15 + + sleep $((10*$p))s & + export chpid=$! && wait $chpid &> /dev/null + chpid=0 + + while [ $repeat -gt 0 ]; do + + # Remove old directories. + rm -rf $SCRATCH_MNT/$p + export chpid=$! && wait $chpid &> /dev/null + + # Copy content -> partition. + mkdir $SCRATCH_MNT/$p + cp -ax $content/* $SCRATCH_MNT/$p + export chpid=$! && wait $chpid &> /dev/null + + check_sums + repeat=$(( $repeat - 1 )) + done +} + +nproc=20 +content=/usr/share/doc + +# Check for FITRIM support +echo -n "Checking FITRIM support: " +$here/src/fstrim -l 10M $SCRATCH_MNT +[ $? -ne 0 ] && exit +echo "done." + +mkdir -p $tmp + +( +cd $content +find -P . -xdev -type f -print0 | xargs -0 md5sum | sort -o $tmp/content.sums +) + +echo -n "Running the test: " +pids="" +fstrim_loop & +fstrim_pid=$! +p=1 +while [ $p -le $nproc ]; do + run_process $p & + pids="$pids $!" + p=$(($p+1)) +done +echo "done." + +wait $pids +kill $fstrim_pid +wait $fstrim_pid + +status=0 + +exit diff --git a/248.out b/248.out new file mode 100644 index 0000000..880d9c7 --- /dev/null +++ b/248.out @@ -0,0 +1,3 @@ +QA output created by 248 +Checking FITRIM support: done. +Running the test: done. diff --git a/group b/group index 0f94dd9..19eec07 100644 --- a/group +++ b/group @@ -361,3 +361,4 @@ deprecated 245 auto quick dir 246 auto quick rw 247 auto quick rw +248 ioctl trim diff --git a/src/Makefile b/src/Makefile index b827bd0..885fd65 100644 --- a/src/Makefile +++ b/src/Makefile @@ -17,7 +17,7 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ preallo_rw_pattern_writer ftrunc trunc fs_perms testx looptest \ locktest unwritten_mmap bulkstat_unlink_test t_stripealign \ bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable \ - stale_handle + stale_handle fstrim SUBDIRS = diff --git a/src/fstrim.c b/src/fstrim.c new file mode 100644 index 0000000..45ad841 --- /dev/null +++ b/src/fstrim.c @@ -0,0 +1,257 @@ +/* + * fstrim.c -- discard the part (or whole) of mounted filesystem. + * + * Copyright (C) 2009 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, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * This program uses FITRIM ioctl to discard parts or the whole filesystem + * online (mounted). You can specify range (start and lenght) to be + * discarded, or simply discard while filesystem. + * + * Usage: fstrim [options] + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#ifndef FITRIM +struct fstrim_range { + uint64_t start; + uint64_t len; + uint64_t minlen; +}; +#define FITRIM _IOWR('X', 121, struct fstrim_range) +#endif + +const char *program_name = "fstrim"; + +struct options { + struct fstrim_range *range; + char mpoint[PATH_MAX]; + char verbose; +}; + +static void usage(void) +{ + fprintf(stderr, + "Usage: %s [-s start] [-l length] [-m minimum-extent]" + " [-v] {mountpoint}\n\t" + "-s Starting Byte to discard from\n\t" + "-l Number of Bytes to discard from the start\n\t" + "-m Minimum extent length to discard\n\t" + "-v Verbose - number of discarded bytes\n", + program_name); +} + +static void err_exit(const char *fmt, ...) +{ + va_list pvar; + va_start(pvar, fmt); + vfprintf(stderr, fmt, pvar); + va_end(pvar); + usage(); + exit(EXIT_FAILURE); +} + +/** + * Get the number from argument. It can be number followed by + * units: k|K, m|M, g|G, t|T + */ +static unsigned long long get_number(char **optarg) +{ + char *opt, *end; + unsigned long long number, max; + + /* get the max to avoid overflow */ + max = ULLONG_MAX / 1024; + number = 0; + opt = *optarg; + + if (*opt == '-') { + err_exit("%s: %s (%s)\n", program_name, + strerror(ERANGE), *optarg); + } + + errno = 0; + number = strtoul(opt, &end , 0); + if (errno) + err_exit("%s: %s (%s)\n", program_name, + strerror(errno), *optarg); + + /* + * Convert units to numbers. Fall-through stack is used for units + * so absence of breaks is intentional. + */ + switch (*end) { + case 'T': /* terabytes */ + case 't': + if (number > max) + err_exit("%s: %s (%s)\n", program_name, + strerror(ERANGE), *optarg); + number *= 1024; + case 'G': /* gigabytes */ + case 'g': + if (number > max) + err_exit("%s: %s (%s)\n", program_name, + strerror(ERANGE), *optarg); + number *= 1024; + case 'M': /* megabytes */ + case 'm': + if (number > max) + err_exit("%s: %s (%s)\n", program_name, + strerror(ERANGE), *optarg); + number *= 1024; + case 'K': /* kilobytes */ + case 'k': + if (number > max) + err_exit("%s: %s (%s)\n", program_name, + strerror(ERANGE), *optarg); + number *= 1024; + end++; + case '\0': /* end of the string */ + break; + default: + err_exit("%s: %s (%s)\n", program_name, + strerror(EINVAL), *optarg); + return 0; + } + + if (*end != '\0') { + err_exit("%s: %s (%s)\n", program_name, + strerror(EINVAL), *optarg); + } + + return number; +} + +static int parse_opts(int argc, char **argv, struct options *opts) +{ + int c; + + while ((c = getopt(argc, argv, "s:l:m:v")) != EOF) { + switch (c) { + case 's': /* starting point */ + opts->range->start = get_number(&optarg); + break; + case 'l': /* length */ + opts->range->len = get_number(&optarg); + break; + case 'm': /* minlen */ + opts->range->minlen = get_number(&optarg); + break; + case 'v': /* verbose */ + opts->verbose = 1; + break; + default: + return EXIT_FAILURE; + } + } + + return 0; +} + +int main(int argc, char **argv) +{ + struct options *opts; + struct stat sb; + int fd, err = 0, ret = EXIT_FAILURE; + + opts = malloc(sizeof(struct options)); + if (!opts) + err_exit("%s: malloc(): %s\n", program_name, strerror(errno)); + + opts->range = NULL; + opts->verbose = 0; + + if (argc > 1) + strncpy(opts->mpoint, argv[argc - 1], sizeof(opts->mpoint)); + + opts->range = calloc(1, sizeof(struct fstrim_range)); + if (!opts->range) { + fprintf(stderr, "%s: calloc(): %s\n", program_name, + strerror(errno)); + goto free_opts; + } + + opts->range->len = ULLONG_MAX; + + if (argc > 2) + err = parse_opts(argc, argv, opts); + + if (err) { + usage(); + goto free_opts; + } + + if (strnlen(opts->mpoint, 1) < 1) { + fprintf(stderr, "%s: You have to specify mount point.\n", + program_name); + usage(); + goto free_opts; + } + + if (stat(opts->mpoint, &sb) == -1) { + fprintf(stderr, "%s: %s: %s\n", program_name, + opts->mpoint, strerror(errno)); + usage(); + goto free_opts; + } + + if (!S_ISDIR(sb.st_mode)) { + fprintf(stderr, "%s: %s: (%s)\n", program_name, + opts->mpoint, strerror(ENOTDIR)); + usage(); + goto free_opts; + } + + fd = open(opts->mpoint, O_RDONLY); + if (fd < 0) { + fprintf(stderr, "%s: open(%s): %s\n", program_name, + opts->mpoint, strerror(errno)); + goto free_opts; + } + + if (ioctl(fd, FITRIM, opts->range)) { + fprintf(stderr, "%s: FSTRIM: %s\n", program_name, + strerror(errno)); + goto free_opts; + } + + if ((opts->verbose) && (opts->range)) + fprintf(stdout, "%lu Bytes were trimmed\n", opts->range->len); + + ret = EXIT_SUCCESS; + +free_opts: + if (opts) { + if (opts->range) + free(opts->range); + free(opts); + } + + return ret; +} -- 1.7.2.3 From aelder@sgi.com Fri Dec 10 11:53:47 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBAHrlUH041658 for ; Fri, 10 Dec 2010 11:53:47 -0600 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay2.corp.sgi.com (Postfix) with ESMTP id EE5FF304064; Fri, 10 Dec 2010 09:55:34 -0800 (PST) Received: from stout.americas.sgi.com (localhost6.localdomain6 [127.0.0.1]) by stout.americas.sgi.com (8.14.4/8.14.2) with ESMTP id oBAHtYcH017576; Fri, 10 Dec 2010 11:55:34 -0600 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.4/8.14.4/Submit) id oBAHtYP6017575; Fri, 10 Dec 2010 11:55:34 -0600 From: Alex Elder Message-Id: <201012101755.oBAHtYP6017575@stout.americas.sgi.com> Date: Fri, 10 Dec 2010 11:55:34 -0600 To: torvalds@linux-foundation.org Subject: [GIT PULL] XFS update for 2.6.37-rc6 Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org User-Agent: Heirloom mailx 12.5 7/5/10 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Linus, please pull the following change in for XFS. It fixes a regression that went into 2.6.37-rc1. Thanks. -Alex The following changes since commit 6313e3c21743cc88bb5bd8aa72948ee1e83937b6: Merge branches 'x86-fixes-for-linus', 'perf-fixes-for-linus' and... are available in the git repository at: git://oss.sgi.com/xfs/xfs for-linus Christoph Hellwig (1): xfs: log timestamp changes to the source inode in rename fs/xfs/xfs_rename.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) From birikimhaber@gmail.com Sat Dec 11 00:50:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.3 required=5.0 tests=BAYES_99,FREEMAIL_FROM, MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBB6oWUi141126 for ; Sat, 11 Dec 2010 00:50:32 -0600 X-ASG-Debug-ID: 1292050340-77af032c0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from server.netprox.tk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9D9001CB2FAE for ; Fri, 10 Dec 2010 22:52:21 -0800 (PST) Received: from server.netprox.tk (netprox.tk [85.153.32.42]) by cuda.sgi.com with ESMTP id a6Q5TAOR1uXrDWqy for ; Fri, 10 Dec 2010 22:52:21 -0800 (PST) Received: from [83.66.120.213] (helo=isa.local) by server.netprox.tk with esmtpa (Exim 4.67) (envelope-from ) id 1PRM6q-0005zt-GE for linux-xfs@oss.sgi.com; Sat, 11 Dec 2010 11:51:20 +0200 Message-ID: From: "=?iso-8859-9?B?RGlqaXRhbCBQcm9k/GtzaXlvbg==?=" To: X-ASG-Orig-Subj: yepyeni bir haber sitesi www.birikimhaber.com Subject: yepyeni bir haber sitesi www.birikimhaber.com Date: Sat, 11 Dec 2010 08:52:02 +0200 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-9" Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: netprox.tk[85.153.32.42] X-Barracuda-Start-Time: 1292050341 X-Barracuda-Bayes: INNOCENT GLOBAL 0.7153 1.0000 1.4870 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.49 X-Barracuda-Spam-Status: No, SCORE=1.49 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49092 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Art=FDk T=FCrkiye'nin gen=E7. dinamik, =F6zg=FCr ve =F6zg=FCn bir haber = sitesi var www.birikimhaber.com From torvalds@linux-foundation.org Sat Dec 11 21:20:54 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBC3KrYY063574 for ; Sat, 11 Dec 2010 21:20:54 -0600 X-ASG-Debug-ID: 1292124163-629c01380000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp1.linux-foundation.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 69EF8143DBC9 for ; Sat, 11 Dec 2010 19:22:43 -0800 (PST) Received: from smtp1.linux-foundation.org (smtp1.linux-foundation.org [140.211.169.13]) by cuda.sgi.com with ESMTP id xeiM7Iyavcd71HM2 for ; Sat, 11 Dec 2010 19:22:43 -0800 (PST) Received: from mail-iw0-f178.google.com (mail-iw0-f178.google.com [209.85.214.178]) (authenticated bits=0) by smtp1.linux-foundation.org (8.14.2/8.13.5/Debian-3ubuntu1.1) with ESMTP id oBC3McGT008080 (version=TLSv1/SSLv3 cipher=RC4-MD5 bits=128 verify=FAIL) for ; Sat, 11 Dec 2010 19:22:38 -0800 Received: by iwn1 with SMTP id 1so7722798iwn.37 for ; Sat, 11 Dec 2010 19:22:36 -0800 (PST) Received: by 10.231.36.195 with SMTP id u3mr832283ibd.41.1292124156049; Sat, 11 Dec 2010 19:22:36 -0800 (PST) MIME-Version: 1.0 Received: by 10.231.31.72 with HTTP; Sat, 11 Dec 2010 19:22:16 -0800 (PST) From: Linus Torvalds Date: Sat, 11 Dec 2010 19:22:16 -0800 Message-ID: X-ASG-Orig-Subj: Re: [GIT PULL] Please pull xyzzy fixes Subject: Re: [GIT PULL] Please pull xyzzy fixes To: Trond Myklebust , Len Brown , Liam Girdwood , Mark Brown , Alex Elder , Tejun Heo , Hitoshi Mitake , Sage Weil , Takashi Iwai , Borislav Petkov , Steve French Cc: linux-kernel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-pm@lists.linux-foundation.org, xfs@oss.sgi.com, ceph-devel@vger.kernel.org, linux-cifs@vger.kernel.org Content-Type: text/plain; charset=ISO-8859-1 X-MIMEDefang-Filter: lf$Revision: 1.188 $ X-Scanned-By: MIMEDefang 2.63 on 140.211.169.13 X-Barracuda-Connect: smtp1.linux-foundation.org[140.211.169.13] X-Barracuda-Start-Time: 1292124164 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49173 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, Dec 10, 2010 at 10:05 AM, Trond Myklebust wrote: > Resending pull request after appending Chuck's fix for the nfs_umount() panic. [ .. and other people have other similar pull requests - acpi, ceph, cifs, xfs etc ] Right now I'm traveling without access to my laptop to actually do pulls. That was unintentional, but my laptop got co-opted for more important stuff (child needed it for school an my other laptop has a broken harddisk), so I've just been reading email with my cellphone. That allows me to keep up-to-date and mark the stuff that I'm scheduling for pulling, but I end up not replying a lot because typing is so painful and it does that silly html email thing. Anyway, this is just a reply to say that I've not lost your emails, I'm just effectively partly offline until Monday. I just stole Dirk's laptop just to write a reply-to-all (or at least a "reply-to-most"). Linus From loan@mail.penghu.gov.tw Sun Dec 12 00:38:44 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.1 required=5.0 tests=BAYES_99,J_CHICKENPOX_42 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBC6chue085560 for ; Sun, 12 Dec 2010 00:38:44 -0600 X-ASG-Debug-ID: 1292136031-46a4029a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsqr.penghu.gov.tw (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id F230F143DE16 for ; Sat, 11 Dec 2010 22:40:31 -0800 (PST) Received: from mailsqr.penghu.gov.tw (mailsqr.penghu.gov.tw [163.29.98.117]) by cuda.sgi.com with ESMTP id Ad9yxG5uTmnmcpYh for ; Sat, 11 Dec 2010 22:40:31 -0800 (PST) Received: from mail.penghu.gov.tw (mail.penghu.gov.tw [172.30.10.30]) by mailsqr.penghu.gov.tw with ESMTP id oBC5p5x1006426; Sun, 12 Dec 2010 13:51:27 +0800 (CST) (envelope-from loan@mail.penghu.gov.tw) Received: from mail.penghu.gov.tw (localhost.localdomain [127.0.0.1]) by mail.penghu.gov.tw (8.12.10/8.12.10) with ESMTP id oBC5jaQ6013240; Sun, 12 Dec 2010 13:45:37 +0800 From: "Standard Finance" Reply-To: n.standard.application@gamil.com X-ASG-Orig-Subj: Loan assistance @ 3% interest rate..... Subject: Loan assistance @ 3% interest rate..... Date: Sun, 12 Dec 2010 13:45:36 +0800 Message-Id: <20101212055056.M66569@mail.penghu.gov.tw> X-Mailer: Open WebMail 2.41 20041116 X-OriginatingIP: 41.190.2.3 (l2044551) MIME-Version: 1.0 Content-Type: text/plain; charset=big5 To: undisclosed-recipients:; X-MAIL: mailsqr.penghu.gov.tw oBC5p5x1006426 X-Barracuda-Connect: mailsqr.penghu.gov.tw[163.29.98.117] X-Barracuda-Start-Time: 1292136032 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4720 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49187 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Welcome to the Standard Finance & Loan,we are cooperative financial institution that is owned and controlled by its members and operated for the purpose of promoting thrift, providing credit at reasonable rates, and providing other financial assistance such as loan at 3% interest rate for local and international borrowers. We provide all kinds of loan. If you are interested in securing a loan with us, please Email Us At: STANDARD FINANCE & LOAN PLC. E-mail: n.standard.application@gamil.com Standard finance house #40 Fourth Avenue Gillingham Kent ME7 2LS,United Kingdom. Regards Marketers ==================================================================== ¥»¶l¥ó¶È±ÂÅv­ìµo«H¤H«ü©w¤§¦¬«H¤H¾\Äý¡A«D¸g±ÂÅv½Ð¤ÅÂà±H¡C°²¨Ï±z¦b¥¼¸g±ÂÅvªº±¡§Î¤U¦¬¨ì¥»¶l¥ó¡A·Ð½Ð±z§iª¾­ìµo«H¤H¡A¨Ã½ÐºÉ¥i¯à±N¥»¶l¥ó©ó­Ó¤H¹q¸£»P¹q¤l¶l¥ó¦øªA¾¹¤¤§R°£¡C¥»¶l¥ó»P¼ê´ò¿¤¬F©²·~°ÈµLÃö¤§¤º®e¡A¤£±oµø¬°¥»©²ªº¥ß³õ©Î·N¨£¡CThe privileged information contained in this email is intended for use only by the addressee(s) as indicated by the original author of this email. If you are not the original addressee of this email, please kindly inform the original author and delete all copies of it from your computer and mail server. Any information in this email that does not relate to the official business of Penghu County Government shall be deemed as neither given nor endorsed by Penghu County Government. From loan@mail.penghu.gov.tw Sun Dec 12 00:39:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.1 required=5.0 tests=BAYES_99,J_CHICKENPOX_42 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBC6d19U085589 for ; Sun, 12 Dec 2010 00:39:01 -0600 X-ASG-Debug-ID: 1292136050-01a801bf0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsqr.penghu.gov.tw (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CA5CE1E0BEF for ; Sat, 11 Dec 2010 22:40:50 -0800 (PST) Received: from mailsqr.penghu.gov.tw (mailsqr.penghu.gov.tw [163.29.98.117]) by cuda.sgi.com with ESMTP id 50mNJS1du54s2PI7 for ; Sat, 11 Dec 2010 22:40:50 -0800 (PST) Received: from mail.penghu.gov.tw (mail.penghu.gov.tw [172.30.10.30]) by mailsqr.penghu.gov.tw with ESMTP id oBC5p51k006425; Sun, 12 Dec 2010 13:51:27 +0800 (CST) (envelope-from loan@mail.penghu.gov.tw) Received: from mail.penghu.gov.tw (localhost.localdomain [127.0.0.1]) by mail.penghu.gov.tw (8.12.10/8.12.10) with ESMTP id oBC5kxQ6013300; Sun, 12 Dec 2010 13:46:59 +0800 From: "Standard Finance" Reply-To: n.standard.application@gamil.com X-ASG-Orig-Subj: Loan assistance @ 3% interest rate..... Subject: Loan assistance @ 3% interest rate..... Date: Sun, 12 Dec 2010 13:46:59 +0800 Message-Id: <20101212055055.M86247@mail.penghu.gov.tw> X-Mailer: Open WebMail 2.41 20041116 X-OriginatingIP: 41.190.2.3 (l2044551) MIME-Version: 1.0 Content-Type: text/plain; charset=big5 To: undisclosed-recipients:; X-MAIL: mailsqr.penghu.gov.tw oBC5p51k006425 X-Barracuda-Connect: mailsqr.penghu.gov.tw[163.29.98.117] X-Barracuda-Start-Time: 1292136051 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4394 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49186 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Welcome to the Standard Finance & Loan,we are cooperative financial institution that is owned and controlled by its members and operated for the purpose of promoting thrift, providing credit at reasonable rates, and providing other financial assistance such as loan at 3% interest rate for local and international borrowers. We provide all kinds of loan. If you are interested in securing a loan with us, please Email Us At: STANDARD FINANCE & LOAN PLC. E-mail: n.standard.application@gamil.com Standard finance house #40 Fourth Avenue Gillingham Kent ME7 2LS,United Kingdom. Regards Marketers ==================================================================== ¥»¶l¥ó¶È±ÂÅv­ìµo«H¤H«ü©w¤§¦¬«H¤H¾\Äý¡A«D¸g±ÂÅv½Ð¤ÅÂà±H¡C°²¨Ï±z¦b¥¼¸g±ÂÅvªº±¡§Î¤U¦¬¨ì¥»¶l¥ó¡A·Ð½Ð±z§iª¾­ìµo«H¤H¡A¨Ã½ÐºÉ¥i¯à±N¥»¶l¥ó©ó­Ó¤H¹q¸£»P¹q¤l¶l¥ó¦øªA¾¹¤¤§R°£¡C¥»¶l¥ó»P¼ê´ò¿¤¬F©²·~°ÈµLÃö¤§¤º®e¡A¤£±oµø¬°¥»©²ªº¥ß³õ©Î·N¨£¡CThe privileged information contained in this email is intended for use only by the addressee(s) as indicated by the original author of this email. If you are not the original addressee of this email, please kindly inform the original author and delete all copies of it from your computer and mail server. Any information in this email that does not relate to the official business of Penghu County Government shall be deemed as neither given nor endorsed by Penghu County Government. From loan@mail.penghu.gov.tw Sun Dec 12 00:40:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.1 required=5.0 tests=BAYES_99,J_CHICKENPOX_42 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBC6e4tF085652 for ; Sun, 12 Dec 2010 00:40:05 -0600 X-ASG-Debug-ID: 1292136113-0235005b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsqr.penghu.gov.tw (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 08A4C1CB97AA for ; Sat, 11 Dec 2010 22:41:54 -0800 (PST) Received: from mailsqr.penghu.gov.tw (mailsqr.penghu.gov.tw [163.29.98.117]) by cuda.sgi.com with ESMTP id OAqO6ETOlb7xYM8d for ; Sat, 11 Dec 2010 22:41:54 -0800 (PST) Received: from mail.penghu.gov.tw (mail.penghu.gov.tw [172.30.10.30]) by mailsqr.penghu.gov.tw with ESMTP id oBC5pNRO006529; Sun, 12 Dec 2010 13:51:34 +0800 (CST) (envelope-from loan@mail.penghu.gov.tw) Received: from mail.penghu.gov.tw (localhost.localdomain [127.0.0.1]) by mail.penghu.gov.tw (8.12.10/8.12.10) with ESMTP id oBC5mJQ6013357; Sun, 12 Dec 2010 13:48:19 +0800 From: "Standard Finance" Reply-To: n.standard.application@gamil.com X-ASG-Orig-Subj: Loan assistance @ 3% interest rate..... Subject: Loan assistance @ 3% interest rate..... Date: Sun, 12 Dec 2010 13:48:19 +0800 Message-Id: <20101212055121.M97424@mail.penghu.gov.tw> X-Mailer: Open WebMail 2.41 20041116 X-OriginatingIP: 41.190.2.3 (l2044551) MIME-Version: 1.0 Content-Type: text/plain; charset=big5 To: undisclosed-recipients:; X-MAIL: mailsqr.penghu.gov.tw oBC5pNRO006529 X-Barracuda-Connect: mailsqr.penghu.gov.tw[163.29.98.117] X-Barracuda-Start-Time: 1292136115 X-Barracuda-Bayes: INNOCENT GLOBAL 0.5120 1.0000 0.7500 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.75 X-Barracuda-Spam-Status: No, SCORE=0.75 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49186 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Welcome to the Standard Finance & Loan,we are cooperative financial institution that is owned and controlled by its members and operated for the purpose of promoting thrift, providing credit at reasonable rates, and providing other financial assistance such as loan at 3% interest rate for local and international borrowers. We provide all kinds of loan. If you are interested in securing a loan with us, please Email Us At: STANDARD FINANCE & LOAN PLC. E-mail: n.standard.application@gamil.com Standard finance house #40 Fourth Avenue Gillingham Kent ME7 2LS,United Kingdom. Regards Marketers ==================================================================== ¥»¶l¥ó¶È±ÂÅv­ìµo«H¤H«ü©w¤§¦¬«H¤H¾\Äý¡A«D¸g±ÂÅv½Ð¤ÅÂà±H¡C°²¨Ï±z¦b¥¼¸g±ÂÅvªº±¡§Î¤U¦¬¨ì¥»¶l¥ó¡A·Ð½Ð±z§iª¾­ìµo«H¤H¡A¨Ã½ÐºÉ¥i¯à±N¥»¶l¥ó©ó­Ó¤H¹q¸£»P¹q¤l¶l¥ó¦øªA¾¹¤¤§R°£¡C¥»¶l¥ó»P¼ê´ò¿¤¬F©²·~°ÈµLÃö¤§¤º®e¡A¤£±oµø¬°¥»©²ªº¥ß³õ©Î·N¨£¡CThe privileged information contained in this email is intended for use only by the addressee(s) as indicated by the original author of this email. If you are not the original addressee of this email, please kindly inform the original author and delete all copies of it from your computer and mail server. Any information in this email that does not relate to the official business of Penghu County Government shall be deemed as neither given nor endorsed by Penghu County Government. From SRS0+oHgL+16+fromorbit.com=david@internode.on.net Sun Dec 12 18:29:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_32, J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD0T7sc145354 for ; Sun, 12 Dec 2010 18:29:08 -0600 X-ASG-Debug-ID: 1292200256-767e01740000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7E8251E2F6B for ; Sun, 12 Dec 2010 16:30:57 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id VG2V59UFGmEOflWE for ; Sun, 12 Dec 2010 16:30:57 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49411567-1927428 for multiple; Mon, 13 Dec 2010 11:00:55 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PRwJP-0001el-Fl; Mon, 13 Dec 2010 11:30:43 +1100 Date: Mon, 13 Dec 2010 11:30:43 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: prevent NMI timeouts in cmn_err Subject: Re: [PATCH] xfs: prevent NMI timeouts in cmn_err Message-ID: <20101213003043.GC9925@dastard> References: <1291341315-31338-1-git-send-email-david@fromorbit.com> <20101203043846.GB23339@dastard> <20101210132935.GA24210@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101210132935.GA24210@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1292200258 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49257 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, Dec 10, 2010 at 08:29:35AM -0500, Christoph Hellwig wrote: > On Fri, Dec 03, 2010 at 03:38:46PM +1100, Dave Chinner wrote: > > FWIW, while these macros are the best way to make a simple backport > > is possible, I just discovered that mainline has a %pV format > > operator that allows an implementation like: > > > > void > > xfs_fs_cmn_err( > > const char *lvl, > > struct xfs_mount *mp, > > const char *fmt, > > ...) > > { > > struct va_format vaf; > > va_list args; > > > > va_start(args, fmt); > > vaf.fmt = fmt; > > vaf.va = &args; > > > > printk("%sFilesystem %s: %pV", lvl, mp->m_fsname, &vaf); > > va_end(args); > > > > BUG_ON(strncmp(lvl, KERN_EMERG, strlen(KERN_EMERG)) == 0); > > } > > With this we can also keep the existing integer-based CE_ values > and do trivial array lookup. That also avoids having to do a strcmp for > every message printed. Very true. Ok, so how do we want to process for this? I'm happy to drop the macro-ised patch and only use it as a backportable fix for old kernels - mainline appears to have a lot more functionality in this area than even recent distro kernels. Lachlan - is that an acceptable approach for you? It seems to me that the above is a much better way to start cleaning up the mainline code base, in the following way: 1. the above patch to remove the local message buffer + lock. 2. rationalise all the differences in error reporting down to a common interface 3. convert the common interface to use kernel log levels directly. The current trend seems to be to move towards logging interfaces with the following template: {sub_sys}_pr_{level}(priv, fmt, ...) Which in this case would give us: xfs_pr_debug(struct xfs_mount *mp, char *fmt, ...); xfs_pr_note(struct xfs_mount *mp, char *fmt, ...); .... xfs_pr_alert(struct xfs_mount *mp, char *fmt, ...); xfs_pr_emergency(struct xfs_mount *mp, char *fmt, ...); And a variant for the panic mask tagged version of xfs_pr_alert() of: xfs_pr_alert_tag(struct xfs_mount *mp, int tag, char *fmt, ...); I can't see any particular reason for needing to keep the separate parameter for the log level, nor for keeping all the different logging variants we currently have. I'm open to other ideas on the best way to rationalise all the logging we currently have - the above is just my current thoughts on what to do. I'm pushing this out as a proposal for discussion before I change anything as I don't relish the idea of iterating different logging APIs through patches... Cheers, Dave. > > -- Dave Chinner david@fromorbit.com From SRS0+Ksmg+16+fromorbit.com=dave@internode.on.net Sun Dec 12 19:07:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD176iH147279 for ; Sun, 12 Dec 2010 19:07:06 -0600 X-ASG-Debug-ID: 1292202535-0be801180000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 779CB1CBBA1F for ; Sun, 12 Dec 2010 17:08:56 -0800 (PST) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id EDwvCXBel6y2BiFB for ; Sun, 12 Dec 2010 17:08:56 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 38232230-1927428 for ; Mon, 13 Dec 2010 11:38:54 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PRwuA-0001jO-UG for xfs@oss.sgi.com; Mon, 13 Dec 2010 12:08:42 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PRwsh-0003zc-Iy for xfs@oss.sgi.com; Mon, 13 Dec 2010 12:07:11 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: =?UTF-8?q?=5BPATCH=5D=20xfs=3A=20provide=20a=20inode=20iolock=20lockdep=20class?= Subject: =?UTF-8?q?=5BPATCH=5D=20xfs=3A=20provide=20a=20inode=20iolock=20lockdep=20class?= Date: Mon, 13 Dec 2010 12:07:11 +1100 Message-Id: <1292202431-15320-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1292202537 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE_7582B X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49259 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE_7582B Custom Rule 7582B X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The XFS iolock needs to be re-initialised to a new lock class before it enters reclaim to prevent lockdep false positives. Unfortunately, this is not sufficient protection as inodes in the XFS_IRECLAIMABLE state can be recycled and not re-initialised before being reused. We need to re-initialise the lock state when transfering out of XFS_IRECLAIMABLE state to XFS_INEW, but we need to keep the same class as if the inode was just allocated. Hence we need a specific lockdep class variable for the iolock so that both initialisations use the same class. While there, add a specific class for inodes in the reclaim state so that it is easy to tell from lockdep reports what state the inode was in that generated the report. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_super.c | 2 ++ fs/xfs/xfs_iget.c | 19 +++++++++++++++++++ fs/xfs/xfs_inode.h | 2 ++ 3 files changed, 23 insertions(+), 0 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 064f964..c45b323 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1118,6 +1118,8 @@ xfs_fs_evict_inode( */ ASSERT(!rwsem_is_locked(&ip->i_iolock.mr_lock)); mrlock_init(&ip->i_iolock, MRLOCK_BARRIER, "xfsio", ip->i_ino); + lockdep_set_class_and_name(&ip->i_iolock.mr_lock, + &xfs_iolock_reclaimable, "xfs_iolock_reclaimable"); xfs_inactive(ip); } diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index 0cdd269..cdb1c25 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c @@ -43,6 +43,17 @@ /* + * Define xfs inode iolock lockdep classes. We need to ensure that all active + * inodes are considered the same for lockdep purposes, including inodes that + * are recycled through the XFS_IRECLAIMABLE state. This is the the only way to + * guarantee the locks are considered the same when there are multiple lock + * initialisation siteÑ•. Also, define a reclaimable inode class so it is + * obvious in lockdep reports which class the report is against. + */ +static struct lock_class_key xfs_iolock_active; +struct lock_class_key xfs_iolock_reclaimable; + +/* * Allocate and initialise an xfs_inode. */ STATIC struct xfs_inode * @@ -71,6 +82,8 @@ xfs_inode_alloc( ASSERT(completion_done(&ip->i_flush)); mrlock_init(&ip->i_iolock, MRLOCK_BARRIER, "xfsio", ip->i_ino); + lockdep_set_class_and_name(&ip->i_iolock.mr_lock, + &xfs_iolock_active, "xfs_iolock_active"); /* initialise the xfs inode */ ip->i_ino = ino; @@ -218,6 +231,12 @@ xfs_iget_cache_hit( ip->i_flags |= XFS_INEW; __xfs_inode_clear_reclaim_tag(mp, pag, ip); inode->i_state = I_NEW; + + ASSERT(!rwsem_is_locked(&ip->i_iolock.mr_lock)); + mrlock_init(&ip->i_iolock, MRLOCK_BARRIER, "xfsio", ip->i_ino); + lockdep_set_class_and_name(&ip->i_iolock.mr_lock, + &xfs_iolock_active, "xfs_iolock_active"); + spin_unlock(&ip->i_flags_lock); write_unlock(&pag->pag_ici_lock); } else { diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index fb2ca2e..1c6514d 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -438,6 +438,8 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) #define XFS_IOLOCK_DEP(flags) (((flags) & XFS_IOLOCK_DEP_MASK) >> XFS_IOLOCK_SHIFT) #define XFS_ILOCK_DEP(flags) (((flags) & XFS_ILOCK_DEP_MASK) >> XFS_ILOCK_SHIFT) +extern struct lock_class_key xfs_iolock_reclaimable; + /* * Flags for xfs_itruncate_start(). */ -- 1.7.2.3 From SRS0+Ksmg+16+fromorbit.com=dave@internode.on.net Sun Dec 12 19:21:53 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD1LrIn147865 for ; Sun, 12 Dec 2010 19:21:53 -0600 X-ASG-Debug-ID: 1292203422-2268011b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A078D1E29A4 for ; Sun, 12 Dec 2010 17:23:43 -0800 (PST) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id oZPiz5LLQfgT719x for ; Sun, 12 Dec 2010 17:23:43 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 38234065-1927428 for ; Mon, 13 Dec 2010 11:53:42 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PRx8T-0001kt-Kh; Mon, 13 Dec 2010 12:23:29 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PRx70-00043s-58; Mon, 13 Dec 2010 12:21:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: linux-kernel@vger.kernel.org, a.p.zijlstra@chello.nl X-ASG-Orig-Subj: =?UTF-8?q?=5BPATCH=201/3=5D=20lib=3A=20percpu=20counter=20add=20unless=20less=20than=20functionality?= Subject: =?UTF-8?q?=5BPATCH=201/3=5D=20lib=3A=20percpu=20counter=20add=20unless=20less=20than=20functionality?= Date: Mon, 13 Dec 2010 12:21:51 +1100 Message-Id: <1292203313-15570-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292203313-15570-1-git-send-email-david@fromorbit.com> References: <1292203313-15570-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1292203424 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49261 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner To use the generic percpu counter infrastructure for counters that require conditional addition based on a threshold value we need special handling of the counter. Further, the caller needs to know the status of the conditional addition to determine what action to take depending on whether the addition occurred or not. Examples of this sort of usage are resource counters that cannot go below zero (e.g. filesystem free blocks). To allow XFS to replace it's complex roll-your-own per-cpu superblock counters, a single generic conditional function is required: percpu_counter_add_unless_lt(). This will add the amount to the counter unless the result would be less than the given threshold. A caller supplied threshold is required because XFS does not necessarily use the same threshold for every counter. percpu_counter_add_unless_lt() attempts to minimise counter lock traversals by only taking the counter lock when the threshold is within the error range of the current counter value. Hence when the threshold is not within the counter error range, the counter will still have the same scalability characteristics as the normal percpu_counter_add() function. Adding this functionality to the generic percpu counters allows us to remove the much more complex and less efficient XFS percpu counter code (~700 lines of code) and replace it with generic percpu counters. Signed-off-by: Dave Chinner --- include/linux/percpu_counter.h | 27 ++++++++++++++ lib/percpu_counter.c | 79 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 0 deletions(-) diff --git a/include/linux/percpu_counter.h b/include/linux/percpu_counter.h index 46f6ba5..ad18779 100644 --- a/include/linux/percpu_counter.h +++ b/include/linux/percpu_counter.h @@ -41,12 +41,21 @@ void percpu_counter_set(struct percpu_counter *fbc, s64 amount); void __percpu_counter_add(struct percpu_counter *fbc, s64 amount, s32 batch); s64 __percpu_counter_sum(struct percpu_counter *fbc); int percpu_counter_compare(struct percpu_counter *fbc, s64 rhs); +int __percpu_counter_add_unless_lt(struct percpu_counter *fbc, s64 amount, + s64 threshold, s32 batch); static inline void percpu_counter_add(struct percpu_counter *fbc, s64 amount) { __percpu_counter_add(fbc, amount, percpu_counter_batch); } +static inline int percpu_counter_add_unless_lt(struct percpu_counter *fbc, + s64 amount, s64 threshold) +{ + return __percpu_counter_add_unless_lt(fbc, amount, threshold, + percpu_counter_batch); +} + static inline s64 percpu_counter_sum_positive(struct percpu_counter *fbc) { s64 ret = __percpu_counter_sum(fbc); @@ -153,6 +162,24 @@ static inline int percpu_counter_initialized(struct percpu_counter *fbc) return 1; } +static inline int percpu_counter_add_unless_lt(struct percpu_counter *fbc, s64 amount, + s64 threshold) +{ + s64 count; + int ret = â€1; + + preempt_disable(); + count = fbc->count + amount; + if (count < threshold) + goto out; + fbc->count = count; + ret = count == threshold ? 0 : 1; +out: + preempt_enable(); + return ret; +} + + #endif /* CONFIG_SMP */ static inline void percpu_counter_inc(struct percpu_counter *fbc) diff --git a/lib/percpu_counter.c b/lib/percpu_counter.c index 604678d..eacccb7 100644 --- a/lib/percpu_counter.c +++ b/lib/percpu_counter.c @@ -213,6 +213,85 @@ int percpu_counter_compare(struct percpu_counter *fbc, s64 rhs) } EXPORT_SYMBOL(percpu_counter_compare); +/** + * __percpu_counter_add_unless_lt - add to a counter avoiding underruns + * @fbc: counter + * @amount: amount to add + * @threshold: underrun threshold + * @batch: percpu counter batch size. + * + * Add @amount to @fdc if and only if result of addition is greater than or + * equal to @threshold Return 1 if greater and added, 0 if equal and added + * and -1 if and underrun would have occured. + * + * This is useful for operations that must accurately and atomically only add a + * delta to a counter if the result is greater than a given (e.g. for freespace + * accounting with ENOSPC checking in filesystems). + */ +int __percpu_counter_add_unless_lt(struct percpu_counter *fbc, s64 amount, + s64 threshold, s32 batch) +{ + s64 count; + s64 error = 2 * batch * num_online_cpus(); + int cpu; + int ret = -1; + + preempt_disable(); + + /* Check to see if rough count will be sufficient for comparison */ + count = percpu_counter_read(fbc); + if (count + amount < threshold - error) + goto out; + + /* + * If the counter is over the threshold and the change is less than the + * batch size, we might be able to avoid locking. + */ + if (count > threshold + error && abs(amount) < batch) { + __percpu_counter_add(fbc, amount, batch); + ret = 1; + goto out; + } + + /* + * If the result is over the error threshold, we can just add it + * into the global counter ignoring what is in the per-cpu counters + * as they will not change the result of the calculation. + */ + spin_lock(&fbc->lock); + if (fbc->count + amount > threshold + error) { + fbc->count += amount; + ret = 1; + goto out_unlock; + } + + /* + * Result is withing the error margin. Run an open-coded sum of the + * per-cpu counters to get the exact value at this point in time, + * and if the result greater than the threshold, add the amount to + * the global counter. + */ + count = fbc->count; + for_each_online_cpu(cpu) { + s32 *pcount = per_cpu_ptr(fbc->counters, cpu); + count += *pcount; + } + WARN_ON(count < threshold); + + if (count + amount >= threshold) { + ret = 0; + if (count + amount > threshold) + ret = 1; + fbc->count += amount; + } +out_unlock: + spin_unlock(&fbc->lock); +out: + preempt_enable(); + return ret; +} +EXPORT_SYMBOL(percpu_counter_add_unless_lt); + static int __init percpu_counter_startup(void) { compute_batch_value(); -- 1.7.2.3 From SRS0+w8Wj+16+fromorbit.com=dave@internode.on.net Sun Dec 12 19:21:58 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD1LvNv147874 for ; Sun, 12 Dec 2010 19:21:57 -0600 X-ASG-Debug-ID: 1292203427-0be901b00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3B0481CBC2F5 for ; Sun, 12 Dec 2010 17:23:48 -0800 (PST) Received: from mail.internode.on.net (bld-mail20.adl6.internode.on.net [150.101.137.105]) by cuda.sgi.com with ESMTP id g3kgvHDXRNQCwYvA for ; Sun, 12 Dec 2010 17:23:48 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 4410429-1927428 for multiple; Mon, 13 Dec 2010 11:53:41 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PRx8T-0001ks-J3; Mon, 13 Dec 2010 12:23:29 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PRx70-00043q-3O; Mon, 13 Dec 2010 12:21:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: linux-kernel@vger.kernel.org, a.p.zijlstra@chello.nl X-ASG-Orig-Subj: [PATCH 0/3] Use generic percpu counters in XFS V2 Subject: [PATCH 0/3] Use generic percpu counters in XFS V2 Date: Mon, 13 Dec 2010 12:21:50 +1100 Message-Id: <1292203313-15570-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 X-Barracuda-Connect: bld-mail20.adl6.internode.on.net[150.101.137.105] X-Barracuda-Start-Time: 1292203429 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49261 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This series replaces the XFS per-cpu superblock counters with generic per-cpu counters. It adds a specialised operation to the generic counter implementation and then switches the XFS percpu superblock counters over to use the generic percpu counter implementation. The result is several hundred lines of complex code removed from XFS. Version 2: - use wrappers for percpu_counter_add_unless_lt() to allow custom batch sizes to be used. - removed xfs_icsb_*() wrappers from percpu counters. - cleaned up split of xfs_icsb_modify_counters(). From SRS0+Ksmg+16+fromorbit.com=dave@internode.on.net Sun Dec 12 19:22:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_64, J_CHICKENPOX_65,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD1M6q8147909 for ; Sun, 12 Dec 2010 19:22:06 -0600 X-ASG-Debug-ID: 1292203434-76f602770000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 351F61CBC306 for ; Sun, 12 Dec 2010 17:23:55 -0800 (PST) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id EI792UySx7YgzkYl for ; Sun, 12 Dec 2010 17:23:55 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 38234066-1927428 for multiple; Mon, 13 Dec 2010 11:53:43 +1030 (CDT) Received: from [192.168.1.1] (helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PRx8d-0001kw-M9; Mon, 13 Dec 2010 12:23:39 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PRx70-00043w-8o; Mon, 13 Dec 2010 12:21:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: linux-kernel@vger.kernel.org, a.p.zijlstra@chello.nl X-ASG-Orig-Subj: [PATCH 3/3] xfs: demultiplex xfs_icsb_modify_counters() Subject: [PATCH 3/3] xfs: demultiplex xfs_icsb_modify_counters() Date: Mon, 13 Dec 2010 12:21:53 +1100 Message-Id: <1292203313-15570-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292203313-15570-1-git-send-email-david@fromorbit.com> References: <1292203313-15570-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1292203437 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49261 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner With the conversion to percpu counters, xfs_icsb_modify_counters() really does not need to exist. Convert the inode counter modifications to use a common helper function for the one place that calls them, and add another function for the free block modification and convert all the callers to use that. Signed-off-by: Dave Chinner --- fs/xfs/xfs_bmap.c | 34 +++++------- fs/xfs/xfs_fsops.c | 3 +- fs/xfs/xfs_mount.c | 160 ++++++++++++++++++++++++--------------------------- fs/xfs/xfs_mount.h | 5 +- fs/xfs/xfs_trans.c | 23 +++---- 5 files changed, 102 insertions(+), 123 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 4111cd3..6a47556 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -614,8 +614,8 @@ xfs_bmap_add_extent( nblks += cur->bc_private.b.allocated; ASSERT(nblks <= da_old); if (nblks < da_old) - xfs_icsb_modify_counters(ip->i_mount, XFS_SBS_FDBLOCKS, - (int64_t)(da_old - nblks), rsvd); + xfs_icsb_modify_free_blocks(ip->i_mount, + (int64_t)(da_old - nblks), rsvd); } /* * Clear out the allocated field, done with it now in any case. @@ -1079,7 +1079,7 @@ xfs_bmap_add_extent_delay_real( diff = (int)(temp + temp2 - startblockval(PREV.br_startblock) - (cur ? cur->bc_private.b.allocated : 0)); if (diff > 0 && - xfs_icsb_modify_counters(ip->i_mount, XFS_SBS_FDBLOCKS, + xfs_icsb_modify_free_blocks(ip->i_mount, -((int64_t)diff), rsvd)) { /* * Ick gross gag me with a spoon. @@ -1090,8 +1090,7 @@ xfs_bmap_add_extent_delay_real( temp--; diff--; if (!diff || - !xfs_icsb_modify_counters(ip->i_mount, - XFS_SBS_FDBLOCKS, + !xfs_icsb_modify_free_blocks(ip->i_mount, -((int64_t)diff), rsvd)) break; } @@ -1099,8 +1098,7 @@ xfs_bmap_add_extent_delay_real( temp2--; diff--; if (!diff || - !xfs_icsb_modify_counters(ip->i_mount, - XFS_SBS_FDBLOCKS, + !xfs_icsb_modify_free_blocks(ip->i_mount, -((int64_t)diff), rsvd)) break; } @@ -1769,8 +1767,8 @@ xfs_bmap_add_extent_hole_delay( } if (oldlen != newlen) { ASSERT(oldlen > newlen); - xfs_icsb_modify_counters(ip->i_mount, XFS_SBS_FDBLOCKS, - (int64_t)(oldlen - newlen), rsvd); + xfs_icsb_modify_free_blocks(ip->i_mount, + (int64_t)(oldlen - newlen), rsvd); /* * Nothing to do for disk quota accounting here. */ @@ -3114,10 +3112,9 @@ xfs_bmap_del_extent( * Nothing to do for disk quota accounting here. */ ASSERT(da_old >= da_new); - if (da_old > da_new) { - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, - (int64_t)(da_old - da_new), rsvd); - } + if (da_old > da_new) + xfs_icsb_modify_free_blocks(ip->i_mount, + (int64_t)(da_old - da_new), rsvd); done: *logflagsp = flags; return error; @@ -4530,14 +4527,12 @@ xfs_bmapi( -((int64_t)extsz), (flags & XFS_BMAPI_RSVBLOCKS)); } else { - error = xfs_icsb_modify_counters(mp, - XFS_SBS_FDBLOCKS, + error = xfs_icsb_modify_free_blocks(mp, -((int64_t)alen), (flags & XFS_BMAPI_RSVBLOCKS)); } if (!error) { - error = xfs_icsb_modify_counters(mp, - XFS_SBS_FDBLOCKS, + error = xfs_icsb_modify_free_blocks(mp, -((int64_t)indlen), (flags & XFS_BMAPI_RSVBLOCKS)); if (error && rt) @@ -4546,8 +4541,7 @@ xfs_bmapi( (int64_t)extsz, (flags & XFS_BMAPI_RSVBLOCKS)); else if (error) - xfs_icsb_modify_counters(mp, - XFS_SBS_FDBLOCKS, + xfs_icsb_modify_free_blocks(mp, (int64_t)alen, (flags & XFS_BMAPI_RSVBLOCKS)); } @@ -5210,7 +5204,7 @@ xfs_bunmapi( ip, -((long)del.br_blockcount), 0, XFS_QMOPT_RES_RTBLKS); } else { - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, + xfs_icsb_modify_free_blocks(mp, (int64_t)del.br_blockcount, rsvd); (void)xfs_trans_reserve_quota_nblks(NULL, ip, -((long)del.br_blockcount), 0, diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index fb9a9c8..be34ff2 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -596,8 +596,7 @@ out: * the extra reserve blocks from the reserve..... */ int error; - error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, - fdblks_delta, 0); + error = xfs_icsb_modify_free_blocks(mp, fdblks_delta, 0); if (error == ENOSPC) goto retry; } diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 16be1b1..5e41ef3 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -332,6 +332,80 @@ xfs_icsb_sync_counters( percpu_counter_sum_positive(&mp->m_icsb[XFS_ICSB_FDBLOCKS]); } +int +xfs_icsb_modify_inodes( + struct xfs_mount *mp, + int cntr, + int64_t delta) +{ + int ret; + + ASSERT(cntr == XFS_ICSB_ICOUNT || cntr == XFS_ICSB_IFREE); + + ret = percpu_counter_add_unless_lt(&mp->m_icsb[cntr], + delta, 0); + if (likely(ret >= 0)) + return 0; + return ret; +} + +int +xfs_icsb_modify_free_blocks( + struct xfs_mount *mp, + int64_t delta, + int rsvd) +{ + int64_t lcounter; + int64_t res_used; + int ret; + + /* + * if we are putting blocks back, put them into the reserve + * block pool first. + */ + if (unlikely(mp->m_resblks != mp->m_resblks_avail) && delta > 0) { + spin_lock(&mp->m_sb_lock); + res_used = (int64_t)(mp->m_resblks - + mp->m_resblks_avail); + if (res_used > delta) { + mp->m_resblks_avail += delta; + delta = 0; + } else { + delta -= res_used; + mp->m_resblks_avail = mp->m_resblks; + } + spin_unlock(&mp->m_sb_lock); + if (!delta) + return 0; + } + + /* try the change */ + ret = percpu_counter_add_unless_lt(&mp->m_icsb[XFS_ICSB_FDBLOCKS], + delta, XFS_ALLOC_SET_ASIDE(mp)); + if (likely(ret >= 0)) + return 0; + + /* ENOSPC */ + ASSERT(delta < 0); + + if (!rsvd) + return XFS_ERROR(ENOSPC); + + spin_lock(&mp->m_sb_lock); + lcounter = (int64_t)mp->m_resblks_avail + delta; + if (lcounter >= 0) { + mp->m_resblks_avail = lcounter; + spin_unlock(&mp->m_sb_lock); + return 0; + } + spin_unlock(&mp->m_sb_lock); + printk_once(KERN_WARNING + "Filesystem \"%s\": reserve blocks depleted! " + "Consider increasing reserve pool size.", + mp->m_fsname); + return XFS_ERROR(ENOSPC); +} + /* * Check size of device based on the (data/realtime) block count. * Note: this check is used by the growfs code as well as mount. @@ -1857,7 +1931,7 @@ xfs_mod_incore_sb( * * Note that this function may not be used for the superblock values that * are tracked with the in-memory per-cpu counters - a direct call to - * xfs_icsb_modify_counters is required for these. + * xfs_icsb_modify_xxx is required for these. */ int xfs_mod_incore_sb_batch( @@ -1898,90 +1972,6 @@ unwind: return error; } -int -xfs_icsb_modify_counters( - xfs_mount_t *mp, - xfs_sb_field_t field, - int64_t delta, - int rsvd) -{ - int64_t lcounter; - int64_t res_used; - int ret = 0; - - - switch (field) { - case XFS_SBS_ICOUNT: - ret = percpu_counter_add_unless_lt(&mp->m_icsb[XFS_SBS_ICOUNT], - delta, 0); - if (ret < 0) { - ASSERT(0); - return XFS_ERROR(EINVAL); - } - return 0; - - case XFS_SBS_IFREE: - ret = percpu_counter_add_unless_lt(&mp->m_icsb[XFS_SBS_IFREE], - delta, 0); - if (ret < 0) { - ASSERT(0); - return XFS_ERROR(EINVAL); - } - return 0; - - case XFS_SBS_FDBLOCKS: - /* - * if we are putting blocks back, put them into the reserve - * block pool first. - */ - if (mp->m_resblks != mp->m_resblks_avail && delta > 0) { - spin_lock(&mp->m_sb_lock); - res_used = (int64_t)(mp->m_resblks - - mp->m_resblks_avail); - if (res_used > delta) { - mp->m_resblks_avail += delta; - delta = 0; - } else { - delta -= res_used; - mp->m_resblks_avail = mp->m_resblks; - } - spin_unlock(&mp->m_sb_lock); - if (!delta) - return 0; - } - - /* try the change */ - ret = percpu_counter_add_unless_lt(&mp->m_icsb[XFS_ICSB_FDBLOCKS], - delta, XFS_ALLOC_SET_ASIDE(mp)); - if (likely(ret >= 0)) - return 0; - - /* ENOSPC */ - ASSERT(delta < 0); - - if (!rsvd) - return XFS_ERROR(ENOSPC); - - spin_lock(&mp->m_sb_lock); - lcounter = (int64_t)mp->m_resblks_avail + delta; - if (lcounter >= 0) { - mp->m_resblks_avail = lcounter; - spin_unlock(&mp->m_sb_lock); - return 0; - } - spin_unlock(&mp->m_sb_lock); - printk_once(KERN_WARNING - "Filesystem \"%s\": reserve blocks depleted! " - "Consider increasing reserve pool size.", - mp->m_fsname); - return XFS_ERROR(ENOSPC); - default: - ASSERT(0); - return XFS_ERROR(EINVAL); - } - return 0; -} - /* * xfs_getsb() is called to obtain the buffer for the superblock. * The buffer is returned locked and read in from disk. diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 42d31df..03ad25c6 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -75,9 +75,6 @@ enum { XFS_ICSB_MAX, }; -extern int xfs_icsb_modify_counters(struct xfs_mount *, xfs_sb_field_t, - int64_t, int); - typedef struct xfs_mount { struct super_block *m_super; xfs_tid_t m_tid; /* next unused tid for fs */ @@ -333,6 +330,8 @@ extern int xfs_icsb_init_counters(struct xfs_mount *); extern void xfs_icsb_reinit_counters(struct xfs_mount *); extern void xfs_icsb_destroy_counters(struct xfs_mount *); extern void xfs_icsb_sync_counters(struct xfs_mount *); +extern int xfs_icsb_modify_inodes(struct xfs_mount *, int, int64_t); +extern int xfs_icsb_modify_free_blocks(struct xfs_mount *, int64_t, int); #endif /* __KERNEL__ */ diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index f6d956b..8139a2e 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -696,7 +696,7 @@ xfs_trans_reserve( * fail if the count would go below zero. */ if (blocks > 0) { - error = xfs_icsb_modify_counters(tp->t_mountp, XFS_SBS_FDBLOCKS, + error = xfs_icsb_modify_free_blocks(tp->t_mountp, -((int64_t)blocks), rsvd); if (error != 0) { current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); @@ -767,8 +767,8 @@ undo_log: undo_blocks: if (blocks > 0) { - xfs_icsb_modify_counters(tp->t_mountp, XFS_SBS_FDBLOCKS, - (int64_t)blocks, rsvd); + xfs_icsb_modify_free_blocks(tp->t_mountp, + (int64_t)blocks, rsvd); tp->t_blk_res = 0; } @@ -1045,22 +1045,19 @@ xfs_trans_unreserve_and_mod_sb( /* apply the per-cpu counters */ if (blkdelta) { - error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, - blkdelta, rsvd); + error = xfs_icsb_modify_free_blocks(mp, blkdelta, rsvd); if (error) goto out; } if (idelta) { - error = xfs_icsb_modify_counters(mp, XFS_SBS_ICOUNT, - idelta, rsvd); + error = xfs_icsb_modify_inodes(mp, XFS_ICSB_ICOUNT, idelta); if (error) goto out_undo_fdblocks; } if (ifreedelta) { - error = xfs_icsb_modify_counters(mp, XFS_SBS_IFREE, - ifreedelta, rsvd); + error = xfs_icsb_modify_inodes(mp, XFS_ICSB_IFREE, ifreedelta); if (error) goto out_undo_icount; } @@ -1129,15 +1126,15 @@ xfs_trans_unreserve_and_mod_sb( out_undo_ifreecount: if (ifreedelta) - xfs_icsb_modify_counters(mp, XFS_SBS_IFREE, -ifreedelta, rsvd); + xfs_icsb_modify_inodes(mp, XFS_ICSB_IFREE, -ifreedelta); out_undo_icount: if (idelta) - xfs_icsb_modify_counters(mp, XFS_SBS_ICOUNT, -idelta, rsvd); + xfs_icsb_modify_inodes(mp, XFS_ICSB_ICOUNT, -idelta); out_undo_fdblocks: if (blkdelta) - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, -blkdelta, rsvd); + xfs_icsb_modify_free_blocks(mp, -blkdelta, rsvd); out: - ASSERT(error = 0); + ASSERT(error == 0); return; } -- 1.7.2.3 From SRS0+Ksmg+16+fromorbit.com=dave@internode.on.net Sun Dec 12 19:22:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.4 required=5.0 tests=BAYES_00,J_CHICKENPOX_33, J_CHICKENPOX_63,J_CHICKENPOX_64,J_CHICKENPOX_65,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD1M5aW147904 for ; Sun, 12 Dec 2010 19:22:05 -0600 X-ASG-Debug-ID: 1292203432-5c1603070000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A6820143F7F1 for ; Sun, 12 Dec 2010 17:23:53 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id LKWPyQaEbqCQTpeM for ; Sun, 12 Dec 2010 17:23:52 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49618381-1927428 for ; Mon, 13 Dec 2010 11:53:51 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PRx8T-0001ku-Lv; Mon, 13 Dec 2010 12:23:29 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PRx70-00043u-6x; Mon, 13 Dec 2010 12:21:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: linux-kernel@vger.kernel.org, a.p.zijlstra@chello.nl X-ASG-Orig-Subj: [PATCH 2/3] xfs: use generic per-cpu counter infrastructure Subject: [PATCH 2/3] xfs: use generic per-cpu counter infrastructure Date: Mon, 13 Dec 2010 12:21:52 +1100 Message-Id: <1292203313-15570-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292203313-15570-1-git-send-email-david@fromorbit.com> References: <1292203313-15570-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1292203435 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49260 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner XFS has a per-cpu counter implementation for in-core superblock counters that pre-dated the generic implementation. It is complex and baroque as it is tailored directly to the needs of ENOSPC detection. Now that the generic percpu counter infrastructure has the percpu_counter_add_unless_lt() function that implements the necessary threshold checks for us, switch the XFS per-cpu superblock counters to use the generic percpu counter infrastructure. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_linux.h | 9 - fs/xfs/linux-2.6/xfs_super.c | 4 +- fs/xfs/xfs_fsops.c | 4 +- fs/xfs/xfs_mount.c | 802 ++++++++---------------------------------- fs/xfs/xfs_mount.h | 71 +--- 5 files changed, 171 insertions(+), 719 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_linux.h b/fs/xfs/linux-2.6/xfs_linux.h index 214ddd7..9fa4f2a 100644 --- a/fs/xfs/linux-2.6/xfs_linux.h +++ b/fs/xfs/linux-2.6/xfs_linux.h @@ -88,15 +88,6 @@ #include #include -/* - * Feature macros (disable/enable) - */ -#ifdef CONFIG_SMP -#define HAVE_PERCPU_SB /* per cpu superblock counters are a 2.6 feature */ -#else -#undef HAVE_PERCPU_SB /* per cpu superblock counters are a 2.6 feature */ -#endif - #define irix_sgid_inherit xfs_params.sgid_inherit.val #define irix_symlink_mode xfs_params.symlink_mode.val #define xfs_panic_mask xfs_params.panic_mask.val diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index c45b323..abcda07 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1229,9 +1229,9 @@ xfs_fs_statfs( statp->f_fsid.val[0] = (u32)id; statp->f_fsid.val[1] = (u32)(id >> 32); - xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); - spin_lock(&mp->m_sb_lock); + xfs_icsb_sync_counters(mp); + statp->f_bsize = sbp->sb_blocksize; lsize = sbp->sb_logstart ? sbp->sb_logblocks : 0; statp->f_blocks = sbp->sb_dblocks - lsize; diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index a7c116e..fb9a9c8 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -478,8 +478,8 @@ xfs_fs_counts( xfs_mount_t *mp, xfs_fsop_counts_t *cnt) { - xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); spin_lock(&mp->m_sb_lock); + xfs_icsb_sync_counters(mp); cnt->freedata = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); cnt->freertx = mp->m_sb.sb_frextents; cnt->freeino = mp->m_sb.sb_ifree; @@ -540,7 +540,7 @@ xfs_reserve_blocks( */ retry: spin_lock(&mp->m_sb_lock); - xfs_icsb_sync_counters_locked(mp, 0); + xfs_icsb_sync_counters(mp); /* * If our previous reservation was larger than the current value, diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 19e9dfa..16be1b1 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -46,19 +46,6 @@ STATIC void xfs_unmountfs_wait(xfs_mount_t *); - -#ifdef HAVE_PERCPU_SB -STATIC void xfs_icsb_balance_counter(xfs_mount_t *, xfs_sb_field_t, - int); -STATIC void xfs_icsb_balance_counter_locked(xfs_mount_t *, xfs_sb_field_t, - int); -STATIC void xfs_icsb_disable_counter(xfs_mount_t *, xfs_sb_field_t); -#else - -#define xfs_icsb_balance_counter(mp, a, b) do { } while (0) -#define xfs_icsb_balance_counter_locked(mp, a, b) do { } while (0) -#endif - static const struct { short offset; short type; /* 0 = integer @@ -281,6 +268,71 @@ xfs_free_perag( } /* + * Per-cpu incore superblock counters + * + * This provides distributed per cpu counters for contended fields (e.g. free + * block count). Difficulties arise in that the incore sb is used for ENOSPC + * checking, and hence needs to be accurately read when we are running low on + * space. Hence We need to check against counter error bounds and determine how + * accurately to sum based on that metric. The percpu counters take care of + * this for us, so we only need to modify the fast path to handle per-cpu + * counter error cases. + */ +void +xfs_icsb_reinit_counters( + struct xfs_mount *mp) +{ + percpu_counter_set(&mp->m_icsb[XFS_ICSB_FDBLOCKS], + mp->m_sb.sb_fdblocks); + percpu_counter_set(&mp->m_icsb[XFS_ICSB_IFREE], mp->m_sb.sb_ifree); + percpu_counter_set(&mp->m_icsb[XFS_ICSB_ICOUNT], mp->m_sb.sb_icount); +} + +int +xfs_icsb_init_counters( + struct xfs_mount *mp) +{ + int i; + int error; + + for (i = 0; i < XFS_ICSB_MAX; i++) { + error = percpu_counter_init(&mp->m_icsb[i], 0); + if (error) + goto out_error; + } + xfs_icsb_reinit_counters(mp); + return 0; + +out_error: + for (; i >= 0; i--) + percpu_counter_destroy(&mp->m_icsb[i]); + return error; +} + +void +xfs_icsb_destroy_counters( + xfs_mount_t *mp) +{ + int i; + + for (i = 0; i < XFS_ICSB_MAX; i++) + percpu_counter_destroy(&mp->m_icsb[i]); +} + +void +xfs_icsb_sync_counters( + xfs_mount_t *mp) +{ + assert_spin_locked(&mp->m_sb_lock); + mp->m_sb.sb_icount = + percpu_counter_sum_positive(&mp->m_icsb[XFS_ICSB_ICOUNT]); + mp->m_sb.sb_ifree = + percpu_counter_sum_positive(&mp->m_icsb[XFS_ICSB_IFREE]); + mp->m_sb.sb_fdblocks = + percpu_counter_sum_positive(&mp->m_icsb[XFS_ICSB_FDBLOCKS]); +} + +/* * Check size of device based on the (data/realtime) block count. * Note: this check is used by the growfs code as well as mount. */ @@ -1562,7 +1614,9 @@ xfs_log_sbcount( if (!xfs_fs_writable(mp)) return 0; - xfs_icsb_sync_counters(mp, 0); + spin_lock(&mp->m_sb_lock); + xfs_icsb_sync_counters(mp); + spin_unlock(&mp->m_sb_lock); /* * we don't need to do this if we are updating the superblock @@ -1674,9 +1728,8 @@ xfs_mod_incore_sb_unlocked( int64_t delta, int rsvd) { - int scounter; /* short counter for 32 bit fields */ - long long lcounter; /* long counter for 64 bit fields */ - long long res_used, rem; + int scounter = 0; /* short counter for 32 bit fields */ + long long lcounter = 0; /* long counter for 64 bit fields */ /* * With the in-core superblock spin lock held, switch @@ -1685,66 +1738,6 @@ xfs_mod_incore_sb_unlocked( * 0, then do not apply the delta and return EINVAL. */ switch (field) { - case XFS_SBS_ICOUNT: - lcounter = (long long)mp->m_sb.sb_icount; - lcounter += delta; - if (lcounter < 0) { - ASSERT(0); - return XFS_ERROR(EINVAL); - } - mp->m_sb.sb_icount = lcounter; - return 0; - case XFS_SBS_IFREE: - lcounter = (long long)mp->m_sb.sb_ifree; - lcounter += delta; - if (lcounter < 0) { - ASSERT(0); - return XFS_ERROR(EINVAL); - } - mp->m_sb.sb_ifree = lcounter; - return 0; - case XFS_SBS_FDBLOCKS: - lcounter = (long long) - mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); - res_used = (long long)(mp->m_resblks - mp->m_resblks_avail); - - if (delta > 0) { /* Putting blocks back */ - if (res_used > delta) { - mp->m_resblks_avail += delta; - } else { - rem = delta - res_used; - mp->m_resblks_avail = mp->m_resblks; - lcounter += rem; - } - } else { /* Taking blocks away */ - lcounter += delta; - if (lcounter >= 0) { - mp->m_sb.sb_fdblocks = lcounter + - XFS_ALLOC_SET_ASIDE(mp); - return 0; - } - - /* - * We are out of blocks, use any available reserved - * blocks if were allowed to. - */ - if (!rsvd) - return XFS_ERROR(ENOSPC); - - lcounter = (long long)mp->m_resblks_avail + delta; - if (lcounter >= 0) { - mp->m_resblks_avail = lcounter; - return 0; - } - printk_once(KERN_WARNING - "Filesystem \"%s\": reserve blocks depleted! " - "Consider increasing reserve pool size.", - mp->m_fsname); - return XFS_ERROR(ENOSPC); - } - - mp->m_sb.sb_fdblocks = lcounter + XFS_ALLOC_SET_ASIDE(mp); - return 0; case XFS_SBS_FREXTENTS: lcounter = (long long)mp->m_sb.sb_frextents; lcounter += delta; @@ -1846,9 +1839,7 @@ xfs_mod_incore_sb( { int status; -#ifdef HAVE_PERCPU_SB ASSERT(field < XFS_SBS_ICOUNT || field > XFS_SBS_FDBLOCKS); -#endif spin_lock(&mp->m_sb_lock); status = xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); spin_unlock(&mp->m_sb_lock); @@ -1907,6 +1898,90 @@ unwind: return error; } +int +xfs_icsb_modify_counters( + xfs_mount_t *mp, + xfs_sb_field_t field, + int64_t delta, + int rsvd) +{ + int64_t lcounter; + int64_t res_used; + int ret = 0; + + + switch (field) { + case XFS_SBS_ICOUNT: + ret = percpu_counter_add_unless_lt(&mp->m_icsb[XFS_SBS_ICOUNT], + delta, 0); + if (ret < 0) { + ASSERT(0); + return XFS_ERROR(EINVAL); + } + return 0; + + case XFS_SBS_IFREE: + ret = percpu_counter_add_unless_lt(&mp->m_icsb[XFS_SBS_IFREE], + delta, 0); + if (ret < 0) { + ASSERT(0); + return XFS_ERROR(EINVAL); + } + return 0; + + case XFS_SBS_FDBLOCKS: + /* + * if we are putting blocks back, put them into the reserve + * block pool first. + */ + if (mp->m_resblks != mp->m_resblks_avail && delta > 0) { + spin_lock(&mp->m_sb_lock); + res_used = (int64_t)(mp->m_resblks - + mp->m_resblks_avail); + if (res_used > delta) { + mp->m_resblks_avail += delta; + delta = 0; + } else { + delta -= res_used; + mp->m_resblks_avail = mp->m_resblks; + } + spin_unlock(&mp->m_sb_lock); + if (!delta) + return 0; + } + + /* try the change */ + ret = percpu_counter_add_unless_lt(&mp->m_icsb[XFS_ICSB_FDBLOCKS], + delta, XFS_ALLOC_SET_ASIDE(mp)); + if (likely(ret >= 0)) + return 0; + + /* ENOSPC */ + ASSERT(delta < 0); + + if (!rsvd) + return XFS_ERROR(ENOSPC); + + spin_lock(&mp->m_sb_lock); + lcounter = (int64_t)mp->m_resblks_avail + delta; + if (lcounter >= 0) { + mp->m_resblks_avail = lcounter; + spin_unlock(&mp->m_sb_lock); + return 0; + } + spin_unlock(&mp->m_sb_lock); + printk_once(KERN_WARNING + "Filesystem \"%s\": reserve blocks depleted! " + "Consider increasing reserve pool size.", + mp->m_fsname); + return XFS_ERROR(ENOSPC); + default: + ASSERT(0); + return XFS_ERROR(EINVAL); + } + return 0; +} + /* * xfs_getsb() is called to obtain the buffer for the superblock. * The buffer is returned locked and read in from disk. @@ -2000,572 +2075,3 @@ xfs_dev_is_read_only( } return 0; } - -#ifdef HAVE_PERCPU_SB -/* - * Per-cpu incore superblock counters - * - * Simple concept, difficult implementation - * - * Basically, replace the incore superblock counters with a distributed per cpu - * counter for contended fields (e.g. free block count). - * - * Difficulties arise in that the incore sb is used for ENOSPC checking, and - * hence needs to be accurately read when we are running low on space. Hence - * there is a method to enable and disable the per-cpu counters based on how - * much "stuff" is available in them. - * - * Basically, a counter is enabled if there is enough free resource to justify - * running a per-cpu fast-path. If the per-cpu counter runs out (i.e. a local - * ENOSPC), then we disable the counters to synchronise all callers and - * re-distribute the available resources. - * - * If, once we redistributed the available resources, we still get a failure, - * we disable the per-cpu counter and go through the slow path. - * - * The slow path is the current xfs_mod_incore_sb() function. This means that - * when we disable a per-cpu counter, we need to drain its resources back to - * the global superblock. We do this after disabling the counter to prevent - * more threads from queueing up on the counter. - * - * Essentially, this means that we still need a lock in the fast path to enable - * synchronisation between the global counters and the per-cpu counters. This - * is not a problem because the lock will be local to a CPU almost all the time - * and have little contention except when we get to ENOSPC conditions. - * - * Basically, this lock becomes a barrier that enables us to lock out the fast - * path while we do things like enabling and disabling counters and - * synchronising the counters. - * - * Locking rules: - * - * 1. m_sb_lock before picking up per-cpu locks - * 2. per-cpu locks always picked up via for_each_online_cpu() order - * 3. accurate counter sync requires m_sb_lock + per cpu locks - * 4. modifying per-cpu counters requires holding per-cpu lock - * 5. modifying global counters requires holding m_sb_lock - * 6. enabling or disabling a counter requires holding the m_sb_lock - * and _none_ of the per-cpu locks. - * - * Disabled counters are only ever re-enabled by a balance operation - * that results in more free resources per CPU than a given threshold. - * To ensure counters don't remain disabled, they are rebalanced when - * the global resource goes above a higher threshold (i.e. some hysteresis - * is present to prevent thrashing). - */ - -#ifdef CONFIG_HOTPLUG_CPU -/* - * hot-plug CPU notifier support. - * - * We need a notifier per filesystem as we need to be able to identify - * the filesystem to balance the counters out. This is achieved by - * having a notifier block embedded in the xfs_mount_t and doing pointer - * magic to get the mount pointer from the notifier block address. - */ -STATIC int -xfs_icsb_cpu_notify( - struct notifier_block *nfb, - unsigned long action, - void *hcpu) -{ - xfs_icsb_cnts_t *cntp; - xfs_mount_t *mp; - - mp = (xfs_mount_t *)container_of(nfb, xfs_mount_t, m_icsb_notifier); - cntp = (xfs_icsb_cnts_t *) - per_cpu_ptr(mp->m_sb_cnts, (unsigned long)hcpu); - switch (action) { - case CPU_UP_PREPARE: - case CPU_UP_PREPARE_FROZEN: - /* Easy Case - initialize the area and locks, and - * then rebalance when online does everything else for us. */ - memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); - break; - case CPU_ONLINE: - case CPU_ONLINE_FROZEN: - xfs_icsb_lock(mp); - xfs_icsb_balance_counter(mp, XFS_SBS_ICOUNT, 0); - xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0); - xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); - xfs_icsb_unlock(mp); - break; - case CPU_DEAD: - case CPU_DEAD_FROZEN: - /* Disable all the counters, then fold the dead cpu's - * count into the total on the global superblock and - * re-enable the counters. */ - xfs_icsb_lock(mp); - spin_lock(&mp->m_sb_lock); - xfs_icsb_disable_counter(mp, XFS_SBS_ICOUNT); - xfs_icsb_disable_counter(mp, XFS_SBS_IFREE); - xfs_icsb_disable_counter(mp, XFS_SBS_FDBLOCKS); - - mp->m_sb.sb_icount += cntp->icsb_icount; - mp->m_sb.sb_ifree += cntp->icsb_ifree; - mp->m_sb.sb_fdblocks += cntp->icsb_fdblocks; - - memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); - - xfs_icsb_balance_counter_locked(mp, XFS_SBS_ICOUNT, 0); - xfs_icsb_balance_counter_locked(mp, XFS_SBS_IFREE, 0); - xfs_icsb_balance_counter_locked(mp, XFS_SBS_FDBLOCKS, 0); - spin_unlock(&mp->m_sb_lock); - xfs_icsb_unlock(mp); - break; - } - - return NOTIFY_OK; -} -#endif /* CONFIG_HOTPLUG_CPU */ - -int -xfs_icsb_init_counters( - xfs_mount_t *mp) -{ - xfs_icsb_cnts_t *cntp; - int i; - - mp->m_sb_cnts = alloc_percpu(xfs_icsb_cnts_t); - if (mp->m_sb_cnts == NULL) - return -ENOMEM; - -#ifdef CONFIG_HOTPLUG_CPU - mp->m_icsb_notifier.notifier_call = xfs_icsb_cpu_notify; - mp->m_icsb_notifier.priority = 0; - register_hotcpu_notifier(&mp->m_icsb_notifier); -#endif /* CONFIG_HOTPLUG_CPU */ - - for_each_online_cpu(i) { - cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); - memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); - } - - mutex_init(&mp->m_icsb_mutex); - - /* - * start with all counters disabled so that the - * initial balance kicks us off correctly - */ - mp->m_icsb_counters = -1; - return 0; -} - -void -xfs_icsb_reinit_counters( - xfs_mount_t *mp) -{ - xfs_icsb_lock(mp); - /* - * start with all counters disabled so that the - * initial balance kicks us off correctly - */ - mp->m_icsb_counters = -1; - xfs_icsb_balance_counter(mp, XFS_SBS_ICOUNT, 0); - xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0); - xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); - xfs_icsb_unlock(mp); -} - -void -xfs_icsb_destroy_counters( - xfs_mount_t *mp) -{ - if (mp->m_sb_cnts) { - unregister_hotcpu_notifier(&mp->m_icsb_notifier); - free_percpu(mp->m_sb_cnts); - } - mutex_destroy(&mp->m_icsb_mutex); -} - -STATIC void -xfs_icsb_lock_cntr( - xfs_icsb_cnts_t *icsbp) -{ - while (test_and_set_bit(XFS_ICSB_FLAG_LOCK, &icsbp->icsb_flags)) { - ndelay(1000); - } -} - -STATIC void -xfs_icsb_unlock_cntr( - xfs_icsb_cnts_t *icsbp) -{ - clear_bit(XFS_ICSB_FLAG_LOCK, &icsbp->icsb_flags); -} - - -STATIC void -xfs_icsb_lock_all_counters( - xfs_mount_t *mp) -{ - xfs_icsb_cnts_t *cntp; - int i; - - for_each_online_cpu(i) { - cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); - xfs_icsb_lock_cntr(cntp); - } -} - -STATIC void -xfs_icsb_unlock_all_counters( - xfs_mount_t *mp) -{ - xfs_icsb_cnts_t *cntp; - int i; - - for_each_online_cpu(i) { - cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); - xfs_icsb_unlock_cntr(cntp); - } -} - -STATIC void -xfs_icsb_count( - xfs_mount_t *mp, - xfs_icsb_cnts_t *cnt, - int flags) -{ - xfs_icsb_cnts_t *cntp; - int i; - - memset(cnt, 0, sizeof(xfs_icsb_cnts_t)); - - if (!(flags & XFS_ICSB_LAZY_COUNT)) - xfs_icsb_lock_all_counters(mp); - - for_each_online_cpu(i) { - cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); - cnt->icsb_icount += cntp->icsb_icount; - cnt->icsb_ifree += cntp->icsb_ifree; - cnt->icsb_fdblocks += cntp->icsb_fdblocks; - } - - if (!(flags & XFS_ICSB_LAZY_COUNT)) - xfs_icsb_unlock_all_counters(mp); -} - -STATIC int -xfs_icsb_counter_disabled( - xfs_mount_t *mp, - xfs_sb_field_t field) -{ - ASSERT((field >= XFS_SBS_ICOUNT) && (field <= XFS_SBS_FDBLOCKS)); - return test_bit(field, &mp->m_icsb_counters); -} - -STATIC void -xfs_icsb_disable_counter( - xfs_mount_t *mp, - xfs_sb_field_t field) -{ - xfs_icsb_cnts_t cnt; - - ASSERT((field >= XFS_SBS_ICOUNT) && (field <= XFS_SBS_FDBLOCKS)); - - /* - * If we are already disabled, then there is nothing to do - * here. We check before locking all the counters to avoid - * the expensive lock operation when being called in the - * slow path and the counter is already disabled. This is - * safe because the only time we set or clear this state is under - * the m_icsb_mutex. - */ - if (xfs_icsb_counter_disabled(mp, field)) - return; - - xfs_icsb_lock_all_counters(mp); - if (!test_and_set_bit(field, &mp->m_icsb_counters)) { - /* drain back to superblock */ - - xfs_icsb_count(mp, &cnt, XFS_ICSB_LAZY_COUNT); - switch(field) { - case XFS_SBS_ICOUNT: - mp->m_sb.sb_icount = cnt.icsb_icount; - break; - case XFS_SBS_IFREE: - mp->m_sb.sb_ifree = cnt.icsb_ifree; - break; - case XFS_SBS_FDBLOCKS: - mp->m_sb.sb_fdblocks = cnt.icsb_fdblocks; - break; - default: - BUG(); - } - } - - xfs_icsb_unlock_all_counters(mp); -} - -STATIC void -xfs_icsb_enable_counter( - xfs_mount_t *mp, - xfs_sb_field_t field, - uint64_t count, - uint64_t resid) -{ - xfs_icsb_cnts_t *cntp; - int i; - - ASSERT((field >= XFS_SBS_ICOUNT) && (field <= XFS_SBS_FDBLOCKS)); - - xfs_icsb_lock_all_counters(mp); - for_each_online_cpu(i) { - cntp = per_cpu_ptr(mp->m_sb_cnts, i); - switch (field) { - case XFS_SBS_ICOUNT: - cntp->icsb_icount = count + resid; - break; - case XFS_SBS_IFREE: - cntp->icsb_ifree = count + resid; - break; - case XFS_SBS_FDBLOCKS: - cntp->icsb_fdblocks = count + resid; - break; - default: - BUG(); - break; - } - resid = 0; - } - clear_bit(field, &mp->m_icsb_counters); - xfs_icsb_unlock_all_counters(mp); -} - -void -xfs_icsb_sync_counters_locked( - xfs_mount_t *mp, - int flags) -{ - xfs_icsb_cnts_t cnt; - - xfs_icsb_count(mp, &cnt, flags); - - if (!xfs_icsb_counter_disabled(mp, XFS_SBS_ICOUNT)) - mp->m_sb.sb_icount = cnt.icsb_icount; - if (!xfs_icsb_counter_disabled(mp, XFS_SBS_IFREE)) - mp->m_sb.sb_ifree = cnt.icsb_ifree; - if (!xfs_icsb_counter_disabled(mp, XFS_SBS_FDBLOCKS)) - mp->m_sb.sb_fdblocks = cnt.icsb_fdblocks; -} - -/* - * Accurate update of per-cpu counters to incore superblock - */ -void -xfs_icsb_sync_counters( - xfs_mount_t *mp, - int flags) -{ - spin_lock(&mp->m_sb_lock); - xfs_icsb_sync_counters_locked(mp, flags); - spin_unlock(&mp->m_sb_lock); -} - -/* - * Balance and enable/disable counters as necessary. - * - * Thresholds for re-enabling counters are somewhat magic. inode counts are - * chosen to be the same number as single on disk allocation chunk per CPU, and - * free blocks is something far enough zero that we aren't going thrash when we - * get near ENOSPC. We also need to supply a minimum we require per cpu to - * prevent looping endlessly when xfs_alloc_space asks for more than will - * be distributed to a single CPU but each CPU has enough blocks to be - * reenabled. - * - * Note that we can be called when counters are already disabled. - * xfs_icsb_disable_counter() optimises the counter locking in this case to - * prevent locking every per-cpu counter needlessly. - */ - -#define XFS_ICSB_INO_CNTR_REENABLE (uint64_t)64 -#define XFS_ICSB_FDBLK_CNTR_REENABLE(mp) \ - (uint64_t)(512 + XFS_ALLOC_SET_ASIDE(mp)) -STATIC void -xfs_icsb_balance_counter_locked( - xfs_mount_t *mp, - xfs_sb_field_t field, - int min_per_cpu) -{ - uint64_t count, resid; - int weight = num_online_cpus(); - uint64_t min = (uint64_t)min_per_cpu; - - /* disable counter and sync counter */ - xfs_icsb_disable_counter(mp, field); - - /* update counters - first CPU gets residual*/ - switch (field) { - case XFS_SBS_ICOUNT: - count = mp->m_sb.sb_icount; - resid = do_div(count, weight); - if (count < max(min, XFS_ICSB_INO_CNTR_REENABLE)) - return; - break; - case XFS_SBS_IFREE: - count = mp->m_sb.sb_ifree; - resid = do_div(count, weight); - if (count < max(min, XFS_ICSB_INO_CNTR_REENABLE)) - return; - break; - case XFS_SBS_FDBLOCKS: - count = mp->m_sb.sb_fdblocks; - resid = do_div(count, weight); - if (count < max(min, XFS_ICSB_FDBLK_CNTR_REENABLE(mp))) - return; - break; - default: - BUG(); - count = resid = 0; /* quiet, gcc */ - break; - } - - xfs_icsb_enable_counter(mp, field, count, resid); -} - -STATIC void -xfs_icsb_balance_counter( - xfs_mount_t *mp, - xfs_sb_field_t fields, - int min_per_cpu) -{ - spin_lock(&mp->m_sb_lock); - xfs_icsb_balance_counter_locked(mp, fields, min_per_cpu); - spin_unlock(&mp->m_sb_lock); -} - -int -xfs_icsb_modify_counters( - xfs_mount_t *mp, - xfs_sb_field_t field, - int64_t delta, - int rsvd) -{ - xfs_icsb_cnts_t *icsbp; - long long lcounter; /* long counter for 64 bit fields */ - int ret = 0; - - might_sleep(); -again: - preempt_disable(); - icsbp = this_cpu_ptr(mp->m_sb_cnts); - - /* - * if the counter is disabled, go to slow path - */ - if (unlikely(xfs_icsb_counter_disabled(mp, field))) - goto slow_path; - xfs_icsb_lock_cntr(icsbp); - if (unlikely(xfs_icsb_counter_disabled(mp, field))) { - xfs_icsb_unlock_cntr(icsbp); - goto slow_path; - } - - switch (field) { - case XFS_SBS_ICOUNT: - lcounter = icsbp->icsb_icount; - lcounter += delta; - if (unlikely(lcounter < 0)) - goto balance_counter; - icsbp->icsb_icount = lcounter; - break; - - case XFS_SBS_IFREE: - lcounter = icsbp->icsb_ifree; - lcounter += delta; - if (unlikely(lcounter < 0)) - goto balance_counter; - icsbp->icsb_ifree = lcounter; - break; - - case XFS_SBS_FDBLOCKS: - BUG_ON((mp->m_resblks - mp->m_resblks_avail) != 0); - - lcounter = icsbp->icsb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); - lcounter += delta; - if (unlikely(lcounter < 0)) - goto balance_counter; - icsbp->icsb_fdblocks = lcounter + XFS_ALLOC_SET_ASIDE(mp); - break; - default: - BUG(); - break; - } - xfs_icsb_unlock_cntr(icsbp); - preempt_enable(); - return 0; - -slow_path: - preempt_enable(); - - /* - * serialise with a mutex so we don't burn lots of cpu on - * the superblock lock. We still need to hold the superblock - * lock, however, when we modify the global structures. - */ - xfs_icsb_lock(mp); - - /* - * Now running atomically. - * - * If the counter is enabled, someone has beaten us to rebalancing. - * Drop the lock and try again in the fast path.... - */ - if (!(xfs_icsb_counter_disabled(mp, field))) { - xfs_icsb_unlock(mp); - goto again; - } - - /* - * The counter is currently disabled. Because we are - * running atomically here, we know a rebalance cannot - * be in progress. Hence we can go straight to operating - * on the global superblock. We do not call xfs_mod_incore_sb() - * here even though we need to get the m_sb_lock. Doing so - * will cause us to re-enter this function and deadlock. - * Hence we get the m_sb_lock ourselves and then call - * xfs_mod_incore_sb_unlocked() as the unlocked path operates - * directly on the global counters. - */ - spin_lock(&mp->m_sb_lock); - ret = xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); - spin_unlock(&mp->m_sb_lock); - - /* - * Now that we've modified the global superblock, we - * may be able to re-enable the distributed counters - * (e.g. lots of space just got freed). After that - * we are done. - */ - if (ret != ENOSPC) - xfs_icsb_balance_counter(mp, field, 0); - xfs_icsb_unlock(mp); - return ret; - -balance_counter: - xfs_icsb_unlock_cntr(icsbp); - preempt_enable(); - - /* - * We may have multiple threads here if multiple per-cpu - * counters run dry at the same time. This will mean we can - * do more balances than strictly necessary but it is not - * the common slowpath case. - */ - xfs_icsb_lock(mp); - - /* - * running atomically. - * - * This will leave the counter in the correct state for future - * accesses. After the rebalance, we simply try again and our retry - * will either succeed through the fast path or slow path without - * another balance operation being required. - */ - xfs_icsb_balance_counter(mp, field, delta); - xfs_icsb_unlock(mp); - goto again; -} - -#endif diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 5861b49..42d31df 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -65,44 +65,19 @@ struct xfs_nameops; struct xfs_ail; struct xfs_quotainfo; -#ifdef HAVE_PERCPU_SB - /* - * Valid per-cpu incore superblock counters. Note that if you add new counters, - * you may need to define new counter disabled bit field descriptors as there - * are more possible fields in the superblock that can fit in a bitfield on a - * 32 bit platform. The XFS_SBS_* values for the current current counters just - * fit. + * Per-cpu incore superblock counters. */ -typedef struct xfs_icsb_cnts { - uint64_t icsb_fdblocks; - uint64_t icsb_ifree; - uint64_t icsb_icount; - unsigned long icsb_flags; -} xfs_icsb_cnts_t; - -#define XFS_ICSB_FLAG_LOCK (1 << 0) /* counter lock bit */ - -#define XFS_ICSB_LAZY_COUNT (1 << 1) /* accuracy not needed */ +enum { + XFS_ICSB_FDBLOCKS = 0, + XFS_ICSB_IFREE, + XFS_ICSB_ICOUNT, + XFS_ICSB_MAX, +}; -extern int xfs_icsb_init_counters(struct xfs_mount *); -extern void xfs_icsb_reinit_counters(struct xfs_mount *); -extern void xfs_icsb_destroy_counters(struct xfs_mount *); -extern void xfs_icsb_sync_counters(struct xfs_mount *, int); -extern void xfs_icsb_sync_counters_locked(struct xfs_mount *, int); extern int xfs_icsb_modify_counters(struct xfs_mount *, xfs_sb_field_t, int64_t, int); -#else -#define xfs_icsb_init_counters(mp) (0) -#define xfs_icsb_destroy_counters(mp) do { } while (0) -#define xfs_icsb_reinit_counters(mp) do { } while (0) -#define xfs_icsb_sync_counters(mp, flags) do { } while (0) -#define xfs_icsb_sync_counters_locked(mp, flags) do { } while (0) -#define xfs_icsb_modify_counters(mp, field, delta, rsvd) \ - xfs_mod_incore_sb(mp, field, delta, rsvd) -#endif - typedef struct xfs_mount { struct super_block *m_super; xfs_tid_t m_tid; /* next unused tid for fs */ @@ -186,12 +161,6 @@ typedef struct xfs_mount { struct xfs_chash *m_chash; /* fs private inode per-cluster * hash table */ atomic_t m_active_trans; /* number trans frozen */ -#ifdef HAVE_PERCPU_SB - xfs_icsb_cnts_t __percpu *m_sb_cnts; /* per-cpu superblock counters */ - unsigned long m_icsb_counters; /* disabled per-cpu counters */ - struct notifier_block m_icsb_notifier; /* hotplug cpu notifier */ - struct mutex m_icsb_mutex; /* balancer sync lock */ -#endif struct xfs_mru_cache *m_filestream; /* per-mount filestream data */ struct task_struct *m_sync_task; /* generalised sync thread */ xfs_sync_work_t m_sync_work; /* work item for VFS_SYNC */ @@ -202,6 +171,7 @@ typedef struct xfs_mount { __int64_t m_update_flags; /* sb flags we need to update on the next remount,rw */ struct shrinker m_inode_shrink; /* inode reclaim shrinker */ + struct percpu_counter m_icsb[XFS_ICSB_MAX]; } xfs_mount_t; /* @@ -333,26 +303,6 @@ struct xfs_perag *xfs_perag_get_tag(struct xfs_mount *mp, xfs_agnumber_t agno, void xfs_perag_put(struct xfs_perag *pag); /* - * Per-cpu superblock locking functions - */ -#ifdef HAVE_PERCPU_SB -static inline void -xfs_icsb_lock(xfs_mount_t *mp) -{ - mutex_lock(&mp->m_icsb_mutex); -} - -static inline void -xfs_icsb_unlock(xfs_mount_t *mp) -{ - mutex_unlock(&mp->m_icsb_mutex); -} -#else -#define xfs_icsb_lock(mp) -#define xfs_icsb_unlock(mp) -#endif - -/* * This structure is for use by the xfs_mod_incore_sb_batch() routine. * xfs_growfs can specify a few fields which are more than int limit */ @@ -379,6 +329,11 @@ extern int xfs_sb_validate_fsb_count(struct xfs_sb *, __uint64_t); extern int xfs_dev_is_read_only(struct xfs_mount *, char *); +extern int xfs_icsb_init_counters(struct xfs_mount *); +extern void xfs_icsb_reinit_counters(struct xfs_mount *); +extern void xfs_icsb_destroy_counters(struct xfs_mount *); +extern void xfs_icsb_sync_counters(struct xfs_mount *); + #endif /* __KERNEL__ */ extern void xfs_mod_sb(struct xfs_trans *, __int64_t); -- 1.7.2.3 From SRS0+Ksmg+16+fromorbit.com=dave@internode.on.net Sun Dec 12 19:25:00 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD1Ox1J148058 for ; Sun, 12 Dec 2010 19:25:00 -0600 X-ASG-Debug-ID: 1292203609-226801310000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 22F021E2B5E for ; Sun, 12 Dec 2010 17:26:49 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id Yr35m34d8FCI7kzD for ; Sun, 12 Dec 2010 17:26:49 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50106617-1927428 for ; Mon, 13 Dec 2010 11:56:48 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PRxBf-0001lx-8J for xfs@oss.sgi.com; Mon, 13 Dec 2010 12:26:47 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PRxAB-00045u-SP for xfs@oss.sgi.com; Mon, 13 Dec 2010 12:25:15 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/2] xfs: don't truncate prealloc from frequently accessed inodes Subject: [PATCH 2/2] xfs: don't truncate prealloc from frequently accessed inodes Date: Mon, 13 Dec 2010 12:25:11 +1100 Message-Id: <1292203511-15685-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292203511-15685-1-git-send-email-david@fromorbit.com> References: <1292203511-15685-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1292203611 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49261 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner A long standing problem for streaming writeÑ• through the NFS server has been that the NFS server opens and closes file descriptors on an inode for every write. The result of this behaviour is that the ->release() function is called on every close and that results in XFS truncating speculative preallocation beyond the EOF. This has an adverse effect on file layout when multiple files are being written at the same time - they interleave their extents and can result in severe fragmentation. To avoid this problem, keep a count of the number of ->release calls made on an inode. For most cases, an inode is only going to be opened once for writing and then closed again during it's lifetime in cache. Hence if there are multiple ->release calls, there is a good chance that the inode is being accessed by the NFS server. Hence count up every time ->release is called while there are delalloc blocks still outstanding on the inode. If this count is non-zero when ->release is next called, then do no truncate away the speculative preallocation - leave it there so that subsequent writes do not need to reallocate the delalloc space. This will prevent interleaving of extents of different inodes written concurrently to the same AG. If we get this wrong, it is not a big deal as we truncate speculative allocation beyond EOF anyway in xfs_inactive() when the inode is thrown out of the cache. The new counter in the struct xfs_inode fits into a hole in the structure on 64 bit machines, so does not grow the size of the inode at all. Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.h | 13 +++++----- fs/xfs/xfs_vnodeops.c | 61 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 47 insertions(+), 27 deletions(-) diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 1c6514d..5c95fa8 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -376,12 +376,13 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) /* * In-core inode flags. */ -#define XFS_IRECLAIM 0x0001 /* we have started reclaiming this inode */ -#define XFS_ISTALE 0x0002 /* inode has been staled */ -#define XFS_IRECLAIMABLE 0x0004 /* inode can be reclaimed */ -#define XFS_INEW 0x0008 /* inode has just been allocated */ -#define XFS_IFILESTREAM 0x0010 /* inode is in a filestream directory */ -#define XFS_ITRUNCATED 0x0020 /* truncated down so flush-on-close */ +#define XFS_IRECLAIM 0x0001 /* started reclaiming this inode */ +#define XFS_ISTALE 0x0002 /* inode has been staled */ +#define XFS_IRECLAIMABLE 0x0004 /* inode can be reclaimed */ +#define XFS_INEW 0x0008 /* inode has just been allocated */ +#define XFS_IFILESTREAM 0x0010 /* inode is in a filestream directory */ +#define XFS_ITRUNCATED 0x0020 /* truncated down so flush-on-close */ +#define XFS_IDIRTY_RELEASE 0x0040 /* dirty release already seen */ /* * Flags for inode locking. diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 8e4a63c..d8e6f8c 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -964,29 +964,48 @@ xfs_release( xfs_flush_pages(ip, 0, -1, XBF_ASYNC, FI_NONE); } - if (ip->i_d.di_nlink != 0) { - if ((((ip->i_d.di_mode & S_IFMT) == S_IFREG) && - ((ip->i_size > 0) || (VN_CACHED(VFS_I(ip)) > 0 || - ip->i_delayed_blks > 0)) && - (ip->i_df.if_flags & XFS_IFEXTENTS)) && - (!(ip->i_d.di_flags & - (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)))) { + if (ip->i_d.di_nlink == 0) + return 0; - /* - * If we can't get the iolock just skip truncating - * the blocks past EOF because we could deadlock - * with the mmap_sem otherwise. We'll get another - * chance to drop them once the last reference to - * the inode is dropped, so we'll never leak blocks - * permanently. - */ - error = xfs_free_eofblocks(mp, ip, - XFS_FREE_EOF_TRYLOCK); - if (error) - return error; - } - } + if ((((ip->i_d.di_mode & S_IFMT) == S_IFREG) && + ((ip->i_size > 0) || (VN_CACHED(VFS_I(ip)) > 0 || + ip->i_delayed_blks > 0)) && + (ip->i_df.if_flags & XFS_IFEXTENTS)) && + (!(ip->i_d.di_flags & (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)))) { + /* + * If we can't get the iolock just skip truncating the blocks + * past EOF because we could deadlock with the mmap_sem + * otherwise. We'll get another chance to drop them once the + * last reference to the inode is dropped, so we'll never leak + * blocks permanently. + * + * Further, check if the inode is being opened, written and + * closed frequently and we have delayed allocation blocks + * oustanding (e.g. streaming writes from the NFS server), + * truncating the blocks past EOF will cause fragmentation to + * occur. + * + * In this case don't do the truncation, either, but we have to + * be careful how we detect this case. Blocks beyond EOF show + * up as i_delayed_blks even when the inode is clean, so we + * need to truncate them away first before checking for a dirty + * release. Hence on the first dirty close we will still remove + * the speculative allocation, but after that we will leave it + * in place. + */ + if (xfs_iflags_test(ip, XFS_IDIRTY_RELEASE)) + return 0; + + error = xfs_free_eofblocks(mp, ip, + XFS_FREE_EOF_TRYLOCK); + if (error) + return error; + + /* delalloc blocks after truncation means it really is dirty */ + if (ip->i_delayed_blks) + xfs_iflags_set(ip, XFS_IDIRTY_RELEASE); + } return 0; } -- 1.7.2.3 From SRS0+gPCZ+16+fromorbit.com=dave@internode.on.net Sun Dec 12 19:25:00 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD1P0oN148061 for ; Sun, 12 Dec 2010 19:25:00 -0600 X-ASG-Debug-ID: 1292203609-0be901da0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 435AE1CBC343 for ; Sun, 12 Dec 2010 17:26:49 -0800 (PST) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id DU7H8Yrr3ibITUTJ for ; Sun, 12 Dec 2010 17:26:49 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49733300-1927428 for ; Mon, 13 Dec 2010 11:56:48 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PRxBf-0001lw-6o for xfs@oss.sgi.com; Mon, 13 Dec 2010 12:26:47 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PRxAB-00045s-QA for xfs@oss.sgi.com; Mon, 13 Dec 2010 12:25:15 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/2] xfs: dynamic speculative EOF preallocation Subject: [PATCH 1/2] xfs: dynamic speculative EOF preallocation Date: Mon, 13 Dec 2010 12:25:10 +1100 Message-Id: <1292203511-15685-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292203511-15685-1-git-send-email-david@fromorbit.com> References: <1292203511-15685-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1292203611 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49261 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Currently the size of the speculative preallocation during delayed allocation is fixed by either the allocsize mount option of a default size. We are seeing a lot of cases where we need to recommend using the allocsize mount option to prevent fragmentation when buffered writes land in the same AG. Rather than using a fixed preallocation size by default (up to 64k), make it dynamic by basing it on the current inode size. That way the EOF preallocation will increase as the file size increases. Hence for streaming writes we are much more likely to get large preallocations exactly when we need it to reduce fragementation. For default settings, the size of the initial extents is determined by the number of parallel writers and the amount of memory in the machine. For 4GB RAM and 4 concurrent 32GB file writes: EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL 0: [0..1048575]: 1048672..2097247 0 (1048672..2097247) 1048576 1: [1048576..2097151]: 5242976..6291551 0 (5242976..6291551) 1048576 2: [2097152..4194303]: 12583008..14680159 0 (12583008..14680159) 2097152 3: [4194304..8388607]: 25165920..29360223 0 (25165920..29360223) 4194304 4: [8388608..16777215]: 58720352..67108959 0 (58720352..67108959) 8388608 5: [16777216..33554423]: 117440584..134217791 0 (117440584..134217791) 16777208 6: [33554424..50331511]: 184549056..201326143 0 (184549056..201326143) 16777088 7: [50331512..67108599]: 251657408..268434495 0 (251657408..268434495) 16777088 and for 16 concurrent 16GB file writes: EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL 0: [0..262143]: 2490472..2752615 0 (2490472..2752615) 262144 1: [262144..524287]: 6291560..6553703 0 (6291560..6553703) 262144 2: [524288..1048575]: 13631592..14155879 0 (13631592..14155879) 524288 3: [1048576..2097151]: 30408808..31457383 0 (30408808..31457383) 1048576 4: [2097152..4194303]: 52428904..54526055 0 (52428904..54526055) 2097152 5: [4194304..8388607]: 104857704..109052007 0 (104857704..109052007) 4194304 6: [8388608..16777215]: 209715304..218103911 0 (209715304..218103911) 8388608 7: [16777216..33554423]: 452984848..469762055 0 (452984848..469762055) 16777208 Because it is hard to take back specualtive preallocation, cases where there are large slow growing log files on a nearly full filesystem may cause premature ENOSPC. Hence as the filesystem nears full, the maximum dynamic prealloc size Ñ–s reduced according to this table (based on 4k block size): freespace max prealloc size >5% full extent (8GB) 4-5% 2GB (8GB >> 2) 3-4% 1GB (8GB >> 3) 2-3% 512MB (8GB >> 4) 1-2% 256MB (8GB >> 5) <1% 128MB (8GB >> 6) This should reduce the amount of space held in speculative preallocation for such cases. The allocsize mount option turns off the dynamic behaviour and fixes the prealloc size to whatever the mount option specifies. i.e. the behaviour is unchanged. Signed-off-by: Dave Chinner --- fs/xfs/xfs_fsops.c | 1 + fs/xfs/xfs_iomap.c | 85 +++++++++++++++++++++++++++++++++++++++++++++------ fs/xfs/xfs_mount.c | 21 +++++++++++++ fs/xfs/xfs_mount.h | 14 ++++++++ 4 files changed, 111 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index be34ff2..6d17206 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -374,6 +374,7 @@ xfs_growfs_data_private( mp->m_maxicount = icount << mp->m_sb.sb_inopblog; } else mp->m_maxicount = 0; + xfs_set_low_space_thresholds(mp); /* update secondary superblocks. */ for (agno = 1; agno < nagcount; agno++) { diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 2057614..40f9612 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -389,6 +389,9 @@ error_out: * If the caller is doing a write at the end of the file, then extend the * allocation out to the file system's write iosize. We clean up any extra * space left over when the file is closed in xfs_inactive(). + * + * If we find we already have delalloc preallocation beyond EOF, don't do more + * preallocation as it it not needed. */ STATIC int xfs_iomap_eof_want_preallocate( @@ -405,6 +408,7 @@ xfs_iomap_eof_want_preallocate( xfs_filblks_t count_fsb; xfs_fsblock_t firstblock; int n, error, imaps; + int found_delalloc = 0; *prealloc = 0; if ((offset + count) <= ip->i_size) @@ -427,14 +431,63 @@ xfs_iomap_eof_want_preallocate( if ((imap[n].br_startblock != HOLESTARTBLOCK) && (imap[n].br_startblock != DELAYSTARTBLOCK)) return 0; + start_fsb += imap[n].br_blockcount; count_fsb -= imap[n].br_blockcount; + + if (imap[n].br_startblock == DELAYSTARTBLOCK) + found_delalloc = 1; } } - *prealloc = 1; + if (!found_delalloc) + *prealloc = 1; return 0; } +/* + * If we don't have a user specified preallocation size, dynamically increase + * the preallocation size as the size of the file grows. Cap the maximum size + * at a single extent or less if the filesystem is near full. The closer the + * filesystem is to full, the smaller the maximum prealocation. + */ +STATIC xfs_fsblock_t +xfs_iomap_prealloc_size( + struct xfs_mount *mp, + struct xfs_inode *ip) +{ + xfs_fsblock_t alloc_blocks = 0; + + if (!(mp->m_flags & XFS_MOUNT_DFLT_IOSIZE)) { + int shift = 0; + int64_t freesp; + + alloc_blocks = XFS_B_TO_FSB(mp, ip->i_size); + alloc_blocks = XFS_FILEOFF_MIN(MAXEXTLEN, + rounddown_pow_of_two(alloc_blocks)); + + freesp = percpu_counter_read_positive( + &mp->m_icsb[XFS_ICSB_FDBLOCKS]); + if (freesp < mp->m_low_space[XFS_LOWSP_5_PCNT]) { + shift = 2; + if (freesp < mp->m_low_space[XFS_LOWSP_4_PCNT]) + shift++; + if (freesp < mp->m_low_space[XFS_LOWSP_3_PCNT]) + shift++; + if (freesp < mp->m_low_space[XFS_LOWSP_2_PCNT]) + shift++; + if (freesp < mp->m_low_space[XFS_LOWSP_1_PCNT]) + shift++; + } + if (shift) + alloc_blocks >>= shift; + } + + if (alloc_blocks < mp->m_writeio_blocks) + alloc_blocks = mp->m_writeio_blocks; + + return alloc_blocks; +} + STATIC int xfs_iomap_write_delay( xfs_inode_t *ip, @@ -469,6 +522,7 @@ xfs_iomap_write_delay( extsz = xfs_get_extsz_hint(ip); offset_fsb = XFS_B_TO_FSBT(mp, offset); + error = xfs_iomap_eof_want_preallocate(mp, ip, offset, count, ioflag, imap, XFS_WRITE_IMAPS, &prealloc); if (error) @@ -476,9 +530,11 @@ xfs_iomap_write_delay( retry: if (prealloc) { + xfs_fsblock_t alloc_blocks = xfs_iomap_prealloc_size(mp, ip); + aligned_offset = XFS_WRITEIO_ALIGN(mp, (offset + count - 1)); ioalign = XFS_B_TO_FSBT(mp, aligned_offset); - last_fsb = ioalign + mp->m_writeio_blocks; + last_fsb = ioalign + alloc_blocks; } else { last_fsb = XFS_B_TO_FSB(mp, ((xfs_ufsize_t)(offset + count))); } @@ -496,22 +552,31 @@ retry: XFS_BMAPI_DELAY | XFS_BMAPI_WRITE | XFS_BMAPI_ENTIRE, &firstblock, 1, imap, &nimaps, NULL); - if (error && (error != ENOSPC)) + switch (error) { + case 0: + case ENOSPC: + case EDQUOT: + break; + default: return XFS_ERROR(error); + } /* - * If bmapi returned us nothing, and if we didn't get back EDQUOT, - * then we must have run out of space - flush all other inodes with - * delalloc blocks and retry without EOF preallocation. + * If bmapi returned us nothing, we got either ENOSPC or EDQUOT. For + * ENOSPC, * flush all other inodes with delalloc blocks to free up + * some of the excess reserved metadata space. For both cases, retry + * without EOF preallocation. */ if (nimaps == 0) { trace_xfs_delalloc_enospc(ip, offset, count); if (flushed) - return XFS_ERROR(ENOSPC); + return XFS_ERROR(error ? error : ENOSPC); - xfs_iunlock(ip, XFS_ILOCK_EXCL); - xfs_flush_inodes(ip); - xfs_ilock(ip, XFS_ILOCK_EXCL); + if (error == ENOSPC) { + xfs_iunlock(ip, XFS_ILOCK_EXCL); + xfs_flush_inodes(ip); + xfs_ilock(ip, XFS_ILOCK_EXCL); + } flushed = 1; error = 0; diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 5e41ef3..fe27338 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1101,6 +1101,24 @@ xfs_set_rw_sizes(xfs_mount_t *mp) } /* + * precalculate the low space thresholds for dynamic speculative preallocation. + */ +void +xfs_set_low_space_thresholds( + struct xfs_mount *mp) +{ + int i; + + for (i = 0; i < XFS_LOWSP_MAX; i++) { + __uint64_t space = mp->m_sb.sb_dblocks; + + do_div(space, 100); + mp->m_low_space[i] = space * (i + 1); + } +} + + +/* * Set whether we're using inode alignment. */ STATIC void @@ -1322,6 +1340,9 @@ xfs_mountfs( */ xfs_set_rw_sizes(mp); + /* set the low space thresholds for dynamic preallocation */ + xfs_set_low_space_thresholds(mp); + /* * Set the inode cluster size. * This may still be overridden by the file system diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 03ad25c6..7b42e04 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -75,6 +75,16 @@ enum { XFS_ICSB_MAX, }; +/* dynamic preallocation free space thresholds, 5% down to 1% */ +enum { + XFS_LOWSP_1_PCNT = 0, + XFS_LOWSP_2_PCNT, + XFS_LOWSP_3_PCNT, + XFS_LOWSP_4_PCNT, + XFS_LOWSP_5_PCNT, + XFS_LOWSP_MAX, +}; + typedef struct xfs_mount { struct super_block *m_super; xfs_tid_t m_tid; /* next unused tid for fs */ @@ -169,6 +179,8 @@ typedef struct xfs_mount { on the next remount,rw */ struct shrinker m_inode_shrink; /* inode reclaim shrinker */ struct percpu_counter m_icsb[XFS_ICSB_MAX]; + int64_t m_low_space[XFS_LOWSP_MAX]; + /* low free space thresholds */ } xfs_mount_t; /* @@ -333,6 +345,8 @@ extern void xfs_icsb_sync_counters(struct xfs_mount *); extern int xfs_icsb_modify_inodes(struct xfs_mount *, int, int64_t); extern int xfs_icsb_modify_free_blocks(struct xfs_mount *, int64_t, int); +extern void xfs_set_low_space_thresholds(struct xfs_mount *); + #endif /* __KERNEL__ */ extern void xfs_mod_sb(struct xfs_trans *, __int64_t); -- 1.7.2.3 From SRS0+Ksmg+16+fromorbit.com=dave@internode.on.net Sun Dec 12 19:25:09 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD1P9Lc148093 for ; Sun, 12 Dec 2010 19:25:09 -0600 X-ASG-Debug-ID: 1292203618-768002f60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 94DCB1E2B5F for ; Sun, 12 Dec 2010 17:26:59 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id 6w5QCGUpoXGtiZBT for ; Sun, 12 Dec 2010 17:26:59 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49418373-1927428 for ; Mon, 13 Dec 2010 11:56:58 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PRxBf-0001lv-5L for xfs@oss.sgi.com; Mon, 13 Dec 2010 12:26:47 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PRxAB-00045q-Og for xfs@oss.sgi.com; Mon, 13 Dec 2010 12:25:15 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/2] xfs: dynamic speculative allocation beyond EOF V4 Subject: [PATCH 0/2] xfs: dynamic speculative allocation beyond EOF V4 Date: Mon, 13 Dec 2010 12:25:09 +1100 Message-Id: <1292203511-15685-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1292203620 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49261 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is the latest version of the dynamic speculative allocation beyond EOF patch set. The description of the patchset can be found here: http://oss.sgi.com/archives/xfs/2010-10/msg00040.html Version 4: - factored prealloc size into separate function to keep xfs_iomap_write_delay() easy to read. - convert i_dirty_releases counter to a flag. Version 3: - allocsize mount option returned to fixed preallocation size only. - reduces maximum dynamic prealloc size as the filesytem gets near full. - split i_delayed_blks bug fixes into new patch (posted in 2.6.37-rc bug fix series) Version 2: - base speculative execution size on current inode size, not the number of previous speculative allocations. From SRS0+Ksmg+16+fromorbit.com=dave@internode.on.net Sun Dec 12 19:33:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD1X0tj148732 for ; Sun, 12 Dec 2010 19:33:01 -0600 X-ASG-Debug-ID: 1292204090-304e00560000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DA6CF1CBC35E for ; Sun, 12 Dec 2010 17:34:50 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id TI3MdLKvhAEMdSnM for ; Sun, 12 Dec 2010 17:34:50 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49419284-1927428 for multiple; Mon, 13 Dec 2010 12:04:42 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PRxJI-0001mo-DQ; Mon, 13 Dec 2010 12:34:40 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PRxHe-00048h-UF; Mon, 13 Dec 2010 12:32:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: paulmck@linux.vnet.ibm.com, eric.dumazet@gmail.com X-ASG-Orig-Subj: [PATCH 1/3] xfs: rcu free inodes Subject: [PATCH 1/3] xfs: rcu free inodes Date: Mon, 13 Dec 2010 12:32:35 +1100 Message-Id: <1292203957-15819-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292203957-15819-1-git-send-email-david@fromorbit.com> References: <1292203957-15819-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1292204091 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.92 X-Barracuda-Spam-Status: No, SCORE=-0.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE_7582B, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49261 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.50 BSF_RULE_7582B Custom Rule 7582B X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Introduce RCU freeing of XFS inodes so that we can convert lookup traversals to use rcu_read_lock() protection. This patch only introduces the RCU freeing to minimise the potential conflicts with mainline if this is merged into mainline via a VFS patchset. It abuses the i_dentry list for the RCU callback structure because the VFS patches make this a union so it is safe to use like this and simplifies and merge issues. This patch uses basic RCU freeing rather than SLAB_DESTROY_BY_RCU. The later lookup patches need the same "found free inode" protection regardless of the RCU freeing method used, so once again the RCU freeing method can be dealt with apprpriately at merge time without affecting any other code. Signed-off-by: Dave Chinner --- fs/xfs/xfs_iget.c | 14 +++++++++++++- 1 files changed, 13 insertions(+), 1 deletions(-) diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index cdb1c25..9fae475 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c @@ -105,6 +105,18 @@ xfs_inode_alloc( } void +__xfs_inode_free( + struct rcu_head *head) +{ + struct inode *inode = container_of((void *)head, + struct inode, i_dentry); + struct xfs_inode *ip = XFS_I(inode); + + INIT_LIST_HEAD(&inode->i_dentry); + kmem_zone_free(xfs_inode_zone, ip); +} + +void xfs_inode_free( struct xfs_inode *ip) { @@ -147,7 +159,7 @@ xfs_inode_free( ASSERT(!spin_is_locked(&ip->i_flags_lock)); ASSERT(completion_done(&ip->i_flush)); - kmem_zone_free(xfs_inode_zone, ip); + call_rcu((struct rcu_head *)&VFS_I(ip)->i_dentry, __xfs_inode_free); } /* -- 1.7.2.3 From SRS0+Gu6A+16+fromorbit.com=dave@internode.on.net Sun Dec 12 19:33:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD1X0se148734 for ; Sun, 12 Dec 2010 19:33:01 -0600 X-ASG-Debug-ID: 1292204090-5bc303a10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 48944143F82C for ; Sun, 12 Dec 2010 17:34:51 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id p7bNHA5xLSJAcjd3 for ; Sun, 12 Dec 2010 17:34:51 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49867479-1927428 for multiple; Mon, 13 Dec 2010 12:04:32 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PRxJ8-0001me-HJ; Mon, 13 Dec 2010 12:34:30 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PRxHf-00048l-0z; Mon, 13 Dec 2010 12:32:59 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: paulmck@linux.vnet.ibm.com, eric.dumazet@gmail.com X-ASG-Orig-Subj: [PATCH 3/3] xfs: convert pag_ici_lock to a spin lock Subject: [PATCH 3/3] xfs: convert pag_ici_lock to a spin lock Date: Mon, 13 Dec 2010 12:32:37 +1100 Message-Id: <1292203957-15819-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292203957-15819-1-git-send-email-david@fromorbit.com> References: <1292203957-15819-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1292204092 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49260 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner now that we are using RCU protection for the inode cache lookups, the lock is only needed on the modification side. Hence it is not necessary for the lock to be a rwlock as there are no read side holders anymore. Convert it to a spin lock to reflect it's exclusive nature. Signed-off-by: Dave Chinner Reviewed-by: Alex Elder Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_sync.c | 14 +++++++------- fs/xfs/xfs_ag.h | 2 +- fs/xfs/xfs_iget.c | 10 +++++----- fs/xfs/xfs_mount.c | 2 +- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index 5ee02d7..d3b3b4f 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -602,12 +602,12 @@ xfs_inode_set_reclaim_tag( struct xfs_perag *pag; pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); - write_lock(&pag->pag_ici_lock); + spin_lock(&pag->pag_ici_lock); spin_lock(&ip->i_flags_lock); __xfs_inode_set_reclaim_tag(pag, ip); __xfs_iflags_set(ip, XFS_IRECLAIMABLE); spin_unlock(&ip->i_flags_lock); - write_unlock(&pag->pag_ici_lock); + spin_unlock(&pag->pag_ici_lock); xfs_perag_put(pag); } @@ -808,12 +808,12 @@ reclaim: * added to the tree assert that it's been there before to catch * problems with the inode life time early on. */ - write_lock(&pag->pag_ici_lock); + spin_lock(&pag->pag_ici_lock); if (!radix_tree_delete(&pag->pag_ici_root, XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino))) ASSERT(0); __xfs_inode_clear_reclaim(pag, ip); - write_unlock(&pag->pag_ici_lock); + spin_unlock(&pag->pag_ici_lock); /* * Here we do an (almost) spurious inode lock in order to coordinate @@ -877,14 +877,14 @@ restart: struct xfs_inode *batch[XFS_LOOKUP_BATCH]; int i; - write_lock(&pag->pag_ici_lock); + spin_lock(&pag->pag_ici_lock); nr_found = radix_tree_gang_lookup_tag( &pag->pag_ici_root, (void **)batch, first_index, XFS_LOOKUP_BATCH, XFS_ICI_RECLAIM_TAG); if (!nr_found) { - write_unlock(&pag->pag_ici_lock); + spin_unlock(&pag->pag_ici_lock); break; } @@ -911,7 +911,7 @@ restart: } /* unlock now we've grabbed the inodes. */ - write_unlock(&pag->pag_ici_lock); + spin_unlock(&pag->pag_ici_lock); for (i = 0; i < nr_found; i++) { if (!batch[i]) diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h index 63c7a1a..58632cc 100644 --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h @@ -227,7 +227,7 @@ typedef struct xfs_perag { atomic_t pagf_fstrms; /* # of filestreams active in this AG */ - rwlock_t pag_ici_lock; /* incore inode lock */ + spinlock_t pag_ici_lock; /* incore inode cache lock */ struct radix_tree_root pag_ici_root; /* incore inode cache root */ int pag_ici_reclaimable; /* reclaimable inodes */ struct mutex pag_ici_reclaim_lock; /* serialisation point */ diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index 1e3b035..ec440da 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c @@ -263,7 +263,7 @@ xfs_iget_cache_hit( goto out_error; } - write_lock(&pag->pag_ici_lock); + spin_lock(&pag->pag_ici_lock); spin_lock(&ip->i_flags_lock); ip->i_flags &= ~(XFS_IRECLAIMABLE | XFS_IRECLAIM); ip->i_flags |= XFS_INEW; @@ -276,7 +276,7 @@ xfs_iget_cache_hit( &xfs_iolock_active, "xfs_iolock_active"); spin_unlock(&ip->i_flags_lock); - write_unlock(&pag->pag_ici_lock); + spin_unlock(&pag->pag_ici_lock); } else { /* If the VFS inode is being torn down, pause and try again. */ if (!igrab(inode)) { @@ -354,7 +354,7 @@ xfs_iget_cache_miss( BUG(); } - write_lock(&pag->pag_ici_lock); + spin_lock(&pag->pag_ici_lock); /* insert the new inode */ error = radix_tree_insert(&pag->pag_ici_root, agino, ip); @@ -369,14 +369,14 @@ xfs_iget_cache_miss( ip->i_udquot = ip->i_gdquot = NULL; xfs_iflags_set(ip, XFS_INEW); - write_unlock(&pag->pag_ici_lock); + spin_unlock(&pag->pag_ici_lock); radix_tree_preload_end(); *ipp = ip; return 0; out_preload_end: - write_unlock(&pag->pag_ici_lock); + spin_unlock(&pag->pag_ici_lock); radix_tree_preload_end(); if (lock_flags) xfs_iunlock(ip, lock_flags); diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index fe27338..52186c0 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -598,7 +598,7 @@ xfs_initialize_perag( goto out_unwind; pag->pag_agno = index; pag->pag_mount = mp; - rwlock_init(&pag->pag_ici_lock); + spin_lock_init(&pag->pag_ici_lock); mutex_init(&pag->pag_ici_reclaim_lock); INIT_RADIX_TREE(&pag->pag_ici_root, GFP_ATOMIC); spin_lock_init(&pag->pag_buf_lock); -- 1.7.2.3 From SRS0+Ksmg+16+fromorbit.com=dave@internode.on.net Sun Dec 12 19:33:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD1X3jK148757 for ; Sun, 12 Dec 2010 19:33:03 -0600 X-ASG-Debug-ID: 1292204092-706703870000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1B02C1E2B80 for ; Sun, 12 Dec 2010 17:34:52 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id nNGqwBEojpfcj1YQ for ; Sun, 12 Dec 2010 17:34:52 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50107344-1927428 for multiple; Mon, 13 Dec 2010 12:04:41 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PRxJD-0001mk-Fp; Mon, 13 Dec 2010 12:34:35 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PRxHe-00048j-Vj; Mon, 13 Dec 2010 12:32:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: paulmck@linux.vnet.ibm.com, eric.dumazet@gmail.com X-ASG-Orig-Subj: [PATCH 2/3] xfs: convert inode cache lookups to use RCU locking Subject: [PATCH 2/3] xfs: convert inode cache lookups to use RCU locking Date: Mon, 13 Dec 2010 12:32:36 +1100 Message-Id: <1292203957-15819-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292203957-15819-1-git-send-email-david@fromorbit.com> References: <1292203957-15819-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1292204094 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49261 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner With delayed logging greatly increasing the sustained parallelism of inode operations, the inode cache locking is showing significant read vs write contention when inode reclaim runs at the same time as lookups. There is also a lot more write lock acquistions than there are read locks (4:1 ratio) so the read locking is not really buying us much in the way of parallelism. To avoid the read vs write contention, change the cache to use RCU locking on the read side. To avoid needing to RCU free every single inode, use the built in slab RCU freeing mechanism. This requires us to be able to detect lookups of freed inodes, so enÑ•ure that ever freed inode has an inode number of zero and the XFS_IRECLAIM flag set. We already check the XFS_IRECLAIM flag in cache hit lookup path, but also add a check for a zero inode number as well. We canthen convert all the read locking lockups to use RCU read side locking and hence remove all read side locking. Signed-off-by: Dave Chinner Reviewed-by: Alex Elder --- fs/xfs/linux-2.6/xfs_sync.c | 27 ++++++++++++++++----- fs/xfs/xfs_iget.c | 50 +++++++++++++++++++++++++++++++---------- fs/xfs/xfs_inode.c | 52 +++++++++++++++++++++++++++++++++---------- 3 files changed, 98 insertions(+), 31 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index afb0d7c..5ee02d7 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -53,14 +53,20 @@ xfs_inode_ag_walk_grab( { struct inode *inode = VFS_I(ip); + /* check for stale RCU freed inode */ + spin_lock(&ip->i_flags_lock); + if (!ip->i_ino) + goto out_unlock_noent; + + /* avoid new or reclaimable inodes. Leave for reclaim code to flush */ + if (__xfs_iflags_test(ip, XFS_INEW | XFS_IRECLAIMABLE | XFS_IRECLAIM)) + goto out_unlock_noent; + spin_unlock(&ip->i_flags_lock); + /* nothing to sync during shutdown */ if (XFS_FORCED_SHUTDOWN(ip->i_mount)) return EFSCORRUPTED; - /* avoid new or reclaimable inodes. Leave for reclaim code to flush */ - if (xfs_iflags_test(ip, XFS_INEW | XFS_IRECLAIMABLE | XFS_IRECLAIM)) - return ENOENT; - /* If we can't grab the inode, it must on it's way to reclaim. */ if (!igrab(inode)) return ENOENT; @@ -72,6 +78,10 @@ xfs_inode_ag_walk_grab( /* inode is valid */ return 0; + +out_unlock_noent: + spin_unlock(&ip->i_flags_lock); + return ENOENT; } STATIC int @@ -98,12 +108,12 @@ restart: int error = 0; int i; - read_lock(&pag->pag_ici_lock); + rcu_read_lock(); nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void **)batch, first_index, XFS_LOOKUP_BATCH); if (!nr_found) { - read_unlock(&pag->pag_ici_lock); + rcu_read_unlock(); break; } @@ -129,7 +139,7 @@ restart: } /* unlock now we've grabbed the inodes. */ - read_unlock(&pag->pag_ici_lock); + rcu_read_unlock(); for (i = 0; i < nr_found; i++) { if (!batch[i]) @@ -639,6 +649,9 @@ xfs_reclaim_inode_grab( struct xfs_inode *ip, int flags) { + /* check for stale RCU freed inode */ + if (!ip->i_ino) + return 1; /* * do some unlocked checks first to avoid unnecceary lock traffic. diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index 9fae475..1e3b035 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c @@ -80,6 +80,7 @@ xfs_inode_alloc( ASSERT(atomic_read(&ip->i_pincount) == 0); ASSERT(!spin_is_locked(&ip->i_flags_lock)); ASSERT(completion_done(&ip->i_flush)); + ASSERT(ip->i_ino == 0); mrlock_init(&ip->i_iolock, MRLOCK_BARRIER, "xfsio", ip->i_ino); lockdep_set_class_and_name(&ip->i_iolock.mr_lock, @@ -98,9 +99,6 @@ xfs_inode_alloc( ip->i_size = 0; ip->i_new_size = 0; - /* prevent anyone from using this yet */ - VFS_I(ip)->i_state = I_NEW; - return ip; } @@ -159,6 +157,16 @@ xfs_inode_free( ASSERT(!spin_is_locked(&ip->i_flags_lock)); ASSERT(completion_done(&ip->i_flush)); + /* + * Because we use RCU freeing we need to ensure the inode always + * appears to be reclaimed with an invalid inode number when in the + * free state. The ip->i_flags_lock provides the barrier against lookup + * races. + */ + spin_lock(&ip->i_flags_lock); + ip->i_flags = XFS_IRECLAIM; + ip->i_ino = 0; + spin_unlock(&ip->i_flags_lock); call_rcu((struct rcu_head *)&VFS_I(ip)->i_dentry, __xfs_inode_free); } @@ -169,14 +177,32 @@ static int xfs_iget_cache_hit( struct xfs_perag *pag, struct xfs_inode *ip, + xfs_ino_t ino, int flags, - int lock_flags) __releases(pag->pag_ici_lock) + int lock_flags) __releases(RCU) { struct inode *inode = VFS_I(ip); struct xfs_mount *mp = ip->i_mount; int error; + /* + * check for re-use of an inode within an RCU grace period due to the + * radix tree nodes not being updated yet. We monitor for this by + * setting the inode number to zero before freeing the inode structure. + * If the inode has been reallocated and set up, then the inode number + * will not match, so check for that, too. + */ spin_lock(&ip->i_flags_lock); + if (ip->i_ino != ino) { + trace_xfs_iget_skip(ip); + XFS_STATS_INC(xs_ig_frecycle); + spin_unlock(&ip->i_flags_lock); + rcu_read_unlock(); + /* Expire the grace period so we don't trip over it again. */ + synchronize_rcu(); + return EAGAIN; + } + /* * If we are racing with another cache hit that is currently @@ -219,7 +245,7 @@ xfs_iget_cache_hit( ip->i_flags |= XFS_IRECLAIM; spin_unlock(&ip->i_flags_lock); - read_unlock(&pag->pag_ici_lock); + rcu_read_unlock(); error = -inode_init_always(mp->m_super, inode); if (error) { @@ -227,7 +253,7 @@ xfs_iget_cache_hit( * Re-initializing the inode failed, and we are in deep * trouble. Try to re-add it to the reclaim list. */ - read_lock(&pag->pag_ici_lock); + rcu_read_lock(); spin_lock(&ip->i_flags_lock); ip->i_flags &= ~XFS_INEW; @@ -261,7 +287,7 @@ xfs_iget_cache_hit( /* We've got a live one. */ spin_unlock(&ip->i_flags_lock); - read_unlock(&pag->pag_ici_lock); + rcu_read_unlock(); trace_xfs_iget_hit(ip); } @@ -275,7 +301,7 @@ xfs_iget_cache_hit( out_error: spin_unlock(&ip->i_flags_lock); - read_unlock(&pag->pag_ici_lock); + rcu_read_unlock(); return error; } @@ -397,7 +423,7 @@ xfs_iget( xfs_agino_t agino; /* reject inode numbers outside existing AGs */ - if (XFS_INO_TO_AGNO(mp, ino) >= mp->m_sb.sb_agcount) + if (!ino || XFS_INO_TO_AGNO(mp, ino) >= mp->m_sb.sb_agcount) return EINVAL; /* get the perag structure and ensure that it's inode capable */ @@ -406,15 +432,15 @@ xfs_iget( again: error = 0; - read_lock(&pag->pag_ici_lock); + rcu_read_lock(); ip = radix_tree_lookup(&pag->pag_ici_root, agino); if (ip) { - error = xfs_iget_cache_hit(pag, ip, flags, lock_flags); + error = xfs_iget_cache_hit(pag, ip, ino, flags, lock_flags); if (error) goto out_error_or_again; } else { - read_unlock(&pag->pag_ici_lock); + rcu_read_unlock(); XFS_STATS_INC(xs_ig_missed); error = xfs_iget_cache_miss(mp, pag, tp, ino, &ip, diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 108c7a0..43ffd90 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2000,17 +2000,33 @@ xfs_ifree_cluster( */ for (i = 0; i < ninodes; i++) { retry: - read_lock(&pag->pag_ici_lock); + rcu_read_lock(); ip = radix_tree_lookup(&pag->pag_ici_root, XFS_INO_TO_AGINO(mp, (inum + i))); - /* Inode not in memory or stale, nothing to do */ - if (!ip || xfs_iflags_test(ip, XFS_ISTALE)) { - read_unlock(&pag->pag_ici_lock); + /* Inode not in memory, nothing to do */ + if (!ip) { + rcu_read_unlock(); continue; } /* + * because this is an RCU protected lookup, we could + * find a recently freed or even reallocated inode + * during the lookup. We need to check under the + * i_flags_lock for a valid inode here. Skip it if it + * is not valid, the wrong inode or stale. + */ + spin_lock(&ip->i_flags_lock); + if (ip->i_ino != inum + i || + __xfs_iflags_test(ip, XFS_ISTALE)) { + spin_unlock(&ip->i_flags_lock); + rcu_read_unlock(); + continue; + } + spin_unlock(&ip->i_flags_lock); + + /* * Don't try to lock/unlock the current inode, but we * _cannot_ skip the other inodes that we did not find * in the list attached to the buffer and are not @@ -2019,11 +2035,11 @@ retry: */ if (ip != free_ip && !xfs_ilock_nowait(ip, XFS_ILOCK_EXCL)) { - read_unlock(&pag->pag_ici_lock); + rcu_read_unlock(); delay(1); goto retry; } - read_unlock(&pag->pag_ici_lock); + rcu_read_unlock(); xfs_iflock(ip); xfs_iflags_set(ip, XFS_ISTALE); @@ -2629,7 +2645,7 @@ xfs_iflush_cluster( mask = ~(((XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog)) - 1); first_index = XFS_INO_TO_AGINO(mp, ip->i_ino) & mask; - read_lock(&pag->pag_ici_lock); + rcu_read_lock(); /* really need a gang lookup range call here */ nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void**)ilist, first_index, inodes_per_cluster); @@ -2640,9 +2656,21 @@ xfs_iflush_cluster( iq = ilist[i]; if (iq == ip) continue; - /* if the inode lies outside this cluster, we're done. */ - if ((XFS_INO_TO_AGINO(mp, iq->i_ino) & mask) != first_index) - break; + + /* + * because this is an RCU protected lookup, we could find a + * recently freed or even reallocated inode during the lookup. + * We need to check under the i_flags_lock for a valid inode + * here. Skip it if it is not valid or the wrong inode. + */ + spin_lock(&ip->i_flags_lock); + if (!ip->i_ino || + (XFS_INO_TO_AGINO(mp, iq->i_ino) & mask) != first_index) { + spin_unlock(&ip->i_flags_lock); + continue; + } + spin_unlock(&ip->i_flags_lock); + /* * Do an un-protected check to see if the inode is dirty and * is a candidate for flushing. These checks will be repeated @@ -2692,7 +2720,7 @@ xfs_iflush_cluster( } out_free: - read_unlock(&pag->pag_ici_lock); + rcu_read_unlock(); kmem_free(ilist); out_put: xfs_perag_put(pag); @@ -2704,7 +2732,7 @@ cluster_corrupt_out: * Corruption detected in the clustering loop. Invalidate the * inode buffer and shut down the filesystem. */ - read_unlock(&pag->pag_ici_lock); + rcu_read_unlock(); /* * Clean up the buffer. If it was B_DELWRI, just release it -- * brelse can handle it with no problems. If not, shut down the -- 1.7.2.3 From SRS0+Wbf7+16+fromorbit.com=dave@internode.on.net Sun Dec 12 19:33:09 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD1X9Jn148789 for ; Sun, 12 Dec 2010 19:33:09 -0600 X-ASG-Debug-ID: 1292204099-0be702310000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BD56A1CBC360 for ; Sun, 12 Dec 2010 17:34:59 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id pX4pS3cIjqB5HWyi for ; Sun, 12 Dec 2010 17:34:59 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49105785-1927428 for multiple; Mon, 13 Dec 2010 12:04:41 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PRxJI-0001mj-DH; Mon, 13 Dec 2010 12:34:40 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PRxHe-00048f-Si; Mon, 13 Dec 2010 12:32:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: paulmck@linux.vnet.ibm.com, eric.dumazet@gmail.com X-ASG-Orig-Subj: [PATCH 0/2] xfs: RCU inode freeing and lookups V3 Subject: [PATCH 0/2] xfs: RCU inode freeing and lookups V3 Date: Mon, 13 Dec 2010 12:32:34 +1100 Message-Id: <1292203957-15819-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1292204100 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49261 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This series converts the XFS inode cache to use RCU freeing for freeing of the inodes and uses RCU locking for all the lookups. It uses the ip->i_ino values and ip->i_flags & XFS_IRECLAIM being checked under the ip->i_flags_lock to detect inodes that have been freed during lookups. Version 3: - add patch for specific RCU freeing of inodes rather than relying on an external tree to provide RCU freeing functionality. This uses standard RCU freeing mechanisms rather than SLAB_DESTROY_BY_RCU. This is kept as a separate patch to minimise the merge conflict issues that may arise if the change is made through VFS code first. - Drop specific references to SLAB_DESTROY_BY_RCU, but keep all the lookup guards for reclaimed/reused inodes as they are mostly the same for both methods of RCU inode freeing. Version 2: - check ip->i_ino under i_flags lock on cache hit - remove duplicate ip->i_ino == 0 check in xfs_dqrele_inode - Fixed inode cluster walks to check for valid i_ino under i_flags_lock. - Fixed ag walk lookups to check i_ino under i_flags_lock. From lmcilroy@redhat.com Sun Dec 12 19:41:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_32, J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD1fZvf149097 for ; Sun, 12 Dec 2010 19:41:35 -0600 X-ASG-Debug-ID: 1292204605-305f00800000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx4-phx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3EEDB1CBC39A for ; Sun, 12 Dec 2010 17:43:25 -0800 (PST) Received: from mx4-phx2.redhat.com (mx4-phx2.redhat.com [209.132.183.25]) by cuda.sgi.com with ESMTP id Va2ZhS1OmCQGEquU for ; Sun, 12 Dec 2010 17:43:25 -0800 (PST) Received: from mail05.corp.redhat.com (zmail05.collab.prod.int.phx2.redhat.com [10.5.5.46]) by mx4-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id oBD1hBbV008322; Sun, 12 Dec 2010 20:43:11 -0500 Date: Sun, 12 Dec 2010 20:43:11 -0500 (EST) From: Lachlan McIlroy Reply-To: Lachlan McIlroy To: Dave Chinner Cc: xfs@oss.sgi.com, Christoph Hellwig Message-ID: <1853857220.660151292204591887.JavaMail.root@zmail05.collab.prod.int.phx2.redhat.com> In-Reply-To: <996570405.660111292204469269.JavaMail.root@zmail05.collab.prod.int.phx2.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: prevent NMI timeouts in cmn_err Subject: Re: [PATCH] xfs: prevent NMI timeouts in cmn_err MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.5.5.71] X-Mailer: Zimbra 5.0.21_GA_3150.RHEL4_64 (ZimbraWebClient - FF3.0 (Linux)/5.0.21_GA_3150.RHEL4_64) X-Barracuda-Connect: mx4-phx2.redhat.com[209.132.183.25] X-Barracuda-Start-Time: 1292204606 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49261 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean ----- "Dave Chinner" wrote: > On Fri, Dec 10, 2010 at 08:29:35AM -0500, Christoph Hellwig wrote: > > On Fri, Dec 03, 2010 at 03:38:46PM +1100, Dave Chinner wrote: > > > FWIW, while these macros are the best way to make a simple > backport > > > is possible, I just discovered that mainline has a %pV format > > > operator that allows an implementation like: > > > > > > void > > > xfs_fs_cmn_err( > > > const char *lvl, > > > struct xfs_mount *mp, > > > const char *fmt, > > > ...) > > > { > > > struct va_format vaf; > > > va_list args; > > > > > > va_start(args, fmt); > > > vaf.fmt = fmt; > > > vaf.va = &args; > > > > > > printk("%sFilesystem %s: %pV", lvl, mp->m_fsname, &vaf); > > > va_end(args); > > > > > > BUG_ON(strncmp(lvl, KERN_EMERG, strlen(KERN_EMERG)) == 0); > > > } > > > > With this we can also keep the existing integer-based CE_ values > > and do trivial array lookup. That also avoids having to do a strcmp > for > > every message printed. > > Very true. > > Ok, so how do we want to process for this? I'm happy to drop the > macro-ised patch and only use it as a backportable fix for old > kernels - mainline appears to have a lot more functionality in this > area than even recent distro kernels. Lachlan - is that an > acceptable approach for you? Yes, that works for me. We don't have much choice for RHEL4/5 and there's no reason that should compromise a better solution upstream. > > It seems to me that the above is a much better way to start cleaning > up the mainline code base, in the following way: > > 1. the above patch to remove the local message buffer + > lock. > 2. rationalise all the differences in error reporting down > to a common interface > 3. convert the common interface to use kernel log levels > directly. > > The current trend seems to be to move towards logging interfaces > with the following template: > > {sub_sys}_pr_{level}(priv, fmt, ...) > > Which in this case would give us: > > xfs_pr_debug(struct xfs_mount *mp, char *fmt, ...); > xfs_pr_note(struct xfs_mount *mp, char *fmt, ...); > .... > xfs_pr_alert(struct xfs_mount *mp, char *fmt, ...); > xfs_pr_emergency(struct xfs_mount *mp, char *fmt, ...); > > And a variant for the panic mask tagged version of xfs_pr_alert() > of: > > xfs_pr_alert_tag(struct xfs_mount *mp, int tag, char *fmt, ...); > > I can't see any particular reason for needing to keep the separate > parameter for the log level, nor for keeping all the different > logging variants we currently have. Wont you need to reintroduce the log level parameter when each of these new functions calls the common interface? ie most of the above functions will just be wrappers that convert the function name to a log level. > > I'm open to other ideas on the best way to rationalise all the > logging we currently have - the above is just my current thoughts on > what to do. I'm pushing this out as a proposal for discussion before > I change anything as I don't relish the idea of iterating different > logging APIs through patches... > > Cheers, > > Dave. > > > > > > > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From SRS0+BL83+16+fromorbit.com=david@internode.on.net Sun Dec 12 21:42:52 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_32, J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD3gqfi155755 for ; Sun, 12 Dec 2010 21:42:52 -0600 X-ASG-Debug-ID: 1292211880-5fc1035d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9DFDD1E3128 for ; Sun, 12 Dec 2010 19:44:40 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id ewdKzoebVzuYWuWI for ; Sun, 12 Dec 2010 19:44:40 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49119680-1927428 for multiple; Mon, 13 Dec 2010 14:14:23 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PRzKi-0001wr-VT; Mon, 13 Dec 2010 14:44:17 +1100 Date: Mon, 13 Dec 2010 14:44:16 +1100 From: Dave Chinner To: Lachlan McIlroy Cc: xfs@oss.sgi.com, Christoph Hellwig X-ASG-Orig-Subj: Re: [PATCH] xfs: prevent NMI timeouts in cmn_err Subject: Re: [PATCH] xfs: prevent NMI timeouts in cmn_err Message-ID: <20101213034416.GD9925@dastard> References: <996570405.660111292204469269.JavaMail.root@zmail05.collab.prod.int.phx2.redhat.com> <1853857220.660151292204591887.JavaMail.root@zmail05.collab.prod.int.phx2.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1853857220.660151292204591887.JavaMail.root@zmail05.collab.prod.int.phx2.redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1292211883 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49269 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sun, Dec 12, 2010 at 08:43:11PM -0500, Lachlan McIlroy wrote: > > ----- "Dave Chinner" wrote: > > > On Fri, Dec 10, 2010 at 08:29:35AM -0500, Christoph Hellwig wrote: > > > On Fri, Dec 03, 2010 at 03:38:46PM +1100, Dave Chinner wrote: > > > > FWIW, while these macros are the best way to make a simple > > backport > > > > is possible, I just discovered that mainline has a %pV format > > > > operator that allows an implementation like: > > > > > > > > void > > > > xfs_fs_cmn_err( > > > > const char *lvl, > > > > struct xfs_mount *mp, > > > > const char *fmt, > > > > ...) > > > > { > > > > struct va_format vaf; > > > > va_list args; > > > > > > > > va_start(args, fmt); > > > > vaf.fmt = fmt; > > > > vaf.va = &args; > > > > > > > > printk("%sFilesystem %s: %pV", lvl, mp->m_fsname, &vaf); > > > > va_end(args); > > > > > > > > BUG_ON(strncmp(lvl, KERN_EMERG, strlen(KERN_EMERG)) == 0); > > > > } > > > > > > With this we can also keep the existing integer-based CE_ values > > > and do trivial array lookup. That also avoids having to do a strcmp > > for > > > every message printed. > > > > Very true. > > > > Ok, so how do we want to process for this? I'm happy to drop the > > macro-ised patch and only use it as a backportable fix for old > > kernels - mainline appears to have a lot more functionality in this > > area than even recent distro kernels. Lachlan - is that an > > acceptable approach for you? > > Yes, that works for me. We don't have much choice for RHEL4/5 and > there's no reason that should compromise a better solution upstream. Ok, I'll get that ball moving... > > It seems to me that the above is a much better way to start cleaning > > up the mainline code base, in the following way: > > > > 1. the above patch to remove the local message buffer + > > lock. > > 2. rationalise all the differences in error reporting down > > to a common interface > > 3. convert the common interface to use kernel log levels > > directly. > > > > The current trend seems to be to move towards logging interfaces > > with the following template: > > > > {sub_sys}_pr_{level}(priv, fmt, ...) > > > > Which in this case would give us: > > > > xfs_pr_debug(struct xfs_mount *mp, char *fmt, ...); > > xfs_pr_note(struct xfs_mount *mp, char *fmt, ...); > > .... > > xfs_pr_alert(struct xfs_mount *mp, char *fmt, ...); > > xfs_pr_emergency(struct xfs_mount *mp, char *fmt, ...); > > > > And a variant for the panic mask tagged version of xfs_pr_alert() > > of: > > > > xfs_pr_alert_tag(struct xfs_mount *mp, int tag, char *fmt, ...); > > > > I can't see any particular reason for needing to keep the separate > > parameter for the log level, nor for keeping all the different > > logging variants we currently have. > > Wont you need to reintroduce the log level parameter when each of these > new functions calls the common interface? Ah, what I meant was that the above xfs_pr_*() functions form the common logging interface, instead of cmn_err, xfs_cmn_err, xfs_fs_cmn_err, etc. So the second step above would be to convert all the existing logging calls to use this, but still using the current cmn_err() back end for the custom XFS log messages. i.e. the callers change API, but they still use the same CE_* levels. > ie most of the above functions > will just be wrappers that convert the function name to a log level. The third step is to change the implementation to something like the dev_() printk implementation, or possibly even using the pr_ macros directly via creative abuse of the pr_fmt() macro. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+Gu6A+16+fromorbit.com=dave@internode.on.net Sun Dec 12 22:32:12 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD4WCFd158200 for ; Sun, 12 Dec 2010 22:32:12 -0600 X-ASG-Debug-ID: 1292214841-63bb02b90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8B37B143FE32 for ; Sun, 12 Dec 2010 20:34:01 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id 0uNJp55QPV2c02Xj for ; Sun, 12 Dec 2010 20:34:01 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49888021-1927428 for ; Mon, 13 Dec 2010 15:04:01 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PS06p-000217-OL for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:33:59 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PS05L-0004iY-L0 for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:32:27 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 5/9] xfs: reduce the number of AIL push wakeups Subject: [PATCH 5/9] xfs: reduce the number of AIL push wakeups Date: Mon, 13 Dec 2010 15:32:19 +1100 Message-Id: <1292214743-18073-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292214743-18073-1-git-send-email-david@fromorbit.com> References: <1292214743-18073-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1292214843 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49272 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The xfaild often tries to rest to wait for congestion to pass of for IO to complete, but is regularly woken in tail-pushing situations. In severe cases, the xfsaild is getting woken tens of thousands of times a second. Reduce the number needless wakeups by only waking the xfsaild if the new target is larger than the old one. Further make short sleeps uninterruptible as they occur when the xfsaild has decided it needs to back off to allow some IO to complete and being woken early is counter-productive. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_super.c | 20 ++++++++++++++++---- 1 files changed, 16 insertions(+), 4 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index abcda07..b49ad02 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -834,8 +834,11 @@ xfsaild_wakeup( struct xfs_ail *ailp, xfs_lsn_t threshold_lsn) { - ailp->xa_target = threshold_lsn; - wake_up_process(ailp->xa_task); + /* only ever move the target forwards */ + if (XFS_LSN_CMP(threshold_lsn, ailp->xa_target) > 0) { + ailp->xa_target = threshold_lsn; + wake_up_process(ailp->xa_task); + } } STATIC int @@ -847,8 +850,17 @@ xfsaild( long tout = 0; /* milliseconds */ while (!kthread_should_stop()) { - schedule_timeout_interruptible(tout ? - msecs_to_jiffies(tout) : MAX_SCHEDULE_TIMEOUT); + /* + * for short sleeps indicating congestion, don't allow us to + * get woken early. Otherwise all we do is bang on the AIL lock + * without making progress. + */ + if (tout && tout <= 20) + __set_current_state(TASK_KILLABLE); + else + __set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(tout ? + msecs_to_jiffies(tout) : MAX_SCHEDULE_TIMEOUT); /* swsusp */ try_to_freeze(); -- 1.7.2.3 From SRS0+Gu6A+16+fromorbit.com=dave@internode.on.net Sun Dec 12 22:32:12 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD4WCsP158201 for ; Sun, 12 Dec 2010 22:32:12 -0600 X-ASG-Debug-ID: 1292214841-63ba02a20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 84748143FE2E for ; Sun, 12 Dec 2010 20:34:01 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id Xq8c7gkvGagptflV for ; Sun, 12 Dec 2010 20:34:01 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49888020-1927428 for ; Mon, 13 Dec 2010 15:04:00 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PS06p-00021E-VC for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:33:59 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PS05L-0004ii-Rv for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:32:27 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 9/9] xfs: use AIL bulk delete function to implement single delete Subject: [PATCH 9/9] xfs: use AIL bulk delete function to implement single delete Date: Mon, 13 Dec 2010 15:32:23 +1100 Message-Id: <1292214743-18073-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292214743-18073-1-git-send-email-david@fromorbit.com> References: <1292214743-18073-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1292214843 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49272 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner We now have two copies of AIL delete operations that are mostly duplicate functionality. The single log item deletes can be implemented via the bulk updates by turning xfs_trans_ail_delete() into a simple wrapper. This removes all the duplicate delete functionality and associated helpers. Signed-off-by: Dave Chinner --- fs/xfs/xfs_trans_ail.c | 65 ----------------------------------------------- fs/xfs/xfs_trans_priv.h | 20 +++++++++----- 2 files changed, 13 insertions(+), 72 deletions(-) diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index 8481a5a..c5bbbc4 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -523,70 +523,6 @@ xfs_trans_ail_update_bulk( } /* - * Delete the given item from the AIL. It must already be in - * the AIL. - * - * Wakeup anyone with an lsn less than item's lsn. If the item - * we delete in the AIL is the minimum one, update the tail lsn in the - * log manager. - * - * Clear the IN_AIL flag from the item, reset its lsn to 0, and - * bump the AIL's generation count to indicate that the tree - * has changed. - * - * This function must be called with the AIL lock held. The lock - * is dropped before returning. - */ -void -xfs_trans_ail_delete( - struct xfs_ail *ailp, - xfs_log_item_t *lip) __releases(ailp->xa_lock) -{ - xfs_log_item_t *mlip; - xfs_lsn_t tail_lsn; - - if (lip->li_flags & XFS_LI_IN_AIL) { - mlip = xfs_ail_min(ailp); - xfs_ail_delete(ailp, lip); - - - lip->li_flags &= ~XFS_LI_IN_AIL; - lip->li_lsn = 0; - - if (mlip == lip) { - mlip = xfs_ail_min(ailp); - /* - * It is not safe to access mlip after the AIL lock - * is dropped, so we must get a copy of li_lsn - * before we do so. This is especially important - * on 32-bit platforms where accessing and updating - * 64-bit values like li_lsn is not atomic. - */ - tail_lsn = mlip ? mlip->li_lsn : 0; - spin_unlock(&ailp->xa_lock); - xfs_log_move_tail(ailp->xa_mount, tail_lsn); - } else { - spin_unlock(&ailp->xa_lock); - } - } - else { - /* - * If the file system is not being shutdown, we are in - * serious trouble if we get to this stage. - */ - struct xfs_mount *mp = ailp->xa_mount; - - spin_unlock(&ailp->xa_lock); - if (!XFS_FORCED_SHUTDOWN(mp)) { - xfs_cmn_err(XFS_PTAG_AILDELETE, CE_ALERT, mp, - "%s: attempting to delete a log item that is not in the AIL", - __func__); - xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); - } - } -} - -/* * xfs_trans_ail_delete_bulk - remove multiple log items from the AIL * * @xfs_trans_ail_delete_bulk takes an array of log items that all need to @@ -660,7 +596,6 @@ xfs_trans_ail_delete_bulk( xfs_log_move_tail(ailp->xa_mount, tail_lsn); } - /* * The active item list (AIL) is a doubly linked list of log * items sorted by ascending lsn. The base of the list is diff --git a/fs/xfs/xfs_trans_priv.h b/fs/xfs/xfs_trans_priv.h index 95c95b6..a252469 100644 --- a/fs/xfs/xfs_trans_priv.h +++ b/fs/xfs/xfs_trans_priv.h @@ -89,13 +89,19 @@ xfs_trans_ail_update( xfs_trans_ail_update_bulk(ailp, log_items, 1, lsn); } -void xfs_trans_ail_delete(struct xfs_ail *ailp, - struct xfs_log_item *lip) - __releases(ailp->xa_lock); -void xfs_trans_ail_delete_bulk(struct xfs_ail *ailp, - struct xfs_log_item **log_items, - int nr_items) - __releases(ailp->xa_lock); +void xfs_trans_ail_delete_bulk(struct xfs_ail *ailp, + struct xfs_log_item **log_items, int nr_items) + __releases(ailp->xa_lock); +static inline void +xfs_trans_ail_delete( + struct xfs_ail *ailp, + xfs_log_item_t *lip) __releases(ailp->xa_lock) +{ + struct xfs_log_item *log_items[1] = { lip, }; + + xfs_trans_ail_delete_bulk(ailp, log_items, 1); +} + void xfs_trans_ail_push(struct xfs_ail *, xfs_lsn_t); void xfs_trans_unlocked_item(struct xfs_ail *, xfs_log_item_t *); -- 1.7.2.3 From SRS0+Ksmg+16+fromorbit.com=dave@internode.on.net Sun Dec 12 22:32:21 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_64 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD4WLc5158230 for ; Sun, 12 Dec 2010 22:32:21 -0600 X-ASG-Debug-ID: 1292214851-0f4202d20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0A3EC1CBC72C for ; Sun, 12 Dec 2010 20:34:11 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id 1IjGBv077NKXTnj3 for ; Sun, 12 Dec 2010 20:34:11 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49639688-1927428 for ; Mon, 13 Dec 2010 15:04:10 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PS06z-00021O-KW for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:34:09 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PS05L-0004iS-Ha for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:32:27 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 3/9] xfs: clean up xfs_ail_delete() Subject: [PATCH 3/9] xfs: clean up xfs_ail_delete() Date: Mon, 13 Dec 2010 15:32:17 +1100 Message-Id: <1292214743-18073-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292214743-18073-1-git-send-email-david@fromorbit.com> References: <1292214743-18073-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1292214853 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner xfs_ail_delete() has a needlessly complex interface. It returns the log item that was passed in for deletion (which the callers then assert is identical to the one passed in), and callers of xfs_ail_delete() still need to invalidate current traversal cursors. Make xfs_ail_delete() return void, move the cursor invalidation inside it, and clean up the callers just to use the log item pointer they passed in. While cleaning up, remove the messy and unnecessary "/* ARGUSED */" comments around all these functions. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_trans_ail.c | 27 +++++++-------------------- 1 files changed, 7 insertions(+), 20 deletions(-) diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index dc90695..645928c 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -29,7 +29,7 @@ #include "xfs_error.h" STATIC void xfs_ail_insert(struct xfs_ail *, xfs_log_item_t *); -STATIC xfs_log_item_t * xfs_ail_delete(struct xfs_ail *, xfs_log_item_t *); +STATIC void xfs_ail_delete(struct xfs_ail *, xfs_log_item_t *); STATIC xfs_log_item_t * xfs_ail_min(struct xfs_ail *); STATIC xfs_log_item_t * xfs_ail_next(struct xfs_ail *, xfs_log_item_t *); @@ -468,16 +468,13 @@ xfs_trans_ail_update( xfs_log_item_t *lip, xfs_lsn_t lsn) __releases(ailp->xa_lock) { - xfs_log_item_t *dlip = NULL; xfs_log_item_t *mlip; /* ptr to minimum lip */ xfs_lsn_t tail_lsn; mlip = xfs_ail_min(ailp); if (lip->li_flags & XFS_LI_IN_AIL) { - dlip = xfs_ail_delete(ailp, lip); - ASSERT(dlip == lip); - xfs_trans_ail_cursor_clear(ailp, dlip); + xfs_ail_delete(ailp, lip); } else { lip->li_flags |= XFS_LI_IN_AIL; } @@ -485,7 +482,7 @@ xfs_trans_ail_update( lip->li_lsn = lsn; xfs_ail_insert(ailp, lip); - if (mlip == dlip) { + if (mlip == lip) { mlip = xfs_ail_min(ailp); /* * It is not safe to access mlip after the AIL lock is @@ -524,21 +521,18 @@ xfs_trans_ail_delete( struct xfs_ail *ailp, xfs_log_item_t *lip) __releases(ailp->xa_lock) { - xfs_log_item_t *dlip; xfs_log_item_t *mlip; xfs_lsn_t tail_lsn; if (lip->li_flags & XFS_LI_IN_AIL) { mlip = xfs_ail_min(ailp); - dlip = xfs_ail_delete(ailp, lip); - ASSERT(dlip == lip); - xfs_trans_ail_cursor_clear(ailp, dlip); + xfs_ail_delete(ailp, lip); lip->li_flags &= ~XFS_LI_IN_AIL; lip->li_lsn = 0; - if (mlip == dlip) { + if (mlip == lip) { mlip = xfs_ail_min(ailp); /* * It is not safe to access mlip after the AIL lock @@ -632,7 +626,6 @@ STATIC void xfs_ail_insert( struct xfs_ail *ailp, xfs_log_item_t *lip) -/* ARGSUSED */ { xfs_log_item_t *next_lip; @@ -661,18 +654,14 @@ xfs_ail_insert( /* * Delete the given item from the AIL. Return a pointer to the item. */ -/*ARGSUSED*/ -STATIC xfs_log_item_t * +STATIC void xfs_ail_delete( struct xfs_ail *ailp, xfs_log_item_t *lip) -/* ARGSUSED */ { xfs_ail_check(ailp, lip); - list_del(&lip->li_ail); - - return lip; + xfs_trans_ail_cursor_clear(ailp, lip); } /* @@ -682,7 +671,6 @@ xfs_ail_delete( STATIC xfs_log_item_t * xfs_ail_min( struct xfs_ail *ailp) -/* ARGSUSED */ { if (list_empty(&ailp->xa_ail)) return NULL; @@ -699,7 +687,6 @@ STATIC xfs_log_item_t * xfs_ail_next( struct xfs_ail *ailp, xfs_log_item_t *lip) -/* ARGSUSED */ { if (lip->li_ail.next == &ailp->xa_ail) return NULL; -- 1.7.2.3 From SRS0+hhRK+16+fromorbit.com=dave@internode.on.net Sun Dec 12 22:32:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD4WMB7158242 for ; Sun, 12 Dec 2010 22:32:22 -0600 X-ASG-Debug-ID: 1292214851-0f3d02e00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 923CA1CBC730 for ; Sun, 12 Dec 2010 20:34:12 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id Qmn0TOePX5VUQgdi for ; Sun, 12 Dec 2010 20:34:12 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49483524-1927428 for ; Mon, 13 Dec 2010 15:04:11 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PS06p-000211-HU for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:33:59 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PS05L-0004iN-Dd for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:32:27 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/9] xfs: fix EFI transaction cancellation. Subject: [PATCH 1/9] xfs: fix EFI transaction cancellation. Date: Mon, 13 Dec 2010 15:32:15 +1100 Message-Id: <1292214743-18073-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292214743-18073-1-git-send-email-david@fromorbit.com> References: <1292214743-18073-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1292214853 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner XFS_EFI_CANCELED has not been set in the code base since xfs_efi_cancel() was removed back in 2006 by commit 065d312e15902976d256ddaf396a7950ec0350a8 ("[XFS] Remove unused iop_abort log item operation), and even then xfs_efi_cancel() was never called. I haven't tracked it back further than that (beyond git history), but it indicates that the handling of EFIs in cancelled transactions has been broken for a long time. Basically, when we get an IOP_UNPIN(lip, 1); call from xfs_trans_uncommit() (i.e. remove == 1), if we don't free the log item descriptor we leak it. Fix the behviour to be correct and kill the XFS_EFI_CANCELED flag. Signed-off-by: Dave Chinner --- fs/xfs/xfs_extfree_item.c | 20 +++++++++----------- fs/xfs/xfs_extfree_item.h | 1 - 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index a55e687..5997efa 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -99,10 +99,11 @@ xfs_efi_item_pin( } /* - * While EFIs cannot really be pinned, the unpin operation is the - * last place at which the EFI is manipulated during a transaction. - * Here we coordinate with xfs_efi_cancel() to determine who gets to - * free the EFI. + * While EFIs cannot really be pinned, the unpin operation is the last place at + * which the EFI is manipulated during a transaction. If we are being asked to + * 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. */ STATIC void xfs_efi_item_unpin( @@ -113,17 +114,14 @@ xfs_efi_item_unpin( struct xfs_ail *ailp = lip->li_ailp; spin_lock(&ailp->xa_lock); - if (efip->efi_flags & XFS_EFI_CANCELED) { - if (remove) - xfs_trans_del_item(lip); - - /* xfs_trans_ail_delete() drops the AIL lock. */ - xfs_trans_ail_delete(ailp, lip); + if (remove) { + ASSERT(!(lip->li_flags & XFS_LI_IN_AIL)); + xfs_trans_del_item(lip); xfs_efi_item_free(efip); } else { efip->efi_flags |= XFS_EFI_COMMITTED; - spin_unlock(&ailp->xa_lock); } + spin_unlock(&ailp->xa_lock); } /* diff --git a/fs/xfs/xfs_extfree_item.h b/fs/xfs/xfs_extfree_item.h index 0d22c56..f7834ec 100644 --- a/fs/xfs/xfs_extfree_item.h +++ b/fs/xfs/xfs_extfree_item.h @@ -115,7 +115,6 @@ typedef struct xfs_efd_log_format_64 { */ #define XFS_EFI_RECOVERED 0x1 #define XFS_EFI_COMMITTED 0x2 -#define XFS_EFI_CANCELED 0x4 /* * This is the "extent free intention" log item. It is used -- 1.7.2.3 From SRS0+Ksmg+16+fromorbit.com=dave@internode.on.net Sun Dec 12 22:32:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=BAYES_00,LOCALPART_IN_SUBJECT autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD4WMT0158240 for ; Sun, 12 Dec 2010 22:32:22 -0600 X-ASG-Debug-ID: 1292214851-22ce01b30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5B8AE1CBC72F for ; Sun, 12 Dec 2010 20:34:12 -0800 (PST) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id uGmtFRZzUBLIAOUC for ; Sun, 12 Dec 2010 20:34:12 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 38255308-1927428 for ; Mon, 13 Dec 2010 15:04:11 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PS06p-000210-GW for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:33:59 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PS05L-0004iL-Bv for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:32:27 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: xfs: AIL lock contention reduction V3 Subject: xfs: AIL lock contention reduction V3 Date: Mon, 13 Dec 2010 15:32:14 +1100 Message-Id: <1292214743-18073-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1292214853 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.02 X-Barracuda-Spam-Status: No, SCORE=-1.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=LOCALPART_IN_SUBJECT, LOCALPART_IN_SUBJECT_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 LOCALPART_IN_SUBJECT Local part of To: address appears in Subject 1.00 LOCALPART_IN_SUBJECT_2 Local part of To: address appears in Subject X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This series reduces AIL locking overhead by introducing bulk operations for insert and delete. With delayed logging, we can be doing insert operations on thousands of items at a time, so using a bulk operation to reduce AIL lock traffic is a major win in terms of reducing contention on the lock. Similarly, when we have inode buffer IO completion running on multiple CPUs at once, the AIl lock contention from each individual AIL removal is significant. By batching all the inodes on the buffer to be removed from the AIL in a single bulk operation, contention on the AIL is reduced by an order of magnitude. Finally, there is a modification to the xfsaild wakeup code to prevent too many wakeups when the xfsaild is pausing waiting for some work to complete. This prevents an excessive number of AIL scanning traversals by the xfsaild when tail pushing is backing off and waiting for some IO to complete. In combination, these modification reduce AIL lock contention sufficiently to drop the AIL lock out of the "top 10" contended locks on 8-way fs_mark and dbench workloads. Version 3: - split XFS_EFI_CANCELED fixup into separate patch - initialised efi_next_extent correctly - converted XFS_EFI_RECOVERED to use correct bit set/clear operations - removed unneeded clearing of XFS_EFI_COMMITTED in recovery. - added helper for freeing an EFI. - cleaned up log item array variable naming. - cleaned up bulk AIL operation comments. Version 2: - split out stale inode AIL insertion bug fix - split bulk AIL insertion into multiple patches - EFI/EFD handling changes - stale inode AIL insertion bug fix - simplify code calling xfs_ail_delete - bulk ail insertion modifications - use atomic_inc_return for extent recording in xfs_trans_log_efi_extent() - modified AIL sleep code to explicitly set task state as suggested by Christoph. - split AIL bulk deletion into two patches - buffer iodone callback modifications - bulk AIL deletion and inode iodone callback mods. - removed lip parameter from xfs_buf_do_callbacks() as the loop fetches it from the buffer anyway. - fixed unused variable warning in xfs_buf_do_callbacks(). - added two new patches to reduce code duplication - use AIL bulk insertion function to implement single updates - use AIL bulk delete function to implement single deletes From SRS0+w8Wj+16+fromorbit.com=dave@internode.on.net Sun Dec 12 22:32:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD4WL1i158232 for ; Sun, 12 Dec 2010 22:32:22 -0600 X-ASG-Debug-ID: 1292214851-76f003ac0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 367531E2D06 for ; Sun, 12 Dec 2010 20:34:11 -0800 (PST) Received: from mail.internode.on.net (bld-mail20.adl6.internode.on.net [150.101.137.105]) by cuda.sgi.com with ESMTP id KZ7VxVosiz2iRfYg for ; Sun, 12 Dec 2010 20:34:11 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 4435327-1927428 for ; Mon, 13 Dec 2010 15:04:11 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PS06z-000214-La for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:34:09 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PS05L-0004iV-JI for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:32:27 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 4/9] xfs: bulk AIL insertion during transaction commit Subject: [PATCH 4/9] xfs: bulk AIL insertion during transaction commit Date: Mon, 13 Dec 2010 15:32:18 +1100 Message-Id: <1292214743-18073-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292214743-18073-1-git-send-email-david@fromorbit.com> References: <1292214743-18073-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail20.adl6.internode.on.net[150.101.137.105] X-Barracuda-Start-Time: 1292214853 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner When inserting items into the AIL from the transaction committed callbacks, we take the AIL lock for every single item that is to be inserted. For a CIL checkpoint commit, this can be tens of thousands of individual inserts, yet almost all of the items will be inserted at the same point in the AIL because they have the same index. To reduce the overhead and contention on the AIL lock for such operations, introduce a "bulk insert" operation which allows a list of log items with the same LSN to be inserted in a single operation via a list splice. To do this, we need to pre-sort the log items being committed into a temporary list for insertion. The complexity is that not every log item will end up with the same LSN, and not every item is actually inserted into the AIL. Items that don't match the commit LSN will be inserted and unpinned as per the current one-at-a-time method (relatively rare), while items that are not to be inserted will be unpinned and freed immediately. Items that are to be inserted at the given commit lsn are placed in a temporary array and inserted into the AIL in bulk each time the array fills up. As a result of this, we trade off AIL hold time for a significant reduction in traffic. lock_stat output shows that the worst case hold time is unchanged, but contention from AIL inserts drops by an order of magnitude and the number of lock traversal decreases significantly. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log_cil.c | 9 +--- fs/xfs/xfs_trans.c | 80 +++++++++++++++++++++++++++++++++++- fs/xfs/xfs_trans_ail.c | 105 +++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_trans_priv.h | 10 ++++- 4 files changed, 194 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index 23d6ceb..f36f1a2 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -361,15 +361,10 @@ xlog_cil_committed( int abort) { struct xfs_cil_ctx *ctx = args; - struct xfs_log_vec *lv; - int abortflag = abort ? XFS_LI_ABORTED : 0; struct xfs_busy_extent *busyp, *n; - /* unpin all the log items */ - for (lv = ctx->lv_chain; lv; lv = lv->lv_next ) { - xfs_trans_item_committed(lv->lv_item, ctx->start_lsn, - abortflag); - } + xfs_trans_committed_bulk(ctx->cil->xc_log->l_ailp, ctx->lv_chain, + ctx->start_lsn, abort); list_for_each_entry_safe(busyp, n, &ctx->busy_extents, list) xfs_alloc_busy_clear(ctx->cil->xc_log->l_mp, busyp); diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 8139a2e..b0fff07 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -1347,7 +1347,7 @@ xfs_trans_fill_vecs( * they could be immediately flushed and we'd have to race with the flusher * trying to pull the item from the AIL as we add it. */ -void +static void xfs_trans_item_committed( struct xfs_log_item *lip, xfs_lsn_t commit_lsn, @@ -1422,6 +1422,84 @@ xfs_trans_committed( xfs_trans_free(tp); } +static inline void +xfs_log_item_batch_insert( + struct xfs_ail *ailp, + struct xfs_log_item **log_items, + int nr_items, + xfs_lsn_t commit_lsn) +{ + int i; + + spin_lock(&ailp->xa_lock); + /* xfs_trans_ail_update_bulk drops ailp->xa_lock */ + xfs_trans_ail_update_bulk(ailp, log_items, nr_items, commit_lsn); + + for (i = 0; i < nr_items; i++) + IOP_UNPIN(log_items[i], 0); +} + +/* + * Bulk operation version of xfs_trans_committed that takes a log vector of + * items to insert into the AIL. This uses bulk AIL insertion techniques to + * minimise lock traffic. + */ +void +xfs_trans_committed_bulk( + struct xfs_ail *ailp, + struct xfs_log_vec *log_vector, + xfs_lsn_t commit_lsn, + int aborted) +{ +#define LOG_ITEM_BATCH_SIZE 32 + struct xfs_log_item *log_items[LOG_ITEM_BATCH_SIZE]; + struct xfs_log_vec *lv; + int i = 0; + + /* unpin all the log items */ + for (lv = log_vector; lv; lv = lv->lv_next ) { + struct xfs_log_item *lip = lv->lv_item; + xfs_lsn_t item_lsn; + + if (aborted) + lip->li_flags |= XFS_LI_ABORTED; + item_lsn = IOP_COMMITTED(lip, commit_lsn); + + /* item_lsn of -1 means the item was freed */ + if (XFS_LSN_CMP(item_lsn, (xfs_lsn_t)-1) == 0) + continue; + + if (item_lsn != commit_lsn) { + + /* + * Not a bulk update option due to unusual item_lsn. + * Push into AIL immediately, rechecking the lsn once + * we have the ail lock. Then unpin the item. + */ + spin_lock(&ailp->xa_lock); + if (XFS_LSN_CMP(item_lsn, lip->li_lsn) > 0) { + xfs_trans_ail_update(ailp, lip, item_lsn); + } else { + spin_unlock(&ailp->xa_lock); + } + IOP_UNPIN(lip, 0); + continue; + } + + /* Item is a candidate for bulk AIL insert. */ + log_items[i++] = lv->lv_item; + if (i >= LOG_ITEM_BATCH_SIZE) { + xfs_log_item_batch_insert(ailp, log_items, + LOG_ITEM_BATCH_SIZE, commit_lsn); + i = 0; + } + } + + /* make sure we insert the remainder! */ + if (i) + xfs_log_item_batch_insert(ailp, log_items, i, commit_lsn); +} + /* * Called from the trans_commit code when we notice that * the filesystem is in the middle of a forced shutdown. diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index 645928c..726785f 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -29,6 +29,7 @@ #include "xfs_error.h" STATIC void xfs_ail_insert(struct xfs_ail *, xfs_log_item_t *); +STATIC void xfs_ail_splice(struct xfs_ail *, struct list_head *, xfs_lsn_t); STATIC void xfs_ail_delete(struct xfs_ail *, xfs_log_item_t *); STATIC xfs_log_item_t * xfs_ail_min(struct xfs_ail *); STATIC xfs_log_item_t * xfs_ail_next(struct xfs_ail *, xfs_log_item_t *); @@ -502,6 +503,79 @@ xfs_trans_ail_update( } /* xfs_trans_update_ail */ /* + * xfs_trans_ail_update - bulk AIL insertion operation. + * + * @xfs_trans_ail_update takes an array of log items that all need to be + * positioned at the same LSN in the AIL. If an item is not in the AIL, it will + * be added. Otherwise, it will be repositioned by removing it and re-adding + * it to the AIL. If we move the first item in the AIL, update the log tail to + * match the new minimum LSN in the AIL. + * + * This function takes the AIL lock once to execute the update operations on + * all the items in the array, and as such should not be called with the AIL + * lock held. As a result, once we have the AIL lock, we need to check each log + * item LSN to confirm it needs to be moved forward in the AIL. + * + * To optimise the insert operation, we delete all the items from the AIL in + * the first pass, moving them into a temporary list, then splice the temporary + * list into the correct position in the AIL. This avoids needing to do an + * insert operation on every item. + * + * This function must be called with the AIL lock held. The lock is dropped + * before returning. + */ +void +xfs_trans_ail_update_bulk( + struct xfs_ail *ailp, + struct xfs_log_item **log_items, + int nr_items, + xfs_lsn_t lsn) __releases(ailp->xa_lock) +{ + xfs_log_item_t *mlip; + xfs_lsn_t tail_lsn; + int mlip_changed = 0; + int i; + LIST_HEAD(tmp); + + mlip = xfs_ail_min(ailp); + + for (i = 0; i < nr_items; i++) { + struct xfs_log_item *lip = log_items[i]; + if (lip->li_flags & XFS_LI_IN_AIL) { + /* check if we really need to move the item */ + if (XFS_LSN_CMP(lsn, lip->li_lsn) <= 0) + continue; + + xfs_ail_delete(ailp, lip); + if (mlip == lip) + mlip_changed = 1; + } else { + lip->li_flags |= XFS_LI_IN_AIL; + } + lip->li_lsn = lsn; + list_add(&lip->li_ail, &tmp); + } + + xfs_ail_splice(ailp, &tmp, lsn); + + if (!mlip_changed) { + spin_unlock(&ailp->xa_lock); + return; + } + + /* + * It is not safe to access mlip after the AIL lock is dropped, so we + * must get a copy of li_lsn before we do so. This is especially + * important on 32-bit platforms where accessing and updating 64-bit + * values like li_lsn is not atomic. + */ + mlip = xfs_ail_min(ailp); + tail_lsn = mlip->li_lsn; + spin_unlock(&ailp->xa_lock); + xfs_log_move_tail(ailp->xa_mount, tail_lsn); +} + +/* * Delete the given item from the AIL. It must already be in * the AIL. * @@ -652,6 +726,37 @@ xfs_ail_insert( } /* + * splice the log item list into the AIL at the given LSN. + */ +STATIC void +xfs_ail_splice( + struct xfs_ail *ailp, + struct list_head *list, + xfs_lsn_t lsn) +{ + xfs_log_item_t *next_lip; + + /* + * If the list is empty, just insert the item. + */ + if (list_empty(&ailp->xa_ail)) { + list_splice(list, &ailp->xa_ail); + return; + } + + list_for_each_entry_reverse(next_lip, &ailp->xa_ail, li_ail) { + if (XFS_LSN_CMP(next_lip->li_lsn, lsn) <= 0) + break; + } + + ASSERT((&next_lip->li_ail == &ailp->xa_ail) || + (XFS_LSN_CMP(next_lip->li_lsn, lsn) <= 0)); + + list_splice_init(list, &next_lip->li_ail); + return; +} + +/* * Delete the given item from the AIL. Return a pointer to the item. */ STATIC void diff --git a/fs/xfs/xfs_trans_priv.h b/fs/xfs/xfs_trans_priv.h index 62da86c..e039729 100644 --- a/fs/xfs/xfs_trans_priv.h +++ b/fs/xfs/xfs_trans_priv.h @@ -22,15 +22,17 @@ struct xfs_log_item; struct xfs_log_item_desc; struct xfs_mount; struct xfs_trans; +struct xfs_ail; +struct xfs_log_vec; void xfs_trans_add_item(struct xfs_trans *, struct xfs_log_item *); void xfs_trans_del_item(struct xfs_log_item *); void xfs_trans_free_items(struct xfs_trans *tp, xfs_lsn_t commit_lsn, int flags); -void xfs_trans_item_committed(struct xfs_log_item *lip, - xfs_lsn_t commit_lsn, int aborted); void xfs_trans_unreserve_and_mod_sb(struct xfs_trans *tp); +void xfs_trans_committed_bulk(struct xfs_ail *ailp, struct xfs_log_vec *lv, + xfs_lsn_t commit_lsn, int aborted); /* * AIL traversal cursor. * @@ -76,6 +78,10 @@ struct xfs_ail { void xfs_trans_ail_update(struct xfs_ail *ailp, struct xfs_log_item *lip, xfs_lsn_t lsn) __releases(ailp->xa_lock); +void xfs_trans_ail_update_bulk(struct xfs_ail *ailp, + struct xfs_log_item **log_items, + int nr_items, xfs_lsn_t lsn) + __releases(ailp->xa_lock); void xfs_trans_ail_delete(struct xfs_ail *ailp, struct xfs_log_item *lip) __releases(ailp->xa_lock); -- 1.7.2.3 From SRS0+hhRK+16+fromorbit.com=dave@internode.on.net Sun Dec 12 22:32:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_61 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD4WNMJ158261 for ; Sun, 12 Dec 2010 22:32:23 -0600 X-ASG-Debug-ID: 1292214853-716f019b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A2ABB143FE38 for ; Sun, 12 Dec 2010 20:34:13 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id JbAOmSJpKeBDhvoK for ; Sun, 12 Dec 2010 20:34:13 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49483526-1927428 for ; Mon, 13 Dec 2010 15:04:11 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PS06z-00021U-Qh for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:34:09 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PS05L-0004id-OV for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:32:27 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 7/9] xfs: remove all the inodes on a buffer from the AIL in bulk Subject: [PATCH 7/9] xfs: remove all the inodes on a buffer from the AIL in bulk Date: Mon, 13 Dec 2010 15:32:21 +1100 Message-Id: <1292214743-18073-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292214743-18073-1-git-send-email-david@fromorbit.com> References: <1292214743-18073-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1292214854 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49272 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner When inode buffer IO completes, usually all of the inodes are removed from the AIL. This involves processing them one at a time and taking the AIL lock once for every inode. When all CPUs are processing inode IO completions, this causes excessive amount sof contention on the AIL lock. Instead, change the way we process inode IO completion in the buffer IO done callback. Allow the inode IO done callback to walk the list of IO done callbacks and pull all the inodes off the buffer in one go and then process them as a batch. Once all the inodes for removal are collected, take the AIL lock once and do a bulk removal operation to minimise traffic on the AIL lock. Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode_item.c | 92 ++++++++++++++++++++++++++++++++++++++--------- fs/xfs/xfs_trans_ail.c | 73 +++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_trans_priv.h | 4 ++ 3 files changed, 152 insertions(+), 17 deletions(-) diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 7c8d30c..fd4f398 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -842,15 +842,64 @@ xfs_inode_item_destroy( * flushed to disk. It is responsible for removing the inode item * from the AIL if it has not been re-logged, and unlocking the inode's * flush lock. + * + * To reduce AIL lock traffic as much as possible, we scan the buffer log item + * list for other inodes that will run this function. We remove them from the + * buffer list so we can process all the inode IO completions in one AIL lock + * traversal. */ void xfs_iflush_done( struct xfs_buf *bp, struct xfs_log_item *lip) { - struct xfs_inode_log_item *iip = INODE_ITEM(lip); - xfs_inode_t *ip = iip->ili_inode; + struct xfs_inode_log_item *iip; + struct xfs_log_item *blip; + struct xfs_log_item *next; + struct xfs_log_item *prev; struct xfs_ail *ailp = lip->li_ailp; + int need_ail = 0; + + /* + * Scan the buffer IO completions for other inodes being completed and + * attach them to the current inode log item. + */ + blip = XFS_BUF_FSPRIVATE(bp, xfs_log_item_t *); + prev = NULL; + while (blip != NULL) { + if (lip->li_cb != xfs_iflush_done) { + prev = blip; + blip = blip->li_bio_list; + continue; + } + + /* remove from list */ + next = blip->li_bio_list; + if (!prev) { + XFS_BUF_SET_FSPRIVATE(bp, next); + } else { + prev->li_bio_list = next; + } + + /* add to current list */ + blip->li_bio_list = lip->li_bio_list; + lip->li_bio_list = blip; + + /* + * while we have the item, do the unlocked check for needing + * the AIL lock. + */ + iip = INODE_ITEM(blip); + if (iip->ili_logged && blip->li_lsn == iip->ili_flush_lsn) + need_ail++; + + blip = next; + } + + /* make sure we capture the state of the initial inode. */ + iip = INODE_ITEM(lip); + if (iip->ili_logged && lip->li_lsn == iip->ili_flush_lsn) + need_ail++; /* * We only want to pull the item from the AIL if it is @@ -861,28 +910,37 @@ xfs_iflush_done( * the lock since it's cheaper, and then we recheck while * holding the lock before removing the inode from the AIL. */ - if (iip->ili_logged && lip->li_lsn == iip->ili_flush_lsn) { + if (need_ail) { + struct xfs_log_item *log_items[need_ail]; + int i = 0; spin_lock(&ailp->xa_lock); - if (lip->li_lsn == iip->ili_flush_lsn) { - /* xfs_trans_ail_delete() drops the AIL lock. */ - xfs_trans_ail_delete(ailp, lip); - } else { - spin_unlock(&ailp->xa_lock); + for (blip = lip; blip; blip = blip->li_bio_list) { + iip = INODE_ITEM(blip); + if (iip->ili_logged && + blip->li_lsn == iip->ili_flush_lsn) { + log_items[i++] = blip; + } + ASSERT(i <= need_ail); } + /* xfs_trans_ail_delete_bulk() drops the AIL lock. */ + xfs_trans_ail_delete_bulk(ailp, log_items, i); } - iip->ili_logged = 0; /* - * Clear the ili_last_fields bits now that we know that the - * data corresponding to them is safely on disk. + * clean up and unlock the flush lock now we are done. We can clear the + * ili_last_fields bits now that we know that the data corresponding to + * them is safely on disk. */ - iip->ili_last_fields = 0; + for (blip = lip; blip; blip = next) { + next = blip->li_bio_list; + blip->li_bio_list = NULL; - /* - * Release the inode's flush lock since we're done with it. - */ - xfs_ifunlock(ip); + iip = INODE_ITEM(blip); + iip->ili_logged = 0; + iip->ili_last_fields = 0; + xfs_ifunlock(iip->ili_inode); + } } /* diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index 726785f..a3d8406 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -639,6 +639,79 @@ xfs_trans_ail_delete( } } +/* + * xfs_trans_ail_delete_bulk - remove multiple log items from the AIL + * + * @xfs_trans_ail_delete_bulk takes an array of log items that all need to + * removed from the AIL. The caller is already holding the AIL lock, and done + * all the checks necessary to ensure the items passed in via @log_items are + * ready for deletion. This includes checking that the items are in the AIL. + * + * For each log item to be removed, unlink it from the AIL, clear the IN_AIL + * flag from the item and reset the item's lsn to 0. If we remove the first + * item in the AIL, update the log tail to match the new minimum LSN in the + * AIL. + * + * This function will not drop the AIL lock until all items are removed from + * the AIL to minimise the amount of lock traffic on the AIL. This does not + * greatly increase the AIL hold time, but does significantly reduce the amount + * of traffic on the lock, especially during IO completion. + * + * This function must be called with the AIL lock held. The lock is dropped + * before returning. + */ +void +xfs_trans_ail_delete_bulk( + struct xfs_ail *ailp, + struct xfs_log_item **log_items, + int nr_items) __releases(ailp->xa_lock) +{ + xfs_log_item_t *mlip; + xfs_lsn_t tail_lsn; + int mlip_changed = 0; + int i; + + mlip = xfs_ail_min(ailp); + + for (i = 0; i < nr_items; i++) { + struct xfs_log_item *lip = log_items[i]; + if (!(lip->li_flags & XFS_LI_IN_AIL)) { + struct xfs_mount *mp = ailp->xa_mount; + + spin_unlock(&ailp->xa_lock); + if (!XFS_FORCED_SHUTDOWN(mp)) { + xfs_cmn_err(XFS_PTAG_AILDELETE, CE_ALERT, mp, + "%s: attempting to delete a log item that is not in the AIL", + __func__); + xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); + } + return; + } + + xfs_ail_delete(ailp, lip); + lip->li_flags &= ~XFS_LI_IN_AIL; + lip->li_lsn = 0; + if (mlip == lip) + mlip_changed = 1; + } + + if (!mlip_changed) { + spin_unlock(&ailp->xa_lock); + return; + } + + /* + * It is not safe to access mlip after the AIL lock is dropped, so we + * must get a copy of li_lsn before we do so. This is especially + * important on 32-bit platforms where accessing and updating 64-bit + * values like li_lsn is not atomic. It is possible we've emptied the + * AIL here, so if that is the case, pass an LSN of 0 to the tail move. + */ + mlip = xfs_ail_min(ailp); + tail_lsn = mlip ? mlip->li_lsn : 0; + spin_unlock(&ailp->xa_lock); + xfs_log_move_tail(ailp->xa_mount, tail_lsn); +} /* diff --git a/fs/xfs/xfs_trans_priv.h b/fs/xfs/xfs_trans_priv.h index e039729..246ca4d 100644 --- a/fs/xfs/xfs_trans_priv.h +++ b/fs/xfs/xfs_trans_priv.h @@ -85,6 +85,10 @@ void xfs_trans_ail_update_bulk(struct xfs_ail *ailp, void xfs_trans_ail_delete(struct xfs_ail *ailp, struct xfs_log_item *lip) __releases(ailp->xa_lock); +void xfs_trans_ail_delete_bulk(struct xfs_ail *ailp, + struct xfs_log_item **log_items, + int nr_items) + __releases(ailp->xa_lock); void xfs_trans_ail_push(struct xfs_ail *, xfs_lsn_t); void xfs_trans_unlocked_item(struct xfs_ail *, xfs_log_item_t *); -- 1.7.2.3 From SRS0+Ksmg+16+fromorbit.com=dave@internode.on.net Sun Dec 12 22:32:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD4WNmX158262 for ; Sun, 12 Dec 2010 22:32:23 -0600 X-ASG-Debug-ID: 1292214851-0f4202d20002-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 902161CBC735 for ; Sun, 12 Dec 2010 20:34:13 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id 1E6hlFkA9nhN9CsN for ; Sun, 12 Dec 2010 20:34:13 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49639689-1927428 for ; Mon, 13 Dec 2010 15:04:11 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PS06p-000212-J8 for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:33:59 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PS05L-0004iP-Fu for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:32:27 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/9] xfs: Pull EFI/EFD handling out from under the AIL lock Subject: [PATCH 2/9] xfs: Pull EFI/EFD handling out from under the AIL lock Date: Mon, 13 Dec 2010 15:32:16 +1100 Message-Id: <1292214743-18073-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292214743-18073-1-git-send-email-david@fromorbit.com> References: <1292214743-18073-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1292214854 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner EFI/EFD interactions are protected from races by the AIL lock. They are the only type of log items that require the the AIL lock to serialise internal state, so they need to be separated from the AIL lock before we can do bulk insert operations on the AIL. To acheive this, convert the counter of the number of extents in the EFI to an atomic so it can be safely manipulated by EFD processing without locks. Also, convert the EFI state flag manipulations to use atomic bit operations so no locks are needed to record state changes. Finally, use the state bits to determine when it is safe to free the EFI and clean up the code to do this neatly. Signed-off-by: Dave Chinner --- fs/xfs/xfs_extfree_item.c | 81 ++++++++++++++++++++++++------------------- fs/xfs/xfs_extfree_item.h | 10 +++--- fs/xfs/xfs_log_recover.c | 9 ++--- fs/xfs/xfs_trans_extfree.c | 8 +++- 4 files changed, 60 insertions(+), 48 deletions(-) diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index 5997efa..3f9f486 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -48,6 +48,28 @@ xfs_efi_item_free( } /* + * Freeing the efi requires that we remove it from the AIL if it has already + * been placed there. However, the EFI may not yet have been placed in the AIL + * when called by xfs_efi_release() from EFD processing due to the ordering of + * committed vs unpin operations in bulk insert operations. Hence the + * test_and_clear_bit(XFS_EFI_COMMITTED) to ensure only the last caller frees + * the EFI. + */ +STATIC void +__xfs_efi_release( + struct xfs_efi_log_item *efip) +{ + struct xfs_ail *ailp = efip->efi_item.li_ailp; + + if (!test_and_clear_bit(XFS_EFI_COMMITTED, &efip->efi_flags)) { + spin_lock(&ailp->xa_lock); + /* xfs_trans_ail_delete() drops the AIL lock. */ + xfs_trans_ail_delete(ailp, (xfs_log_item_t *)efip); + xfs_efi_item_free(efip); + } +} + +/* * This returns the number of iovecs needed to log the given efi item. * We only need 1 iovec for an efi item. It just logs the efi_log_format * structure. @@ -74,7 +96,8 @@ xfs_efi_item_format( struct xfs_efi_log_item *efip = EFI_ITEM(lip); uint size; - ASSERT(efip->efi_next_extent == efip->efi_format.efi_nextents); + ASSERT(atomic_read(&efip->efi_next_extent) == + efip->efi_format.efi_nextents); efip->efi_format.efi_type = XFS_LI_EFI; @@ -103,7 +126,8 @@ xfs_efi_item_pin( * which the EFI is manipulated during a transaction. If we are being asked to * 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. + * transaction and free it. Otherwise coordinate with xfs_efi_release() (via + * XFS_EFI_COMMITTED) to determine who gets to free the EFI. */ STATIC void xfs_efi_item_unpin( @@ -111,17 +135,14 @@ xfs_efi_item_unpin( int remove) { struct xfs_efi_log_item *efip = EFI_ITEM(lip); - struct xfs_ail *ailp = lip->li_ailp; - spin_lock(&ailp->xa_lock); if (remove) { ASSERT(!(lip->li_flags & XFS_LI_IN_AIL)); xfs_trans_del_item(lip); xfs_efi_item_free(efip); - } else { - efip->efi_flags |= XFS_EFI_COMMITTED; + return; } - spin_unlock(&ailp->xa_lock); + __xfs_efi_release(efip); } /* @@ -150,16 +171,20 @@ xfs_efi_item_unlock( } /* - * The EFI is logged only once and cannot be moved in the log, so - * simply return the lsn at which it's been logged. The canceled - * flag is not paid any attention here. Checking for that is delayed - * until the EFI is unpinned. + * The EFI is logged only once and cannot be moved in the log, so simply return + * the lsn at which it's been logged. For bulk transaction committed + * processing, the EFI may be processed but not yet unpinned prior to the EFD + * being processed. Set the XFS_EFI_COMMITTED flag so this case can be detected + * when processing the EFD. */ STATIC xfs_lsn_t xfs_efi_item_committed( struct xfs_log_item *lip, xfs_lsn_t lsn) { + struct xfs_efi_log_item *efip = EFI_ITEM(lip); + + set_bit(XFS_EFI_COMMITTED, &efip->efi_flags); return lsn; } @@ -228,6 +253,7 @@ xfs_efi_init( xfs_log_item_init(mp, &efip->efi_item, XFS_LI_EFI, &xfs_efi_item_ops); efip->efi_format.efi_nextents = nextents; efip->efi_format.efi_id = (__psint_t)(void*)efip; + atomic_set(&efip->efi_next_extent, 0); return efip; } @@ -287,37 +313,20 @@ xfs_efi_copy_format(xfs_log_iovec_t *buf, xfs_efi_log_format_t *dst_efi_fmt) } /* - * This is called by the efd item code below to release references to - * the given efi item. Each efd calls this with the number of - * extents that it has logged, and when the sum of these reaches - * the total number of extents logged by this efi item we can free - * the efi item. - * - * Freeing the efi item requires that we remove it from the AIL. - * We'll use the AIL lock to protect our counters as well as - * the removal from the AIL. + * This is called by the efd item code below to release references to the given + * efi item. Each efd calls this with the number of extents that it has + * logged, and when the sum of these reaches the total number of extents logged + * by this efi item we can free the efi item. */ void xfs_efi_release(xfs_efi_log_item_t *efip, uint nextents) { - struct xfs_ail *ailp = efip->efi_item.li_ailp; - int extents_left; + ASSERT(atomic_read(&efip->efi_next_extent) >= nextents); + if (!atomic_sub_and_test(nextents, &efip->efi_next_extent)) + return; - ASSERT(efip->efi_next_extent > 0); - ASSERT(efip->efi_flags & XFS_EFI_COMMITTED); - - spin_lock(&ailp->xa_lock); - ASSERT(efip->efi_next_extent >= nextents); - efip->efi_next_extent -= nextents; - extents_left = efip->efi_next_extent; - if (extents_left == 0) { - /* xfs_trans_ail_delete() drops the AIL lock. */ - xfs_trans_ail_delete(ailp, (xfs_log_item_t *)efip); - xfs_efi_item_free(efip); - } else { - spin_unlock(&ailp->xa_lock); - } + __xfs_efi_release(efip); } static inline struct xfs_efd_log_item *EFD_ITEM(struct xfs_log_item *lip) diff --git a/fs/xfs/xfs_extfree_item.h b/fs/xfs/xfs_extfree_item.h index f7834ec..375f68e 100644 --- a/fs/xfs/xfs_extfree_item.h +++ b/fs/xfs/xfs_extfree_item.h @@ -111,10 +111,10 @@ typedef struct xfs_efd_log_format_64 { #define XFS_EFI_MAX_FAST_EXTENTS 16 /* - * Define EFI flags. + * Define EFI flag bits. Manipulated by set/clear/test_bit operators. */ -#define XFS_EFI_RECOVERED 0x1 -#define XFS_EFI_COMMITTED 0x2 +#define XFS_EFI_RECOVERED 1 +#define XFS_EFI_COMMITTED 2 /* * This is the "extent free intention" log item. It is used @@ -124,8 +124,8 @@ typedef struct xfs_efd_log_format_64 { */ typedef struct xfs_efi_log_item { xfs_log_item_t efi_item; - uint efi_flags; /* misc flags */ - uint efi_next_extent; + atomic_t efi_next_extent; + unsigned long efi_flags; /* misc flags */ xfs_efi_log_format_t efi_format; } xfs_efi_log_item_t; diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 966d3f9..e23f7be 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -2717,8 +2717,7 @@ xlog_recover_do_efi_trans( xfs_efi_item_free(efip); return error; } - efip->efi_next_extent = efi_formatp->efi_nextents; - efip->efi_flags |= XFS_EFI_COMMITTED; + atomic_set(&efip->efi_next_extent, efi_formatp->efi_nextents); spin_lock(&log->l_ailp->xa_lock); /* @@ -3011,7 +3010,7 @@ xlog_recover_process_efi( xfs_extent_t *extp; xfs_fsblock_t startblock_fsb; - ASSERT(!(efip->efi_flags & XFS_EFI_RECOVERED)); + ASSERT(!test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)); /* * First check the validity of the extents described by the @@ -3050,7 +3049,7 @@ xlog_recover_process_efi( extp->ext_len); } - efip->efi_flags |= XFS_EFI_RECOVERED; + set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); error = xfs_trans_commit(tp, 0); return error; @@ -3107,7 +3106,7 @@ xlog_recover_process_efis( * Skip EFIs that we've already processed. */ efip = (xfs_efi_log_item_t *)lip; - if (efip->efi_flags & XFS_EFI_RECOVERED) { + if (test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)) { lip = xfs_trans_ail_cursor_next(ailp, &cur); continue; } diff --git a/fs/xfs/xfs_trans_extfree.c b/fs/xfs/xfs_trans_extfree.c index f783d5e..f7590f5 100644 --- a/fs/xfs/xfs_trans_extfree.c +++ b/fs/xfs/xfs_trans_extfree.c @@ -69,12 +69,16 @@ xfs_trans_log_efi_extent(xfs_trans_t *tp, tp->t_flags |= XFS_TRANS_DIRTY; efip->efi_item.li_desc->lid_flags |= XFS_LID_DIRTY; - next_extent = efip->efi_next_extent; + /* + * atomic_inc_return gives us the value after the increment; + * we want to use it as an array index so we need to subtract 1 from + * it. + */ + next_extent = atomic_inc_return(&efip->efi_next_extent) - 1; ASSERT(next_extent < efip->efi_format.efi_nextents); extp = &(efip->efi_format.efi_extents[next_extent]); extp->ext_start = start_block; extp->ext_len = ext_len; - efip->efi_next_extent++; } -- 1.7.2.3 From SRS0+Ksmg+16+fromorbit.com=dave@internode.on.net Sun Dec 12 22:32:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD4WVbS158321 for ; Sun, 12 Dec 2010 22:32:31 -0600 X-ASG-Debug-ID: 1292214861-0f3d02e20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E8BE71CBC735 for ; Sun, 12 Dec 2010 20:34:21 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id MBlYizSQdomEaMGs for ; Sun, 12 Dec 2010 20:34:21 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50128060-1927428 for ; Mon, 13 Dec 2010 15:04:20 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PS06z-00021P-Ow for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:34:09 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PS05L-0004ia-Mk for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:32:27 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 6/9] xfs: consume iodone callback items on buffers as they are processed Subject: [PATCH 6/9] xfs: consume iodone callback items on buffers as they are processed Date: Mon, 13 Dec 2010 15:32:20 +1100 Message-Id: <1292214743-18073-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292214743-18073-1-git-send-email-david@fromorbit.com> References: <1292214743-18073-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1292214862 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner To allow buffer iodone callbacks to consume multiple items off the callback list, first we need to convert the xfs_buf_do_callbacks() to consume items and always pull the next item from the head of the list. The means the item list walk is never dependent on knowing the next item on the list and hence allows callbacks to remove items from the list as well. This allows callbacks to do bulk operations by scanning the list for identical callbacks, consuming them all and then processing them in bulk, negating the need for multiple callbacks of that type. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_buf_item.c | 32 +++++++++++++++++++++----------- 1 files changed, 21 insertions(+), 11 deletions(-) diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 2686d0d..ed2b65f 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -142,7 +142,7 @@ xfs_buf_item_log_check( #endif STATIC void xfs_buf_error_relse(xfs_buf_t *bp); -STATIC void xfs_buf_do_callbacks(xfs_buf_t *bp, xfs_log_item_t *lip); +STATIC void xfs_buf_do_callbacks(struct xfs_buf *bp); /* * This returns the number of log iovecs needed to log the @@ -450,7 +450,7 @@ xfs_buf_item_unpin( * xfs_trans_ail_delete() drops the AIL lock. */ if (bip->bli_flags & XFS_BLI_STALE_INODE) { - xfs_buf_do_callbacks(bp, (xfs_log_item_t *)bip); + xfs_buf_do_callbacks(bp); XFS_BUF_SET_FSPRIVATE(bp, NULL); XFS_BUF_CLR_IODONE_FUNC(bp); } else { @@ -918,15 +918,26 @@ xfs_buf_attach_iodone( XFS_BUF_SET_IODONE_FUNC(bp, xfs_buf_iodone_callbacks); } +/* + * We can have many callbacks on a buffer. Running the callbacks individually + * can cause a lot of contention on the AIL lock, so we allow for a single + * callback to be able to scan the remaining lip->li_bio_list for other items + * of the same type and callback to be processed in the first call. + * + * As a result, the loop walking the callback list below will also modify the + * list. it removes the first item from the list and then runs the callback. + * The loop then restarts from the new head of the list. This allows the + * callback to scan and modify the list attached to the buffer and we don't + * have to care about maintaining a next item pointer. + */ STATIC void xfs_buf_do_callbacks( - xfs_buf_t *bp, - xfs_log_item_t *lip) + struct xfs_buf *bp) { - xfs_log_item_t *nlip; + struct xfs_log_item *lip; - while (lip != NULL) { - nlip = lip->li_bio_list; + while ((lip = XFS_BUF_FSPRIVATE(bp, xfs_log_item_t *)) != NULL) { + XFS_BUF_SET_FSPRIVATE(bp, lip->li_bio_list); ASSERT(lip->li_cb != NULL); /* * Clear the next pointer so we don't have any @@ -936,7 +947,6 @@ xfs_buf_do_callbacks( */ lip->li_bio_list = NULL; lip->li_cb(bp, lip); - lip = nlip; } } @@ -970,7 +980,7 @@ xfs_buf_iodone_callbacks( ASSERT(XFS_BUF_TARGET(bp) == mp->m_ddev_targp); XFS_BUF_SUPER_STALE(bp); trace_xfs_buf_item_iodone(bp, _RET_IP_); - xfs_buf_do_callbacks(bp, lip); + xfs_buf_do_callbacks(bp); XFS_BUF_SET_FSPRIVATE(bp, NULL); XFS_BUF_CLR_IODONE_FUNC(bp); xfs_buf_ioend(bp, 0); @@ -1029,7 +1039,7 @@ xfs_buf_iodone_callbacks( return; } - xfs_buf_do_callbacks(bp, lip); + xfs_buf_do_callbacks(bp); XFS_BUF_SET_FSPRIVATE(bp, NULL); XFS_BUF_CLR_IODONE_FUNC(bp); xfs_buf_ioend(bp, 0); @@ -1063,7 +1073,7 @@ xfs_buf_error_relse( * We have to unpin the pinned buffers so do the * callbacks. */ - xfs_buf_do_callbacks(bp, lip); + xfs_buf_do_callbacks(bp); XFS_BUF_SET_FSPRIVATE(bp, NULL); XFS_BUF_CLR_IODONE_FUNC(bp); XFS_BUF_SET_BRELSE_FUNC(bp,NULL); -- 1.7.2.3 From SRS0+gPCZ+16+fromorbit.com=dave@internode.on.net Sun Dec 12 22:32:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD4WV7q158323 for ; Sun, 12 Dec 2010 22:32:32 -0600 X-ASG-Debug-ID: 1292214861-349b008a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9467A1E2D08 for ; Sun, 12 Dec 2010 20:34:22 -0800 (PST) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id UveHy1AVlfyTjymx for ; Sun, 12 Dec 2010 20:34:22 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49754361-1927428 for ; Mon, 13 Dec 2010 15:04:21 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PS06z-00021D-SQ for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:34:09 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PS05L-0004ig-QB for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:32:27 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 8/9] xfs: use AIL bulk update function to implement single updates Subject: [PATCH 8/9] xfs: use AIL bulk update function to implement single updates Date: Mon, 13 Dec 2010 15:32:22 +1100 Message-Id: <1292214743-18073-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292214743-18073-1-git-send-email-david@fromorbit.com> References: <1292214743-18073-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1292214863 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner We now have two copies of AIL insert operations that are mostly duplicate functionality. The single log item updates can be implemented via the bulk updates by turning xfs_trans_ail_update() into a simple wrapper. This removes all the duplicate insert functionality and associated helpers. Signed-off-by: Dave Chinner --- fs/xfs/xfs_trans_ail.c | 88 ----------------------------------------------- fs/xfs/xfs_trans_priv.h | 21 +++++++---- 2 files changed, 14 insertions(+), 95 deletions(-) diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index a3d8406..8481a5a 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -28,7 +28,6 @@ #include "xfs_trans_priv.h" #include "xfs_error.h" -STATIC void xfs_ail_insert(struct xfs_ail *, xfs_log_item_t *); STATIC void xfs_ail_splice(struct xfs_ail *, struct list_head *, xfs_lsn_t); STATIC void xfs_ail_delete(struct xfs_ail *, xfs_log_item_t *); STATIC xfs_log_item_t * xfs_ail_min(struct xfs_ail *); @@ -450,58 +449,6 @@ xfs_trans_unlocked_item( xfs_log_move_tail(ailp->xa_mount, 1); } /* xfs_trans_unlocked_item */ - -/* - * Update the position of the item in the AIL with the new - * lsn. If it is not yet in the AIL, add it. Otherwise, move - * it to its new position by removing it and re-adding it. - * - * Wakeup anyone with an lsn less than the item's lsn. If the item - * we move in the AIL is the minimum one, update the tail lsn in the - * log manager. - * - * This function must be called with the AIL lock held. The lock - * is dropped before returning. - */ -void -xfs_trans_ail_update( - struct xfs_ail *ailp, - xfs_log_item_t *lip, - xfs_lsn_t lsn) __releases(ailp->xa_lock) -{ - xfs_log_item_t *mlip; /* ptr to minimum lip */ - xfs_lsn_t tail_lsn; - - mlip = xfs_ail_min(ailp); - - if (lip->li_flags & XFS_LI_IN_AIL) { - xfs_ail_delete(ailp, lip); - } else { - lip->li_flags |= XFS_LI_IN_AIL; - } - - lip->li_lsn = lsn; - xfs_ail_insert(ailp, lip); - - if (mlip == lip) { - mlip = xfs_ail_min(ailp); - /* - * It is not safe to access mlip after the AIL lock is - * dropped, so we must get a copy of li_lsn before we do - * so. This is especially important on 32-bit platforms - * where accessing and updating 64-bit values like li_lsn - * is not atomic. - */ - tail_lsn = mlip->li_lsn; - spin_unlock(&ailp->xa_lock); - xfs_log_move_tail(ailp->xa_mount, tail_lsn); - } else { - spin_unlock(&ailp->xa_lock); - } - - -} /* xfs_trans_update_ail */ - /* * xfs_trans_ail_update - bulk AIL insertion operation. * @@ -764,41 +711,6 @@ xfs_trans_ail_destroy( } /* - * Insert the given log item into the AIL. - * We almost always insert at the end of the list, so on inserts - * we search from the end of the list to find where the - * new item belongs. - */ -STATIC void -xfs_ail_insert( - struct xfs_ail *ailp, - xfs_log_item_t *lip) -{ - xfs_log_item_t *next_lip; - - /* - * If the list is empty, just insert the item. - */ - if (list_empty(&ailp->xa_ail)) { - list_add(&lip->li_ail, &ailp->xa_ail); - return; - } - - list_for_each_entry_reverse(next_lip, &ailp->xa_ail, li_ail) { - if (XFS_LSN_CMP(next_lip->li_lsn, lip->li_lsn) <= 0) - break; - } - - ASSERT((&next_lip->li_ail == &ailp->xa_ail) || - (XFS_LSN_CMP(next_lip->li_lsn, lip->li_lsn) <= 0)); - - list_add(&lip->li_ail, &next_lip->li_ail); - - xfs_ail_check(ailp, lip); - return; -} - -/* * splice the log item list into the AIL at the given LSN. */ STATIC void diff --git a/fs/xfs/xfs_trans_priv.h b/fs/xfs/xfs_trans_priv.h index 246ca4d..95c95b6 100644 --- a/fs/xfs/xfs_trans_priv.h +++ b/fs/xfs/xfs_trans_priv.h @@ -75,13 +75,20 @@ struct xfs_ail { /* * From xfs_trans_ail.c */ -void xfs_trans_ail_update(struct xfs_ail *ailp, - struct xfs_log_item *lip, xfs_lsn_t lsn) - __releases(ailp->xa_lock); -void xfs_trans_ail_update_bulk(struct xfs_ail *ailp, - struct xfs_log_item **log_items, - int nr_items, xfs_lsn_t lsn) - __releases(ailp->xa_lock); +void xfs_trans_ail_update_bulk(struct xfs_ail *ailp, + struct xfs_log_item **log_items, int nr_items, + xfs_lsn_t lsn) __releases(ailp->xa_lock); +static inline void +xfs_trans_ail_update( + struct xfs_ail *ailp, + xfs_log_item_t *lip, + xfs_lsn_t lsn) __releases(ailp->xa_lock) +{ + struct xfs_log_item *log_items[1] = { lip, }; + + xfs_trans_ail_update_bulk(ailp, log_items, 1, lsn); +} + void xfs_trans_ail_delete(struct xfs_ail *ailp, struct xfs_log_item *lip) __releases(ailp->xa_lock); -- 1.7.2.3 From SRS0+Wbf7+16+fromorbit.com=dave@internode.on.net Sun Dec 12 22:55:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD4tH1h160413 for ; Sun, 12 Dec 2010 22:55:17 -0600 X-ASG-Debug-ID: 1292215605-34ae00cb0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7284EA3B5B for ; Sun, 12 Dec 2010 20:46:45 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id 4c0GGsK7Wt60B3TD for ; Sun, 12 Dec 2010 20:46:45 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49126895-1927428 for ; Mon, 13 Dec 2010 15:16:44 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PS0Iz-00022a-At for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:46:33 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PS0HV-0004mK-5I for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:45:01 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 03/12] xfs: rework log grant space calculations Subject: [PATCH 03/12] xfs: rework log grant space calculations Date: Mon, 13 Dec 2010 15:44:34 +1100 Message-Id: <1292215483-18224-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292215483-18224-1-git-send-email-david@fromorbit.com> References: <1292215483-18224-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1292215607 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The log grant space calculations are repeated for both write and reserve grant heads. To make it simpler to convert the calculations toa different algorithm, factor them so both the gratn heads use the same calculation functions. Once this is done we can drop the wrappers that are used in only a couple of place to update both grant heads at once as they don't provide any particular value. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log.c | 95 +++++++++++++++++++++++++++-------------------------- 1 files changed, 48 insertions(+), 47 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 99c6285..9a4b9ed 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -98,53 +98,34 @@ STATIC void xlog_verify_tail_lsn(xlog_t *log, xlog_in_core_t *iclog, STATIC int xlog_iclogs_empty(xlog_t *log); static void -xlog_grant_sub_space(struct log *log, int bytes) -{ - log->l_grant_write_bytes -= bytes; - if (log->l_grant_write_bytes < 0) { - log->l_grant_write_bytes += log->l_logsize; - log->l_grant_write_cycle--; - } - - log->l_grant_reserve_bytes -= bytes; - if ((log)->l_grant_reserve_bytes < 0) { - log->l_grant_reserve_bytes += log->l_logsize; - log->l_grant_reserve_cycle--; - } - -} - -static void -xlog_grant_add_space_write(struct log *log, int bytes) +xlog_grant_sub_space( + struct log *log, + int *cycle, + int *space, + int bytes) { - int tmp = log->l_logsize - log->l_grant_write_bytes; - if (tmp > bytes) - log->l_grant_write_bytes += bytes; - else { - log->l_grant_write_cycle++; - log->l_grant_write_bytes = bytes - tmp; + *space -= bytes; + if (*space < 0) { + *space += log->l_logsize; + (*cycle)--; } } static void -xlog_grant_add_space_reserve(struct log *log, int bytes) +xlog_grant_add_space( + struct log *log, + int *cycle, + int *space, + int bytes) { - int tmp = log->l_logsize - log->l_grant_reserve_bytes; + int tmp = log->l_logsize - *space; if (tmp > bytes) - log->l_grant_reserve_bytes += bytes; + *space += bytes; else { - log->l_grant_reserve_cycle++; - log->l_grant_reserve_bytes = bytes - tmp; + *space = bytes - tmp; + (*cycle)++; } } - -static inline void -xlog_grant_add_space(struct log *log, int bytes) -{ - xlog_grant_add_space_write(log, bytes); - xlog_grant_add_space_reserve(log, bytes); -} - static void xlog_tic_reset_res(xlog_ticket_t *tic) { @@ -1344,7 +1325,10 @@ xlog_sync(xlog_t *log, /* move grant heads by roundoff in sync */ spin_lock(&log->l_grant_lock); - xlog_grant_add_space(log, roundoff); + xlog_grant_add_space(log, &log->l_grant_reserve_cycle, + &log->l_grant_reserve_bytes, roundoff); + xlog_grant_add_space(log, &log->l_grant_write_cycle, + &log->l_grant_write_bytes, roundoff); spin_unlock(&log->l_grant_lock); /* put cycle number in every block */ @@ -2574,7 +2558,10 @@ redo: list_del_init(&tic->t_queue); /* we've got enough space */ - xlog_grant_add_space(log, need_bytes); + xlog_grant_add_space(log, &log->l_grant_reserve_cycle, + &log->l_grant_reserve_bytes, need_bytes); + xlog_grant_add_space(log, &log->l_grant_write_cycle, + &log->l_grant_write_bytes, need_bytes); trace_xfs_log_grant_exit(log, tic); xlog_verify_grant_head(log, 1); xlog_verify_grant_tail(log); @@ -2701,7 +2688,8 @@ redo: list_del_init(&tic->t_queue); /* we've got enough space */ - xlog_grant_add_space_write(log, need_bytes); + xlog_grant_add_space(log, &log->l_grant_write_cycle, + &log->l_grant_write_bytes, need_bytes); trace_xfs_log_regrant_write_exit(log, tic); xlog_verify_grant_head(log, 1); xlog_verify_grant_tail(log); @@ -2742,7 +2730,12 @@ xlog_regrant_reserve_log_space(xlog_t *log, ticket->t_cnt--; spin_lock(&log->l_grant_lock); - xlog_grant_sub_space(log, ticket->t_curr_res); + xlog_grant_sub_space(log, &log->l_grant_reserve_cycle, + &log->l_grant_reserve_bytes, + ticket->t_curr_res); + xlog_grant_sub_space(log, &log->l_grant_write_cycle, + &log->l_grant_write_bytes, + ticket->t_curr_res); ticket->t_curr_res = ticket->t_unit_res; xlog_tic_reset_res(ticket); @@ -2756,7 +2749,9 @@ xlog_regrant_reserve_log_space(xlog_t *log, return; } - xlog_grant_add_space_reserve(log, ticket->t_unit_res); + xlog_grant_add_space(log, &log->l_grant_reserve_cycle, + &log->l_grant_reserve_bytes, + ticket->t_unit_res); trace_xfs_log_regrant_reserve_exit(log, ticket); @@ -2785,24 +2780,30 @@ STATIC void xlog_ungrant_log_space(xlog_t *log, xlog_ticket_t *ticket) { + int bytes; + if (ticket->t_cnt > 0) ticket->t_cnt--; spin_lock(&log->l_grant_lock); trace_xfs_log_ungrant_enter(log, ticket); - - xlog_grant_sub_space(log, ticket->t_curr_res); - trace_xfs_log_ungrant_sub(log, ticket); - /* If this is a permanent reservation ticket, we may be able to free + /* + * If this is a permanent reservation ticket, we may be able to free * up more space based on the remaining count. */ + bytes = ticket->t_curr_res; if (ticket->t_cnt > 0) { ASSERT(ticket->t_flags & XLOG_TIC_PERM_RESERV); - xlog_grant_sub_space(log, ticket->t_unit_res*ticket->t_cnt); + bytes += ticket->t_unit_res*ticket->t_cnt; } + xlog_grant_sub_space(log, &log->l_grant_reserve_cycle, + &log->l_grant_reserve_bytes, bytes); + xlog_grant_sub_space(log, &log->l_grant_write_cycle, + &log->l_grant_write_bytes, bytes); + trace_xfs_log_ungrant_exit(log, ticket); xlog_verify_grant_head(log, 1); -- 1.7.2.3 From SRS0+Ksmg+16+fromorbit.com=dave@internode.on.net Sun Dec 12 22:55:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=BAYES_00,LOCALPART_IN_SUBJECT autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD4tJKI160432 for ; Sun, 12 Dec 2010 22:55:19 -0600 X-ASG-Debug-ID: 1292215585-3ef701050000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 67ABB1CB786B for ; Sun, 12 Dec 2010 20:46:26 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id ciGzRQi1xHZpYbX7 for ; Sun, 12 Dec 2010 20:46:26 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49641077-1927428 for ; Mon, 13 Dec 2010 15:16:25 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PS0Ip-00022N-6B for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:46:23 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PS0HL-0004mD-0g for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:44:51 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: xfs: grant lock scaling and removal V3 Subject: xfs: grant lock scaling and removal V3 Date: Mon, 13 Dec 2010 15:44:31 +1100 Message-Id: <1292215483-18224-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1292215587 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.02 X-Barracuda-Spam-Status: No, SCORE=-1.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=LOCALPART_IN_SUBJECT, LOCALPART_IN_SUBJECT_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 LOCALPART_IN_SUBJECT Local part of To: address appears in Subject 1.00 LOCALPART_IN_SUBJECT_2 Local part of To: address appears in Subject X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This series addresses the log grant lock contention seen by 8-way fs_mark workloads. The log grant lock protects: - reserve grant head and wait queue - write grant head and wait queue - tail lsn - last sync lsn While they are all currently protected by a single lock, there is no reason that they need to all be under the same lock. As a result, one option for scaling was simply to split the grant lock into three locks - one for each of the above groups. However, this would mean that we'd need to nest locks inside each other and it ignores the fact that we really only use the lock on the tail and last sync lsn variables to protect against concurrent updates. Hence we can make the tail and last sync LSN variables independent of the grant lock by making them atomic variables. This means that when we are moving the tail of the log, we can avoid all locking except when there are waiters queued on the grant heads. Making the grant heads scale better is a bit more of a challenge. Just replacing the grant lock with reserve and write grant locks doesn't really help improve scalability because we'd still need to take both locks in the hot xfs_log_reserve() path. To improve scalability, we really need to make this path lock free. The first steps aree to clean up some of the code. We convert the ticket queues to use the common list_head infrastructure, factor out some common debug code, refactor and rearrange the grant head calculations code and convert all the users of the sv_t wait mechanisms to use wait queues directly. The second step to acheiving this is to encode the grant heads as a 64 bit variable and then convert it to an atomic variable. The tail/last sync LSNs also get converted to atomic variables, and this means we can read the grant heads without holding locks and that allows tail pushing calculations and available log space calculations to operate lock free. The next step is to introduce a lock per grant queue that is used exclusively to protect queue manpulations. With the use of list_empty_careful() we can check whether the queue has waiters without holding the queue lock. Hence in the case where the queues are empty we do not need to take the queue locks in the fast path. Finally, we need to make the grant head space calculations lockless. With the grant heads already being atomic variables, we can change the calculation algorithm to a lockless cmpxchg algorithm. This means we no longer need any spinlocks in the transaction reserve fast path and hence the scalability of this path should be significantly improved. There is one down side to this change - the xlog_verify_head() debug code can no longer be reliably used to detect accounting problems in the grant space allocations as it requires an atomic sample of both grant heads. However, the tail verification and the xlog_space_left() verification still works without problems, so we still have some debug checking on the grant head locations. Version 3: - dropped cleanup of xlog_grant_log_space() and xlog_regrant_log_write_space(). - split grant head aggregation into multiple patches - split out xlog_verify_tail() function - factor grant head calculations and drop wrappers - combine grant heads and add wrappers to crack/combine grant heads. - removed intermediate grant head "_lsn" suffix name. - folded all sv_t removal patches into one. - don't pass tail and last sync lsn into xlog_grant_push_ail(). - ensure that shutdown checks in ticket queue processing are done consistently before sleeping. - removed xlog_grant_verify_head() - folded grant lock removal into patch that converts grant head manipulations to lockless algorithms. - added a couple of tracepoints for when the log tail is moved and queued tickets are woken to aid debugging. Version 2: - split into lots of patches - clean up the code and comments - add patches to clean up sv_t usage at the end of the series From SRS0+Wbf7+16+fromorbit.com=dave@internode.on.net Sun Dec 12 22:55:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD4tHP4160414 for ; Sun, 12 Dec 2010 22:55:17 -0600 X-ASG-Debug-ID: 1292215596-34ae00c80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CAA6EA3B5B for ; Sun, 12 Dec 2010 20:46:36 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id moTJPNaII5JbtmA5 for ; Sun, 12 Dec 2010 20:46:36 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49126858-1927428 for ; Mon, 13 Dec 2010 15:16:35 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PS0Iz-00022k-Kl for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:46:33 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PS0HV-0004mg-Fv for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:45:01 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 09/12] xfs: convert log grant heads to atomic variables Subject: [PATCH 09/12] xfs: convert log grant heads to atomic variables Date: Mon, 13 Dec 2010 15:44:40 +1100 Message-Id: <1292215483-18224-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292215483-18224-1-git-send-email-david@fromorbit.com> References: <1292215483-18224-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1292215597 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Convert the log grant heads to atomic64_t types in preparation for converting the accounting algorithms to atomic operations. his patch just converts the variables; the algorithmic changes are in a separate patch for clarity. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_log.c | 8 ++++---- fs/xfs/xfs_log_priv.h | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 57bd143..cddfc6b 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -47,7 +47,7 @@ STATIC xlog_t * xlog_alloc_log(xfs_mount_t *mp, xfs_buftarg_t *log_target, xfs_daddr_t blk_offset, int num_bblks); -STATIC int xlog_space_left(struct log *log, int64_t *head); +STATIC int xlog_space_left(struct log *log, atomic64_t *head); STATIC int xlog_sync(xlog_t *log, xlog_in_core_t *iclog); STATIC void xlog_dealloc_log(xlog_t *log); @@ -100,7 +100,7 @@ STATIC int xlog_iclogs_empty(xlog_t *log); static void xlog_grant_sub_space( struct log *log, - int64_t *head, + atomic64_t *head, int bytes) { int cycle, space; @@ -119,7 +119,7 @@ xlog_grant_sub_space( static void xlog_grant_add_space( struct log *log, - int64_t *head, + atomic64_t *head, int bytes) { int tmp; @@ -816,7 +816,7 @@ xlog_assign_tail_lsn( STATIC int xlog_space_left( struct log *log, - int64_t *head) + atomic64_t *head) { int free_bytes; int tail_bytes; diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index 100a410..24f510f 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -515,8 +515,8 @@ typedef struct log { spinlock_t l_grant_lock ____cacheline_aligned_in_smp; struct list_head l_reserveq; struct list_head l_writeq; - int64_t l_grant_reserve_head; - int64_t l_grant_write_head; + atomic64_t l_grant_reserve_head; + atomic64_t l_grant_write_head; /* * l_last_sync_lsn and l_tail_lsn are atomics so they can be set and @@ -594,18 +594,18 @@ xlog_assign_atomic_lsn(atomic64_t *lsn, uint cycle, uint block) * will always get consistent component values to work from. */ static inline void -xlog_crack_grant_head(int64_t *head, int *cycle, int *space) +xlog_crack_grant_head(atomic64_t *head, int *cycle, int *space) { - int64_t val = *head; + int64_t val = atomic64_read(head); *cycle = val >> 32; *space = val & 0xffffffff; } static inline void -xlog_assign_grant_head(int64_t *head, int cycle, int space) +xlog_assign_grant_head(atomic64_t *head, int cycle, int space) { - *head = ((int64_t)cycle << 32) | space; + atomic64_set(head, ((int64_t)cycle << 32) | space); } /* -- 1.7.2.3 From SRS0+w8Wj+16+fromorbit.com=dave@internode.on.net Sun Dec 12 22:55:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD4tJDP160429 for ; Sun, 12 Dec 2010 22:55:19 -0600 X-ASG-Debug-ID: 1292215605-4cab00360000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D1C891CBADE9 for ; Sun, 12 Dec 2010 20:46:46 -0800 (PST) Received: from mail.internode.on.net (bld-mail20.adl6.internode.on.net [150.101.137.105]) by cuda.sgi.com with ESMTP id IQdD3FtGduIHkB6c for ; Sun, 12 Dec 2010 20:46:46 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 4436869-1927428 for ; Mon, 13 Dec 2010 15:16:45 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PS0J9-000234-Nj for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:46:43 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PS0Hf-0004mm-ID for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:45:11 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 11/12] xfs: convert grant head manipulations to lockless algorithm Subject: [PATCH 11/12] xfs: convert grant head manipulations to lockless algorithm Date: Mon, 13 Dec 2010 15:44:42 +1100 Message-Id: <1292215483-18224-12-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292215483-18224-1-git-send-email-david@fromorbit.com> References: <1292215483-18224-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail20.adl6.internode.on.net[150.101.137.105] X-Barracuda-Start-Time: 1292215607 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The only thing that the grant lock remains to protect is the grant head manipulations when adding or removing space from the log. These calculations are already based on atomic variables, so we can already update them safely without locks. However, the grant head manpulations require atomic multi-step calculations to be executed, which the algorithms currently don't allow. To make these multi-step calculations atomic, convert the algorithms to compare-and-exchange loops on the atomic variables. That is, we sample the old value, perform the calculation and use atomic64_cmpxchg() to attempt to update the head with the new value. If the head has not changed since we sampled it, it will succeed and we are done. Otherwise, we rerun the calculation again from a new sample of the head. This allows us to remove the grant lock from around all the grant head space manipulations, and that effectively removes the grant lock from the log completely. Hence we can remove the grant lock completely from the log at this point. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log.c | 103 ++++++++++++++++--------------------------------- fs/xfs/xfs_log_priv.h | 23 +++++++---- 2 files changed, 49 insertions(+), 77 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index de3ad18..58326ba 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -81,7 +81,6 @@ STATIC void xlog_ungrant_log_space(xlog_t *log, #if defined(DEBUG) STATIC void xlog_verify_dest_ptr(xlog_t *log, char *ptr); -STATIC void xlog_verify_grant_head(xlog_t *log, int equals); STATIC void xlog_verify_grant_tail(struct log *log); STATIC void xlog_verify_iclog(xlog_t *log, xlog_in_core_t *iclog, int count, boolean_t syncing); @@ -89,7 +88,6 @@ STATIC void xlog_verify_tail_lsn(xlog_t *log, xlog_in_core_t *iclog, xfs_lsn_t tail_lsn); #else #define xlog_verify_dest_ptr(a,b) -#define xlog_verify_grant_head(a,b) #define xlog_verify_grant_tail(a) #define xlog_verify_iclog(a,b,c,d) #define xlog_verify_tail_lsn(a,b,c) @@ -103,17 +101,24 @@ xlog_grant_sub_space( atomic64_t *head, int bytes) { - int cycle, space; + int64_t head_val = atomic64_read(head); + int64_t new, old; - xlog_crack_grant_head(head, &cycle, &space); + do { + int cycle, space; - space -= bytes; - if (space < 0) { - space += log->l_logsize; - cycle--; - } + xlog_crack_grant_head_val(head_val, &cycle, &space); - xlog_assign_grant_head(head, cycle, space); + space -= bytes; + if (space < 0) { + space += log->l_logsize; + cycle--; + } + + old = head_val; + new = xlog_assign_grant_head_val(cycle, space); + head_val = atomic64_cmpxchg(head, old, new); + } while (head_val != old); } static void @@ -122,20 +127,27 @@ xlog_grant_add_space( atomic64_t *head, int bytes) { - int tmp; - int cycle, space; + int64_t head_val = atomic64_read(head); + int64_t new, old; - xlog_crack_grant_head(head, &cycle, &space); + do { + int tmp; + int cycle, space; - tmp = log->l_logsize - space; - if (tmp > bytes) - space += bytes; - else { - space = bytes - tmp; - cycle++; - } + xlog_crack_grant_head_val(head_val, &cycle, &space); - xlog_assign_grant_head(head, cycle, space); + tmp = log->l_logsize - space; + if (tmp > bytes) + space += bytes; + else { + space = bytes - tmp; + cycle++; + } + + old = head_val; + new = xlog_assign_grant_head_val(cycle, space); + head_val = atomic64_cmpxchg(head, old, new); + } while (head_val != old); } static void @@ -318,9 +330,7 @@ xfs_log_reserve( trace_xfs_log_reserve(log, internal_ticket); - spin_lock(&log->l_grant_lock); xlog_grant_push_ail(log, internal_ticket->t_unit_res); - spin_unlock(&log->l_grant_lock); retval = xlog_regrant_write_log_space(log, internal_ticket); } else { /* may sleep if need to allocate more tickets */ @@ -334,11 +344,9 @@ xfs_log_reserve( trace_xfs_log_reserve(log, internal_ticket); - spin_lock(&log->l_grant_lock); xlog_grant_push_ail(log, (internal_ticket->t_unit_res * internal_ticket->t_cnt)); - spin_unlock(&log->l_grant_lock); retval = xlog_grant_log_space(log, internal_ticket); } @@ -1057,7 +1065,6 @@ xlog_alloc_log(xfs_mount_t *mp, log->l_xbuf = bp; spin_lock_init(&log->l_icloglock); - spin_lock_init(&log->l_grant_lock); init_waitqueue_head(&log->l_flush_wait); /* log record size must be multiple of BBSIZE; see xlog_rec_header_t */ @@ -1135,7 +1142,6 @@ out_free_iclog: kmem_free(iclog); } spinlock_destroy(&log->l_icloglock); - spinlock_destroy(&log->l_grant_lock); xfs_buf_free(log->l_xbuf); out_free_log: kmem_free(log); @@ -1331,10 +1337,8 @@ xlog_sync(xlog_t *log, roundoff < BBTOB(1))); /* move grant heads by roundoff in sync */ - spin_lock(&log->l_grant_lock); xlog_grant_add_space(log, &log->l_grant_reserve_head, roundoff); xlog_grant_add_space(log, &log->l_grant_write_head, roundoff); - spin_unlock(&log->l_grant_lock); /* put cycle number in every block */ xlog_pack_data(log, iclog, roundoff); @@ -1455,7 +1459,6 @@ xlog_dealloc_log(xlog_t *log) iclog = next_iclog; } spinlock_destroy(&log->l_icloglock); - spinlock_destroy(&log->l_grant_lock); xfs_buf_free(log->l_xbuf); log->l_mp->m_log = NULL; @@ -2574,13 +2577,10 @@ redo: } /* we've got enough space */ - spin_lock(&log->l_grant_lock); xlog_grant_add_space(log, &log->l_grant_reserve_head, need_bytes); xlog_grant_add_space(log, &log->l_grant_write_head, need_bytes); trace_xfs_log_grant_exit(log, tic); - xlog_verify_grant_head(log, 1); xlog_verify_grant_tail(log); - spin_unlock(&log->l_grant_lock); return 0; error_return_unlocked: @@ -2694,12 +2694,9 @@ redo: } /* we've got enough space */ - spin_lock(&log->l_grant_lock); xlog_grant_add_space(log, &log->l_grant_write_head, need_bytes); trace_xfs_log_regrant_write_exit(log, tic); - xlog_verify_grant_head(log, 1); xlog_verify_grant_tail(log); - spin_unlock(&log->l_grant_lock); return 0; @@ -2737,7 +2734,6 @@ xlog_regrant_reserve_log_space(xlog_t *log, if (ticket->t_cnt > 0) ticket->t_cnt--; - spin_lock(&log->l_grant_lock); xlog_grant_sub_space(log, &log->l_grant_reserve_head, ticket->t_curr_res); xlog_grant_sub_space(log, &log->l_grant_write_head, @@ -2747,21 +2743,15 @@ xlog_regrant_reserve_log_space(xlog_t *log, trace_xfs_log_regrant_reserve_sub(log, ticket); - xlog_verify_grant_head(log, 1); - /* just return if we still have some of the pre-reserved space */ - if (ticket->t_cnt > 0) { - spin_unlock(&log->l_grant_lock); + if (ticket->t_cnt > 0) return; - } xlog_grant_add_space(log, &log->l_grant_reserve_head, ticket->t_unit_res); trace_xfs_log_regrant_reserve_exit(log, ticket); - xlog_verify_grant_head(log, 0); - spin_unlock(&log->l_grant_lock); ticket->t_curr_res = ticket->t_unit_res; xlog_tic_reset_res(ticket); } /* xlog_regrant_reserve_log_space */ @@ -2790,7 +2780,6 @@ xlog_ungrant_log_space(xlog_t *log, if (ticket->t_cnt > 0) ticket->t_cnt--; - spin_lock(&log->l_grant_lock); trace_xfs_log_ungrant_enter(log, ticket); trace_xfs_log_ungrant_sub(log, ticket); @@ -2809,8 +2798,6 @@ xlog_ungrant_log_space(xlog_t *log, trace_xfs_log_ungrant_exit(log, ticket); - xlog_verify_grant_head(log, 1); - spin_unlock(&log->l_grant_lock); xfs_log_move_tail(log->l_mp, 1); } /* xlog_ungrant_log_space */ @@ -3429,28 +3416,6 @@ xlog_verify_dest_ptr( } STATIC void -xlog_verify_grant_head(xlog_t *log, int equals) -{ - int reserve_cycle, reserve_space; - int write_cycle, write_space; - - xlog_crack_grant_head(&log->l_grant_reserve_head, - &reserve_cycle, &reserve_space); - xlog_crack_grant_head(&log->l_grant_write_head, - &write_cycle, &write_space); - - if (reserve_cycle == write_cycle) { - if (equals) - ASSERT(reserve_space >= write_space); - else - ASSERT(reserve_space > write_space); - } else { - ASSERT(reserve_cycle - 1 == write_cycle); - ASSERT(write_space >= reserve_space); - } -} - -STATIC void xlog_verify_grant_tail( struct log *log) { diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index c8e23ff..3b59d61 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -511,9 +511,6 @@ typedef struct log { int l_curr_block; /* current logical log block */ int l_prev_block; /* previous logical log block */ - /* The following block of fields are changed while holding grant_lock */ - spinlock_t l_grant_lock ____cacheline_aligned_in_smp; - /* * l_last_sync_lsn and l_tail_lsn are atomics so they can be set and * read without needing to hold specific locks. To avoid operations @@ -597,23 +594,33 @@ xlog_assign_atomic_lsn(atomic64_t *lsn, uint cycle, uint block) } /* - * When we crack the grrant head, we sample it first so that the value will not + * When we crack the grant head, we sample it first so that the value will not * change while we are cracking it into the component values. This means we * will always get consistent component values to work from. */ static inline void -xlog_crack_grant_head(atomic64_t *head, int *cycle, int *space) +xlog_crack_grant_head_val(int64_t val, int *cycle, int *space) { - int64_t val = atomic64_read(head); - *cycle = val >> 32; *space = val & 0xffffffff; } static inline void +xlog_crack_grant_head(atomic64_t *head, int *cycle, int *space) +{ + xlog_crack_grant_head_val(atomic64_read(head), cycle, space); +} + +static inline int64_t +xlog_assign_grant_head_val(int cycle, int space) +{ + return ((int64_t)cycle << 32) | space; +} + +static inline void xlog_assign_grant_head(atomic64_t *head, int cycle, int space) { - atomic64_set(head, ((int64_t)cycle << 32) | space); + atomic64_set(head, xlog_assign_grant_head_val(cycle, space)); } /* -- 1.7.2.3 From SRS0+Gu6A+16+fromorbit.com=dave@internode.on.net Sun Dec 12 22:55:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_TICKET autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD4tJ4s160431 for ; Sun, 12 Dec 2010 22:55:19 -0600 X-ASG-Debug-ID: 1292215596-4cab00350000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EEA551CB9B1B for ; Sun, 12 Dec 2010 20:46:36 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id dTiTdbWwyHU6vXvK for ; Sun, 12 Dec 2010 20:46:36 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49889414-1927428 for ; Mon, 13 Dec 2010 15:16:35 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PS0Iz-00022m-MK for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:46:33 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PS0HV-0004mj-HZ for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:45:01 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 10/12] xfs: introduce new locks for the log grant ticket wait queues Subject: [PATCH 10/12] xfs: introduce new locks for the log grant ticket wait queues Date: Mon, 13 Dec 2010 15:44:41 +1100 Message-Id: <1292215483-18224-11-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292215483-18224-1-git-send-email-david@fromorbit.com> References: <1292215483-18224-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1292215597 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The log grant ticket wait queues are currently protected by the log grant lock. However, the queues are functionally independent from each other, and operations on them only require serialisation against other queue operations now that all of the other log variables they use are atomic values. Hence, we can make them independent of the grant lock by introducing new locks just to protect the lists operations. because the lists are independent, we can use a lock per list and ensure that reserve and write head queuing do not contend. To ensure forced shutdowns work correctly in conjunction with the new fast paths, ensure that we check whether the log has been shut down in the grant functions once we hold the relevant spin locks but before we go to sleep. This is needed to co-ordinate correctly with the wakeups that are issued on the ticket queues so we don't leave any processes sleeping on the queues during a shutdown. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_trace.h | 2 + fs/xfs/xfs_log.c | 139 +++++++++++++++++++++++++----------------- fs/xfs/xfs_log_priv.h | 16 ++++- 3 files changed, 97 insertions(+), 60 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index 2f62d0f..7fae8d5 100644 --- a/fs/xfs/linux-2.6/xfs_trace.h +++ b/fs/xfs/linux-2.6/xfs_trace.h @@ -837,6 +837,7 @@ DEFINE_LOGGRANT_EVENT(xfs_log_grant_sleep1); DEFINE_LOGGRANT_EVENT(xfs_log_grant_wake1); DEFINE_LOGGRANT_EVENT(xfs_log_grant_sleep2); DEFINE_LOGGRANT_EVENT(xfs_log_grant_wake2); +DEFINE_LOGGRANT_EVENT(xfs_log_grant_wake_up); DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_enter); DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_exit); DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_error); @@ -844,6 +845,7 @@ DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_sleep1); DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_wake1); DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_sleep2); DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_wake2); +DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_wake_up); DEFINE_LOGGRANT_EVENT(xfs_log_regrant_reserve_enter); DEFINE_LOGGRANT_EVENT(xfs_log_regrant_reserve_exit); DEFINE_LOGGRANT_EVENT(xfs_log_regrant_reserve_sub); diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index cddfc6b..de3ad18 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -682,12 +682,12 @@ xfs_log_move_tail(xfs_mount_t *mp, if (tail_lsn != 1) atomic64_set(&log->l_tail_lsn, tail_lsn); - spin_lock(&log->l_grant_lock); - if (!list_empty(&log->l_writeq)) { + if (!list_empty_careful(&log->l_writeq)) { #ifdef DEBUG if (log->l_flags & XLOG_ACTIVE_RECOVERY) panic("Recovery problem"); #endif + spin_lock(&log->l_grant_write_lock); free_bytes = xlog_space_left(log, &log->l_grant_write_head); list_for_each_entry(tic, &log->l_writeq, t_queue) { ASSERT(tic->t_flags & XLOG_TIC_PERM_RESERV); @@ -696,15 +696,18 @@ xfs_log_move_tail(xfs_mount_t *mp, break; tail_lsn = 0; free_bytes -= tic->t_unit_res; + trace_xfs_log_regrant_write_wake_up(log, tic); wake_up(&tic->t_wait); } + spin_unlock(&log->l_grant_write_lock); } - if (!list_empty(&log->l_reserveq)) { + if (!list_empty_careful(&log->l_reserveq)) { #ifdef DEBUG if (log->l_flags & XLOG_ACTIVE_RECOVERY) panic("Recovery problem"); #endif + spin_lock(&log->l_grant_reserve_lock); free_bytes = xlog_space_left(log, &log->l_grant_reserve_head); list_for_each_entry(tic, &log->l_reserveq, t_queue) { if (tic->t_flags & XLOG_TIC_PERM_RESERV) @@ -715,11 +718,12 @@ xfs_log_move_tail(xfs_mount_t *mp, break; tail_lsn = 0; free_bytes -= need_bytes; + trace_xfs_log_grant_wake_up(log, tic); wake_up(&tic->t_wait); } + spin_unlock(&log->l_grant_reserve_lock); } - spin_unlock(&log->l_grant_lock); -} /* xfs_log_move_tail */ +} /* * Determine if we have a transaction that has gone to disk @@ -1010,6 +1014,8 @@ xlog_alloc_log(xfs_mount_t *mp, xlog_assign_grant_head(&log->l_grant_write_head, 1, 0); INIT_LIST_HEAD(&log->l_reserveq); INIT_LIST_HEAD(&log->l_writeq); + spin_lock_init(&log->l_grant_reserve_lock); + spin_lock_init(&log->l_grant_write_lock); error = EFSCORRUPTED; if (xfs_sb_version_hassector(&mp->m_sb)) { @@ -2477,6 +2483,18 @@ restart: * * Once a ticket gets put onto the reserveq, it will only return after * the needed reservation is satisfied. + * + * This function is structured so that it has a lock free fast path. This is + * necessary because every new transaction reservation will come through this + * path. Hence any lock will be globally hot if we take it unconditionally on + * every pass. + * + * As tickets are only ever moved on and off the reserveq under the + * l_grant_reserve_lock, we only need to take that lock if we are going + * to add the ticket to the queue and sleep. We can avoid taking the lock if the + * ticket was never added to the reserveq because the t_queue list head will be + * empty and we hold the only reference to it so it can safely be checked + * unlocked. */ STATIC int xlog_grant_log_space(xlog_t *log, @@ -2490,13 +2508,20 @@ xlog_grant_log_space(xlog_t *log, panic("grant Recovery problem"); #endif - /* Is there space or do we need to sleep? */ - spin_lock(&log->l_grant_lock); - trace_xfs_log_grant_enter(log, tic); + need_bytes = tic->t_unit_res; + if (tic->t_flags & XFS_LOG_PERM_RESERV) + need_bytes *= tic->t_ocnt; + /* something is already sleeping; insert new transaction at end */ - if (!list_empty(&log->l_reserveq)) { + if (!list_empty_careful(&log->l_reserveq)) { + spin_lock(&log->l_grant_reserve_lock); + /* recheck the queue now we are locked */ + if (list_empty(&log->l_reserveq)) { + spin_unlock(&log->l_grant_reserve_lock); + goto redo; + } list_add_tail(&tic->t_queue, &log->l_reserveq); trace_xfs_log_grant_sleep1(log, tic); @@ -2509,48 +2534,47 @@ xlog_grant_log_space(xlog_t *log, goto error_return; XFS_STATS_INC(xs_sleep_logspace); - xlog_wait(&tic->t_wait, &log->l_grant_lock); + xlog_wait(&tic->t_wait, &log->l_grant_reserve_lock); /* * If we got an error, and the filesystem is shutting down, * we'll catch it down below. So just continue... */ trace_xfs_log_grant_wake1(log, tic); - spin_lock(&log->l_grant_lock); } - if (tic->t_flags & XFS_LOG_PERM_RESERV) - need_bytes = tic->t_unit_res*tic->t_ocnt; - else - need_bytes = tic->t_unit_res; redo: if (XLOG_FORCED_SHUTDOWN(log)) - goto error_return; + goto error_return_unlocked; free_bytes = xlog_space_left(log, &log->l_grant_reserve_head); if (free_bytes < need_bytes) { + spin_lock(&log->l_grant_reserve_lock); if (list_empty(&tic->t_queue)) list_add_tail(&tic->t_queue, &log->l_reserveq); trace_xfs_log_grant_sleep2(log, tic); + if (XLOG_FORCED_SHUTDOWN(log)) + goto error_return; + xlog_grant_push_ail(log, need_bytes); XFS_STATS_INC(xs_sleep_logspace); - xlog_wait(&tic->t_wait, &log->l_grant_lock); - - spin_lock(&log->l_grant_lock); - if (XLOG_FORCED_SHUTDOWN(log)) - goto error_return; + xlog_wait(&tic->t_wait, &log->l_grant_reserve_lock); trace_xfs_log_grant_wake2(log, tic); - goto redo; } - list_del_init(&tic->t_queue); + if (!list_empty(&tic->t_queue)) { + spin_lock(&log->l_grant_reserve_lock); + list_del_init(&tic->t_queue); + spin_unlock(&log->l_grant_reserve_lock); + } /* we've got enough space */ + spin_lock(&log->l_grant_lock); xlog_grant_add_space(log, &log->l_grant_reserve_head, need_bytes); xlog_grant_add_space(log, &log->l_grant_write_head, need_bytes); trace_xfs_log_grant_exit(log, tic); @@ -2559,8 +2583,11 @@ redo: spin_unlock(&log->l_grant_lock); return 0; - error_return: +error_return_unlocked: + spin_lock(&log->l_grant_reserve_lock); +error_return: list_del_init(&tic->t_queue); + spin_unlock(&log->l_grant_reserve_lock); trace_xfs_log_grant_error(log, tic); /* @@ -2570,7 +2597,6 @@ redo: */ tic->t_curr_res = 0; tic->t_cnt = 0; /* ungrant will give back unit_res * t_cnt. */ - spin_unlock(&log->l_grant_lock); return XFS_ERROR(EIO); } /* xlog_grant_log_space */ @@ -2578,7 +2604,8 @@ redo: /* * Replenish the byte reservation required by moving the grant write head. * - * + * Similar to xlog_grant_log_space, the function is structured to have a lock + * free fast path. */ STATIC int xlog_regrant_write_log_space(xlog_t *log, @@ -2597,12 +2624,9 @@ xlog_regrant_write_log_space(xlog_t *log, panic("regrant Recovery problem"); #endif - spin_lock(&log->l_grant_lock); - trace_xfs_log_regrant_write_enter(log, tic); - if (XLOG_FORCED_SHUTDOWN(log)) - goto error_return; + goto error_return_unlocked; /* If there are other waiters on the queue then give them a * chance at logspace before us. Wake up the first waiters, @@ -2611,8 +2635,10 @@ xlog_regrant_write_log_space(xlog_t *log, * this transaction. */ need_bytes = tic->t_unit_res; - if (!list_empty(&log->l_writeq)) { + if (!list_empty_careful(&log->l_writeq)) { struct xlog_ticket *ntic; + + spin_lock(&log->l_grant_write_lock); free_bytes = xlog_space_left(log, &log->l_grant_write_head); list_for_each_entry(ntic, &log->l_writeq, t_queue) { ASSERT(ntic->t_flags & XLOG_TIC_PERM_RESERV); @@ -2627,50 +2653,48 @@ xlog_regrant_write_log_space(xlog_t *log, struct xlog_ticket, t_queue)) { if (list_empty(&tic->t_queue)) list_add_tail(&tic->t_queue, &log->l_writeq); - trace_xfs_log_regrant_write_sleep1(log, tic); xlog_grant_push_ail(log, need_bytes); XFS_STATS_INC(xs_sleep_logspace); - xlog_wait(&tic->t_wait, &log->l_grant_lock); - - /* If we're shutting down, this tic is already - * off the queue */ - spin_lock(&log->l_grant_lock); - if (XLOG_FORCED_SHUTDOWN(log)) - goto error_return; - + xlog_wait(&tic->t_wait, &log->l_grant_write_lock); trace_xfs_log_regrant_write_wake1(log, tic); - } + } else + spin_unlock(&log->l_grant_write_lock); } redo: if (XLOG_FORCED_SHUTDOWN(log)) - goto error_return; + goto error_return_unlocked; free_bytes = xlog_space_left(log, &log->l_grant_write_head); if (free_bytes < need_bytes) { + spin_lock(&log->l_grant_write_lock); if (list_empty(&tic->t_queue)) list_add_tail(&tic->t_queue, &log->l_writeq); + + if (XLOG_FORCED_SHUTDOWN(log)) + goto error_return; + xlog_grant_push_ail(log, need_bytes); XFS_STATS_INC(xs_sleep_logspace); trace_xfs_log_regrant_write_sleep2(log, tic); - xlog_wait(&tic->t_wait, &log->l_grant_lock); - - /* If we're shutting down, this tic is already off the queue */ - spin_lock(&log->l_grant_lock); - if (XLOG_FORCED_SHUTDOWN(log)) - goto error_return; + xlog_wait(&tic->t_wait, &log->l_grant_write_lock); trace_xfs_log_regrant_write_wake2(log, tic); goto redo; } - list_del_init(&tic->t_queue); + if (!list_empty(&tic->t_queue)) { + spin_lock(&log->l_grant_write_lock); + list_del_init(&tic->t_queue); + spin_unlock(&log->l_grant_write_lock); + } /* we've got enough space */ + spin_lock(&log->l_grant_lock); xlog_grant_add_space(log, &log->l_grant_write_head, need_bytes); trace_xfs_log_regrant_write_exit(log, tic); xlog_verify_grant_head(log, 1); @@ -2679,8 +2703,11 @@ redo: return 0; + error_return_unlocked: + spin_lock(&log->l_grant_write_lock); error_return: list_del_init(&tic->t_queue); + spin_unlock(&log->l_grant_write_lock); trace_xfs_log_regrant_write_error(log, tic); /* @@ -2690,7 +2717,6 @@ redo: */ tic->t_curr_res = 0; tic->t_cnt = 0; /* ungrant will give back unit_res * t_cnt. */ - spin_unlock(&log->l_grant_lock); return XFS_ERROR(EIO); } /* xlog_regrant_write_log_space */ @@ -3664,12 +3690,10 @@ xfs_log_force_umount( xlog_cil_force(log); /* - * We must hold both the GRANT lock and the LOG lock, - * before we mark the filesystem SHUTDOWN and wake - * everybody up to tell the bad news. + * mark the filesystem and the as in a shutdown state and wake + * everybody up to tell them the bad news. */ spin_lock(&log->l_icloglock); - spin_lock(&log->l_grant_lock); mp->m_flags |= XFS_MOUNT_FS_SHUTDOWN; if (mp->m_sb_bp) XFS_BUF_DONE(mp->m_sb_bp); @@ -3694,14 +3718,17 @@ xfs_log_force_umount( * means we have to wake up everybody queued up on reserveq as well as * writeq. In addition, we make sure in xlog_{re}grant_log_space that * we don't enqueue anything once the SHUTDOWN flag is set, and this - * action is protected by the GRANTLOCK. + * action is protected by the grant locks. */ + spin_lock(&log->l_grant_reserve_lock); list_for_each_entry(tic, &log->l_reserveq, t_queue) wake_up(&tic->t_wait); + spin_unlock(&log->l_grant_reserve_lock); + spin_lock(&log->l_grant_write_lock); list_for_each_entry(tic, &log->l_writeq, t_queue) wake_up(&tic->t_wait); - spin_unlock(&log->l_grant_lock); + spin_unlock(&log->l_grant_write_lock); if (!(log->l_iclog->ic_state & XLOG_STATE_IOERROR)) { ASSERT(!logerror); diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index 24f510f..c8e23ff 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -513,10 +513,6 @@ typedef struct log { /* The following block of fields are changed while holding grant_lock */ spinlock_t l_grant_lock ____cacheline_aligned_in_smp; - struct list_head l_reserveq; - struct list_head l_writeq; - atomic64_t l_grant_reserve_head; - atomic64_t l_grant_write_head; /* * l_last_sync_lsn and l_tail_lsn are atomics so they can be set and @@ -529,6 +525,18 @@ typedef struct log { /* lsn of 1st LR with unflushed * buffers */ atomic64_t l_tail_lsn ____cacheline_aligned_in_smp; + /* + * ticket grant locks, queues and accounting have their own cachlines + * as these are quite hot and can be operated on concurrently. + */ + spinlock_t l_grant_reserve_lock ____cacheline_aligned_in_smp; + struct list_head l_reserveq; + atomic64_t l_grant_reserve_head; + + spinlock_t l_grant_write_lock ____cacheline_aligned_in_smp; + struct list_head l_writeq; + atomic64_t l_grant_write_head; + /* The following field are used for debugging; need to hold icloglock */ #ifdef DEBUG char *l_iclog_bak[XLOG_MAX_ICLOGS]; -- 1.7.2.3 From SRS0+hhRK+16+fromorbit.com=dave@internode.on.net Sun Dec 12 22:55:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD4tJIH160430 for ; Sun, 12 Dec 2010 22:55:19 -0600 X-ASG-Debug-ID: 1292215585-4caa00310000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 37B511C2522A for ; Sun, 12 Dec 2010 20:46:25 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id HfqGIl9U0saSOyuk for ; Sun, 12 Dec 2010 20:46:25 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49485026-1927428 for ; Mon, 13 Dec 2010 15:16:24 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PS0Ip-00022P-9J for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:46:23 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PS0HL-0004mH-4X for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:44:51 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 02/12] xfs: fact out common grant head/log tail verification code Subject: [PATCH 02/12] xfs: fact out common grant head/log tail verification code Date: Mon, 13 Dec 2010 15:44:33 +1100 Message-Id: <1292215483-18224-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292215483-18224-1-git-send-email-david@fromorbit.com> References: <1292215483-18224-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1292215587 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Factor repeated debug code out of grant head manipulation functions into a separate function. This removes ifdef DEBUG spagetti from the code and makes the code easier to follow. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log.c | 51 ++++++++++++++++++++++----------------------------- 1 files changed, 22 insertions(+), 29 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 1b82735..99c6285 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -82,6 +82,7 @@ STATIC void xlog_ungrant_log_space(xlog_t *log, #if defined(DEBUG) STATIC void xlog_verify_dest_ptr(xlog_t *log, char *ptr); STATIC void xlog_verify_grant_head(xlog_t *log, int equals); +STATIC void xlog_verify_grant_tail(struct log *log); STATIC void xlog_verify_iclog(xlog_t *log, xlog_in_core_t *iclog, int count, boolean_t syncing); STATIC void xlog_verify_tail_lsn(xlog_t *log, xlog_in_core_t *iclog, @@ -89,6 +90,7 @@ STATIC void xlog_verify_tail_lsn(xlog_t *log, xlog_in_core_t *iclog, #else #define xlog_verify_dest_ptr(a,b) #define xlog_verify_grant_head(a,b) +#define xlog_verify_grant_tail(a) #define xlog_verify_iclog(a,b,c,d) #define xlog_verify_tail_lsn(a,b,c) #endif @@ -2503,10 +2505,6 @@ xlog_grant_log_space(xlog_t *log, { int free_bytes; int need_bytes; -#ifdef DEBUG - xfs_lsn_t tail_lsn; -#endif - #ifdef DEBUG if (log->l_flags & XLOG_ACTIVE_RECOVERY) @@ -2577,21 +2575,9 @@ redo: /* we've got enough space */ xlog_grant_add_space(log, need_bytes); -#ifdef DEBUG - tail_lsn = log->l_tail_lsn; - /* - * Check to make sure the grant write head didn't just over lap the - * tail. If the cycles are the same, we can't be overlapping. - * Otherwise, make sure that the cycles differ by exactly one and - * check the byte count. - */ - if (CYCLE_LSN(tail_lsn) != log->l_grant_write_cycle) { - ASSERT(log->l_grant_write_cycle-1 == CYCLE_LSN(tail_lsn)); - ASSERT(log->l_grant_write_bytes <= BBTOB(BLOCK_LSN(tail_lsn))); - } -#endif trace_xfs_log_grant_exit(log, tic); xlog_verify_grant_head(log, 1); + xlog_verify_grant_tail(log); spin_unlock(&log->l_grant_lock); return 0; @@ -2621,9 +2607,6 @@ xlog_regrant_write_log_space(xlog_t *log, xlog_ticket_t *tic) { int free_bytes, need_bytes; -#ifdef DEBUG - xfs_lsn_t tail_lsn; -#endif tic->t_curr_res = tic->t_unit_res; xlog_tic_reset_res(tic); @@ -2719,17 +2702,9 @@ redo: /* we've got enough space */ xlog_grant_add_space_write(log, need_bytes); -#ifdef DEBUG - tail_lsn = log->l_tail_lsn; - if (CYCLE_LSN(tail_lsn) != log->l_grant_write_cycle) { - ASSERT(log->l_grant_write_cycle-1 == CYCLE_LSN(tail_lsn)); - ASSERT(log->l_grant_write_bytes <= BBTOB(BLOCK_LSN(tail_lsn))); - } -#endif - trace_xfs_log_regrant_write_exit(log, tic); - xlog_verify_grant_head(log, 1); + xlog_verify_grant_tail(log); spin_unlock(&log->l_grant_lock); return 0; @@ -3465,6 +3440,24 @@ xlog_verify_grant_head(xlog_t *log, int equals) } } /* xlog_verify_grant_head */ +STATIC void +xlog_verify_grant_tail( + struct log *log) +{ + xfs_lsn_t tail_lsn = log->l_tail_lsn; + + /* + * Check to make sure the grant write head didn't just over lap the + * tail. If the cycles are the same, we can't be overlapping. + * Otherwise, make sure that the cycles differ by exactly one and + * check the byte count. + */ + if (CYCLE_LSN(tail_lsn) != log->l_grant_write_cycle) { + ASSERT(log->l_grant_write_cycle - 1 == CYCLE_LSN(tail_lsn)); + ASSERT(log->l_grant_write_bytes <= BBTOB(BLOCK_LSN(tail_lsn))); + } +} + /* check if it will fit */ STATIC void xlog_verify_tail_lsn(xlog_t *log, -- 1.7.2.3 From SRS0+Ksmg+16+fromorbit.com=dave@internode.on.net Sun Dec 12 22:55:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD4tJLn160441 for ; Sun, 12 Dec 2010 22:55:19 -0600 X-ASG-Debug-ID: 1292215605-3ef7010b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9876D1CB9B1B for ; Sun, 12 Dec 2010 20:46:46 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id lW7NGXh1fzYvVGxL for ; Sun, 12 Dec 2010 20:46:46 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50129160-1927428 for ; Mon, 13 Dec 2010 15:16:45 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PS0J9-00022b-BR for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:46:43 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PS0HV-0004mS-6z for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:45:01 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 04/12] xfs: combine grant heads into a single 64 bit integer Subject: [PATCH 04/12] xfs: combine grant heads into a single 64 bit integer Date: Mon, 13 Dec 2010 15:44:35 +1100 Message-Id: <1292215483-18224-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292215483-18224-1-git-send-email-david@fromorbit.com> References: <1292215483-18224-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1292215607 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Prepare for switching the grant heads to atomic variables by combining the two 32 bit values that make up the grant head into a single 64 bit variable. Provide wrapper functions to combine and split the grant heads appropriately for calculations and use them as necessary. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_trace.h | 10 ++- fs/xfs/xfs_log.c | 166 ++++++++++++++++++++++-------------------- fs/xfs/xfs_log_priv.h | 26 ++++++- fs/xfs/xfs_log_recover.c | 8 +- 4 files changed, 119 insertions(+), 91 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index f400668..82dfcd7 100644 --- a/fs/xfs/linux-2.6/xfs_trace.h +++ b/fs/xfs/linux-2.6/xfs_trace.h @@ -786,10 +786,12 @@ DECLARE_EVENT_CLASS(xfs_loggrant_class, __entry->flags = tic->t_flags; __entry->reserveq = log->l_reserveq.next; __entry->writeq = log->l_writeq.next; - __entry->grant_reserve_cycle = log->l_grant_reserve_cycle; - __entry->grant_reserve_bytes = log->l_grant_reserve_bytes; - __entry->grant_write_cycle = log->l_grant_write_cycle; - __entry->grant_write_bytes = log->l_grant_write_bytes; + xlog_crack_grant_head(&log->l_grant_reserve_head, + &__entry->grant_reserve_cycle, + &__entry->grant_reserve_bytes); + xlog_crack_grant_head(&log->l_grant_write_head, + &__entry->grant_write_cycle, + &__entry->grant_write_bytes); __entry->curr_cycle = log->l_curr_cycle; __entry->curr_block = log->l_curr_block; __entry->tail_lsn = log->l_tail_lsn; diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 9a4b9ed..3299faa 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -47,7 +47,7 @@ STATIC xlog_t * xlog_alloc_log(xfs_mount_t *mp, xfs_buftarg_t *log_target, xfs_daddr_t blk_offset, int num_bblks); -STATIC int xlog_space_left(xlog_t *log, int cycle, int bytes); +STATIC int xlog_space_left(struct log *log, int64_t *head); STATIC int xlog_sync(xlog_t *log, xlog_in_core_t *iclog); STATIC void xlog_dealloc_log(xlog_t *log); @@ -100,32 +100,44 @@ STATIC int xlog_iclogs_empty(xlog_t *log); static void xlog_grant_sub_space( struct log *log, - int *cycle, - int *space, + int64_t *head, int bytes) { - *space -= bytes; - if (*space < 0) { - *space += log->l_logsize; - (*cycle)--; + int cycle, space; + + xlog_crack_grant_head(head, &cycle, &space); + + space -= bytes; + if (space < 0) { + space += log->l_logsize; + cycle--; } + + xlog_assign_grant_head(head, cycle, space); } static void xlog_grant_add_space( struct log *log, - int *cycle, - int *space, + int64_t *head, int bytes) { - int tmp = log->l_logsize - *space; + int tmp; + int cycle, space; + + xlog_crack_grant_head(head, &cycle, &space); + + tmp = log->l_logsize - space; if (tmp > bytes) - *space += bytes; + space += bytes; else { - *space = bytes - tmp; - (*cycle)++; + space = bytes - tmp; + cycle++; } + + xlog_assign_grant_head(head, cycle, space); } + static void xlog_tic_reset_res(xlog_ticket_t *tic) { @@ -654,7 +666,7 @@ xfs_log_move_tail(xfs_mount_t *mp, { xlog_ticket_t *tic; xlog_t *log = mp->m_log; - int need_bytes, free_bytes, cycle, bytes; + int need_bytes, free_bytes; if (XLOG_FORCED_SHUTDOWN(log)) return; @@ -680,9 +692,7 @@ xfs_log_move_tail(xfs_mount_t *mp, if (log->l_flags & XLOG_ACTIVE_RECOVERY) panic("Recovery problem"); #endif - cycle = log->l_grant_write_cycle; - bytes = log->l_grant_write_bytes; - free_bytes = xlog_space_left(log, cycle, bytes); + free_bytes = xlog_space_left(log, &log->l_grant_write_head); list_for_each_entry(tic, &log->l_writeq, t_queue) { ASSERT(tic->t_flags & XLOG_TIC_PERM_RESERV); @@ -699,9 +709,7 @@ xfs_log_move_tail(xfs_mount_t *mp, if (log->l_flags & XLOG_ACTIVE_RECOVERY) panic("Recovery problem"); #endif - cycle = log->l_grant_reserve_cycle; - bytes = log->l_grant_reserve_bytes; - free_bytes = xlog_space_left(log, cycle, bytes); + free_bytes = xlog_space_left(log, &log->l_grant_reserve_head); list_for_each_entry(tic, &log->l_reserveq, t_queue) { if (tic->t_flags & XLOG_TIC_PERM_RESERV) need_bytes = tic->t_unit_res*tic->t_cnt; @@ -814,21 +822,26 @@ xlog_assign_tail_lsn(xfs_mount_t *mp) * result is that we return the size of the log as the amount of space left. */ STATIC int -xlog_space_left(xlog_t *log, int cycle, int bytes) +xlog_space_left( + struct log *log, + int64_t *head) { - int free_bytes; - int tail_bytes; - int tail_cycle; + int free_bytes; + int tail_bytes; + int tail_cycle; + int head_cycle; + int head_bytes; + xlog_crack_grant_head(head, &head_cycle, &head_bytes); tail_bytes = BBTOB(BLOCK_LSN(log->l_tail_lsn)); tail_cycle = CYCLE_LSN(log->l_tail_lsn); - if ((tail_cycle == cycle) && (bytes >= tail_bytes)) { - free_bytes = log->l_logsize - (bytes - tail_bytes); - } else if ((tail_cycle + 1) < cycle) { + if ((tail_cycle == head_cycle) && (head_bytes >= tail_bytes)) { + free_bytes = log->l_logsize - (head_bytes - tail_bytes); + } else if ((tail_cycle + 1) < head_cycle) { return 0; - } else if (tail_cycle < cycle) { - ASSERT(tail_cycle == (cycle - 1)); - free_bytes = tail_bytes - bytes; + } else if (tail_cycle < head_cycle) { + ASSERT(tail_cycle == (head_cycle - 1)); + free_bytes = tail_bytes - head_bytes; } else { /* * The reservation head is behind the tail. @@ -839,12 +852,12 @@ xlog_space_left(xlog_t *log, int cycle, int bytes) "xlog_space_left: head behind tail\n" " tail_cycle = %d, tail_bytes = %d\n" " GH cycle = %d, GH bytes = %d", - tail_cycle, tail_bytes, cycle, bytes); + tail_cycle, tail_bytes, head_cycle, head_bytes); ASSERT(0); free_bytes = log->l_logsize; } return free_bytes; -} /* xlog_space_left */ +} /* @@ -1001,8 +1014,8 @@ xlog_alloc_log(xfs_mount_t *mp, /* log->l_tail_lsn = 0x100000000LL; cycle = 1; current block = 0 */ log->l_last_sync_lsn = log->l_tail_lsn; log->l_curr_cycle = 1; /* 0 is bad since this is initial value */ - log->l_grant_reserve_cycle = 1; - log->l_grant_write_cycle = 1; + xlog_assign_grant_head(&log->l_grant_reserve_head, 1, 0); + xlog_assign_grant_head(&log->l_grant_write_head, 1, 0); INIT_LIST_HEAD(&log->l_reserveq); INIT_LIST_HEAD(&log->l_writeq); @@ -1190,9 +1203,7 @@ xlog_grant_push_ail(xfs_mount_t *mp, ASSERT(BTOBB(need_bytes) < log->l_logBBsize); spin_lock(&log->l_grant_lock); - free_bytes = xlog_space_left(log, - log->l_grant_reserve_cycle, - log->l_grant_reserve_bytes); + free_bytes = xlog_space_left(log, &log->l_grant_reserve_head); tail_lsn = log->l_tail_lsn; free_blocks = BTOBBT(free_bytes); @@ -1325,10 +1336,8 @@ xlog_sync(xlog_t *log, /* move grant heads by roundoff in sync */ spin_lock(&log->l_grant_lock); - xlog_grant_add_space(log, &log->l_grant_reserve_cycle, - &log->l_grant_reserve_bytes, roundoff); - xlog_grant_add_space(log, &log->l_grant_write_cycle, - &log->l_grant_write_bytes, roundoff); + xlog_grant_add_space(log, &log->l_grant_reserve_head, roundoff); + xlog_grant_add_space(log, &log->l_grant_write_head, roundoff); spin_unlock(&log->l_grant_lock); /* put cycle number in every block */ @@ -2531,8 +2540,7 @@ redo: if (XLOG_FORCED_SHUTDOWN(log)) goto error_return; - free_bytes = xlog_space_left(log, log->l_grant_reserve_cycle, - log->l_grant_reserve_bytes); + free_bytes = xlog_space_left(log, &log->l_grant_reserve_head); if (free_bytes < need_bytes) { if (list_empty(&tic->t_queue)) list_add_tail(&tic->t_queue, &log->l_reserveq); @@ -2558,10 +2566,8 @@ redo: list_del_init(&tic->t_queue); /* we've got enough space */ - xlog_grant_add_space(log, &log->l_grant_reserve_cycle, - &log->l_grant_reserve_bytes, need_bytes); - xlog_grant_add_space(log, &log->l_grant_write_cycle, - &log->l_grant_write_bytes, need_bytes); + xlog_grant_add_space(log, &log->l_grant_reserve_head, need_bytes); + xlog_grant_add_space(log, &log->l_grant_write_head, need_bytes); trace_xfs_log_grant_exit(log, tic); xlog_verify_grant_head(log, 1); xlog_verify_grant_tail(log); @@ -2622,8 +2628,7 @@ xlog_regrant_write_log_space(xlog_t *log, need_bytes = tic->t_unit_res; if (!list_empty(&log->l_writeq)) { struct xlog_ticket *ntic; - free_bytes = xlog_space_left(log, log->l_grant_write_cycle, - log->l_grant_write_bytes); + free_bytes = xlog_space_left(log, &log->l_grant_write_head); list_for_each_entry(ntic, &log->l_writeq, t_queue) { ASSERT(ntic->t_flags & XLOG_TIC_PERM_RESERV); @@ -2662,8 +2667,7 @@ redo: if (XLOG_FORCED_SHUTDOWN(log)) goto error_return; - free_bytes = xlog_space_left(log, log->l_grant_write_cycle, - log->l_grant_write_bytes); + free_bytes = xlog_space_left(log, &log->l_grant_write_head); if (free_bytes < need_bytes) { if (list_empty(&tic->t_queue)) list_add_tail(&tic->t_queue, &log->l_writeq); @@ -2688,8 +2692,7 @@ redo: list_del_init(&tic->t_queue); /* we've got enough space */ - xlog_grant_add_space(log, &log->l_grant_write_cycle, - &log->l_grant_write_bytes, need_bytes); + xlog_grant_add_space(log, &log->l_grant_write_head, need_bytes); trace_xfs_log_regrant_write_exit(log, tic); xlog_verify_grant_head(log, 1); xlog_verify_grant_tail(log); @@ -2730,12 +2733,10 @@ xlog_regrant_reserve_log_space(xlog_t *log, ticket->t_cnt--; spin_lock(&log->l_grant_lock); - xlog_grant_sub_space(log, &log->l_grant_reserve_cycle, - &log->l_grant_reserve_bytes, - ticket->t_curr_res); - xlog_grant_sub_space(log, &log->l_grant_write_cycle, - &log->l_grant_write_bytes, - ticket->t_curr_res); + xlog_grant_sub_space(log, &log->l_grant_reserve_head, + ticket->t_curr_res); + xlog_grant_sub_space(log, &log->l_grant_write_head, + ticket->t_curr_res); ticket->t_curr_res = ticket->t_unit_res; xlog_tic_reset_res(ticket); @@ -2749,9 +2750,8 @@ xlog_regrant_reserve_log_space(xlog_t *log, return; } - xlog_grant_add_space(log, &log->l_grant_reserve_cycle, - &log->l_grant_reserve_bytes, - ticket->t_unit_res); + xlog_grant_add_space(log, &log->l_grant_reserve_head, + ticket->t_unit_res); trace_xfs_log_regrant_reserve_exit(log, ticket); @@ -2799,10 +2799,8 @@ xlog_ungrant_log_space(xlog_t *log, bytes += ticket->t_unit_res*ticket->t_cnt; } - xlog_grant_sub_space(log, &log->l_grant_reserve_cycle, - &log->l_grant_reserve_bytes, bytes); - xlog_grant_sub_space(log, &log->l_grant_write_cycle, - &log->l_grant_write_bytes, bytes); + xlog_grant_sub_space(log, &log->l_grant_reserve_head, bytes); + xlog_grant_sub_space(log, &log->l_grant_write_head, bytes); trace_xfs_log_ungrant_exit(log, ticket); @@ -3430,22 +3428,31 @@ xlog_verify_dest_ptr( STATIC void xlog_verify_grant_head(xlog_t *log, int equals) { - if (log->l_grant_reserve_cycle == log->l_grant_write_cycle) { - if (equals) - ASSERT(log->l_grant_reserve_bytes >= log->l_grant_write_bytes); - else - ASSERT(log->l_grant_reserve_bytes > log->l_grant_write_bytes); - } else { - ASSERT(log->l_grant_reserve_cycle-1 == log->l_grant_write_cycle); - ASSERT(log->l_grant_write_bytes >= log->l_grant_reserve_bytes); - } -} /* xlog_verify_grant_head */ + int reserve_cycle, reserve_space; + int write_cycle, write_space; + + xlog_crack_grant_head(&log->l_grant_reserve_head, + &reserve_cycle, &reserve_space); + xlog_crack_grant_head(&log->l_grant_write_head, + &write_cycle, &write_space); + + if (reserve_cycle == write_cycle) { + if (equals) + ASSERT(reserve_space >= write_space); + else + ASSERT(reserve_space > write_space); + } else { + ASSERT(reserve_cycle - 1 == write_cycle); + ASSERT(write_space >= reserve_space); + } +} STATIC void xlog_verify_grant_tail( struct log *log) { xfs_lsn_t tail_lsn = log->l_tail_lsn; + int cycle, space; /* * Check to make sure the grant write head didn't just over lap the @@ -3453,9 +3460,10 @@ xlog_verify_grant_tail( * Otherwise, make sure that the cycles differ by exactly one and * check the byte count. */ - if (CYCLE_LSN(tail_lsn) != log->l_grant_write_cycle) { - ASSERT(log->l_grant_write_cycle - 1 == CYCLE_LSN(tail_lsn)); - ASSERT(log->l_grant_write_bytes <= BBTOB(BLOCK_LSN(tail_lsn))); + xlog_crack_grant_head(&log->l_grant_write_head, &cycle, &space); + if (CYCLE_LSN(tail_lsn) != cycle) { + ASSERT(cycle - 1 == CYCLE_LSN(tail_lsn)); + ASSERT(space <= BBTOB(BLOCK_LSN(tail_lsn))); } } diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index d45fe2d..2fd4819 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -519,10 +519,8 @@ typedef struct log { spinlock_t l_grant_lock ____cacheline_aligned_in_smp; struct list_head l_reserveq; struct list_head l_writeq; - int l_grant_reserve_cycle; - int l_grant_reserve_bytes; - int l_grant_write_cycle; - int l_grant_write_bytes; + int64_t l_grant_reserve_head; + int64_t l_grant_write_head; /* The following field are used for debugging; need to hold icloglock */ #ifdef DEBUG @@ -559,6 +557,26 @@ int xlog_write(struct log *log, struct xfs_log_vec *log_vector, xlog_in_core_t **commit_iclog, uint flags); /* + * When we crack the grrant head, we sample it first so that the value will not + * change while we are cracking it into the component values. This means we + * will always get consistent component values to work from. + */ +static inline void +xlog_crack_grant_head(int64_t *head, int *cycle, int *space) +{ + int64_t val = *head; + + *cycle = val >> 32; + *space = val & 0xffffffff; +} + +static inline void +xlog_assign_grant_head(int64_t *head, int cycle, int space) +{ + *head = ((int64_t)cycle << 32) | space; +} + +/* * Committed Item List interfaces */ int xlog_cil_init(struct log *log); diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index e23f7be..3e91975 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -927,10 +927,10 @@ xlog_find_tail( log->l_curr_cycle++; log->l_tail_lsn = be64_to_cpu(rhead->h_tail_lsn); log->l_last_sync_lsn = be64_to_cpu(rhead->h_lsn); - log->l_grant_reserve_cycle = log->l_curr_cycle; - log->l_grant_reserve_bytes = BBTOB(log->l_curr_block); - log->l_grant_write_cycle = log->l_curr_cycle; - log->l_grant_write_bytes = BBTOB(log->l_curr_block); + xlog_assign_grant_head(&log->l_grant_reserve_head, log->l_curr_cycle, + BBTOB(log->l_curr_block)); + xlog_assign_grant_head(&log->l_grant_write_head, log->l_curr_cycle, + BBTOB(log->l_curr_block)); /* * Look for unmount record. If we find it, then we know there -- 1.7.2.3 From SRS0+Ksmg+16+fromorbit.com=dave@internode.on.net Sun Dec 12 22:55:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD4tJaN160440 for ; Sun, 12 Dec 2010 22:55:19 -0600 X-ASG-Debug-ID: 1292215605-3ef7010b0002-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 49D951CBADE9 for ; Sun, 12 Dec 2010 20:46:48 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id TJXeP1tyU9t03DbI for ; Sun, 12 Dec 2010 20:46:48 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50129163-1927428 for ; Mon, 13 Dec 2010 15:16:45 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PS0J9-000237-PM for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:46:43 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PS0Hf-0004mq-Jh for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:45:11 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 12/12] xfs: kill useless spinlock_destroy macro Subject: [PATCH 12/12] xfs: kill useless spinlock_destroy macro Date: Mon, 13 Dec 2010 15:44:43 +1100 Message-Id: <1292215483-18224-13-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292215483-18224-1-git-send-email-david@fromorbit.com> References: <1292215483-18224-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1292215609 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner It is only used in 2 places in the log code, and is an empty macro, so get rid of it. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_linux.h | 2 -- fs/xfs/xfs_log.c | 2 -- 2 files changed, 0 insertions(+), 4 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_linux.h b/fs/xfs/linux-2.6/xfs_linux.h index ccebd86..e7cfa27 100644 --- a/fs/xfs/linux-2.6/xfs_linux.h +++ b/fs/xfs/linux-2.6/xfs_linux.h @@ -113,8 +113,6 @@ #define current_restore_flags_nested(sp, f) \ (current->flags = ((current->flags & ~(f)) | (*(sp) & (f)))) -#define spinlock_destroy(lock) - #define NBBY 8 /* number of bits per byte */ /* diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 58326ba..7fadc36 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -1141,7 +1141,6 @@ out_free_iclog: xfs_buf_free(iclog->ic_bp); kmem_free(iclog); } - spinlock_destroy(&log->l_icloglock); xfs_buf_free(log->l_xbuf); out_free_log: kmem_free(log); @@ -1458,7 +1457,6 @@ xlog_dealloc_log(xlog_t *log) kmem_free(iclog); iclog = next_iclog; } - spinlock_destroy(&log->l_icloglock); xfs_buf_free(log->l_xbuf); log->l_mp->m_log = NULL; -- 1.7.2.3 From SRS0+Gu6A+16+fromorbit.com=dave@internode.on.net Sun Dec 12 22:55:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_65, LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD4tJtJ160433 for ; Sun, 12 Dec 2010 22:55:19 -0600 X-ASG-Debug-ID: 1292215606-0f3e03920000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 286071CBADEA for ; Sun, 12 Dec 2010 20:46:46 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id A2tfMcgsOLBEOHza for ; Sun, 12 Dec 2010 20:46:46 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49889433-1927428 for ; Mon, 13 Dec 2010 15:16:45 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PS0Iz-00022h-Iz for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:46:33 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PS0HV-0004md-EE for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:45:01 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 08/12] xfs: convert l_tail_lsn to an atomic variable. Subject: [PATCH 08/12] xfs: convert l_tail_lsn to an atomic variable. Date: Mon, 13 Dec 2010 15:44:39 +1100 Message-Id: <1292215483-18224-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292215483-18224-1-git-send-email-david@fromorbit.com> References: <1292215483-18224-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1292215608 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner log->l_tail_lsn is currently protected by the log grant lock. The lock is only needed for serialising readers against writers, so we don't really need the lock if we make the l_tail_lsn variable an atomic. Converting the l_tail_lsn variable to an atomic64_t means we can start to peel back the grant lock from various operations. Also, provide functions to safely crack an atomic LSN variable into it's component pieces and to recombined the components into an atomic variable. Use them where appropriate. This also removes the need for explicitly holding a spinlock to read the l_tail_lsn on 32 bit platforms. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_trace.h | 2 +- fs/xfs/xfs_log.c | 56 ++++++++++++++++++----------------------- fs/xfs/xfs_log_priv.h | 37 +++++++++++++++++++++++---- fs/xfs/xfs_log_recover.c | 14 ++++------ 4 files changed, 63 insertions(+), 46 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index 82dfcd7..2f62d0f 100644 --- a/fs/xfs/linux-2.6/xfs_trace.h +++ b/fs/xfs/linux-2.6/xfs_trace.h @@ -794,7 +794,7 @@ DECLARE_EVENT_CLASS(xfs_loggrant_class, &__entry->grant_write_bytes); __entry->curr_cycle = log->l_curr_cycle; __entry->curr_block = log->l_curr_block; - __entry->tail_lsn = log->l_tail_lsn; + __entry->tail_lsn = atomic64_read(&log->l_tail_lsn); ), TP_printk("dev %d:%d type %s t_ocnt %u t_cnt %u t_curr_res %u " "t_unit_res %u t_flags %s reserve_headq 0x%p " diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 6ed6ee9..57bd143 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -678,15 +678,11 @@ xfs_log_move_tail(xfs_mount_t *mp, if (tail_lsn == 0) tail_lsn = atomic64_read(&log->l_last_sync_lsn); - spin_lock(&log->l_grant_lock); - - /* Also an invalid lsn. 1 implies that we aren't passing in a valid - * tail_lsn. - */ - if (tail_lsn != 1) { - log->l_tail_lsn = tail_lsn; - } + /* tail_lsn == 1 implies that we weren't passed a valid value. */ + if (tail_lsn != 1) + atomic64_set(&log->l_tail_lsn, tail_lsn); + spin_lock(&log->l_grant_lock); if (!list_empty(&log->l_writeq)) { #ifdef DEBUG if (log->l_flags & XLOG_ACTIVE_RECOVERY) @@ -789,21 +785,19 @@ xfs_log_need_covered(xfs_mount_t *mp) * We may be holding the log iclog lock upon entering this routine. */ xfs_lsn_t -xlog_assign_tail_lsn(xfs_mount_t *mp) +xlog_assign_tail_lsn( + struct xfs_mount *mp) { - xfs_lsn_t tail_lsn; - xlog_t *log = mp->m_log; + xfs_lsn_t tail_lsn; + struct log *log = mp->m_log; tail_lsn = xfs_trans_ail_tail(mp->m_ail); - spin_lock(&log->l_grant_lock); if (!tail_lsn) tail_lsn = atomic64_read(&log->l_last_sync_lsn); - log->l_tail_lsn = tail_lsn; - spin_unlock(&log->l_grant_lock); + atomic64_set(&log->l_tail_lsn, tail_lsn); return tail_lsn; -} /* xlog_assign_tail_lsn */ - +} /* * Return the space in the log between the tail and the head. The head @@ -831,8 +825,8 @@ xlog_space_left( int head_bytes; xlog_crack_grant_head(head, &head_cycle, &head_bytes); - tail_bytes = BBTOB(BLOCK_LSN(log->l_tail_lsn)); - tail_cycle = CYCLE_LSN(log->l_tail_lsn); + xlog_crack_atomic_lsn(&log->l_tail_lsn, &tail_cycle, &tail_bytes); + tail_bytes = BBTOB(tail_bytes); if ((tail_cycle == head_cycle) && (head_bytes >= tail_bytes)) { free_bytes = log->l_logsize - (head_bytes - tail_bytes); } else if ((tail_cycle + 1) < head_cycle) { @@ -1009,8 +1003,8 @@ xlog_alloc_log(xfs_mount_t *mp, log->l_prev_block = -1; /* log->l_tail_lsn = 0x100000000LL; cycle = 1; current block = 0 */ - log->l_tail_lsn = xlog_assign_lsn(1, 0); - atomic64_set(&log->l_last_sync_lsn, xlog_assign_lsn(1, 0)); + xlog_assign_atomic_lsn(&log->l_tail_lsn, 1, 0); + xlog_assign_atomic_lsn(&log->l_last_sync_lsn, 1, 0); log->l_curr_cycle = 1; /* 0 is bad since this is initial value */ xlog_assign_grant_head(&log->l_grant_reserve_head, 1, 0); xlog_assign_grant_head(&log->l_grant_write_head, 1, 0); @@ -1189,7 +1183,6 @@ xlog_grant_push_ail( { xfs_lsn_t threshold_lsn = 0; xfs_lsn_t last_sync_lsn; - xfs_lsn_t tail_lsn; int free_blocks; int free_bytes; int threshold_block; @@ -1198,7 +1191,6 @@ xlog_grant_push_ail( ASSERT(BTOBB(need_bytes) < log->l_logBBsize); - tail_lsn = log->l_tail_lsn; free_bytes = xlog_space_left(log, &log->l_grant_reserve_head); free_blocks = BTOBBT(free_bytes); @@ -1213,8 +1205,9 @@ xlog_grant_push_ail( if (free_blocks >= free_threshold) return; - threshold_block = BLOCK_LSN(tail_lsn) + free_threshold; - threshold_cycle = CYCLE_LSN(tail_lsn); + xlog_crack_atomic_lsn(&log->l_tail_lsn, &threshold_cycle, + &threshold_block); + threshold_block += free_threshold; if (threshold_block >= log->l_logBBsize) { threshold_block -= log->l_logBBsize; threshold_cycle += 1; @@ -2828,11 +2821,11 @@ xlog_state_release_iclog( if (iclog->ic_state == XLOG_STATE_WANT_SYNC) { /* update tail before writing to iclog */ - xlog_assign_tail_lsn(log->l_mp); + xfs_lsn_t tail_lsn = xlog_assign_tail_lsn(log->l_mp); sync++; iclog->ic_state = XLOG_STATE_SYNCING; - iclog->ic_header.h_tail_lsn = cpu_to_be64(log->l_tail_lsn); - xlog_verify_tail_lsn(log, iclog, log->l_tail_lsn); + iclog->ic_header.h_tail_lsn = cpu_to_be64(tail_lsn); + xlog_verify_tail_lsn(log, iclog, tail_lsn); /* cycle incremented when incrementing curr_block */ } spin_unlock(&log->l_icloglock); @@ -3435,7 +3428,7 @@ STATIC void xlog_verify_grant_tail( struct log *log) { - xfs_lsn_t tail_lsn = log->l_tail_lsn; + int tail_cycle, tail_blocks; int cycle, space; /* @@ -3445,9 +3438,10 @@ xlog_verify_grant_tail( * check the byte count. */ xlog_crack_grant_head(&log->l_grant_write_head, &cycle, &space); - if (CYCLE_LSN(tail_lsn) != cycle) { - ASSERT(cycle - 1 == CYCLE_LSN(tail_lsn)); - ASSERT(space <= BBTOB(BLOCK_LSN(tail_lsn))); + xlog_crack_atomic_lsn(&log->l_tail_lsn, &tail_cycle, &tail_blocks); + if (tail_cycle != cycle) { + ASSERT(cycle - 1 == tail_cycle); + ASSERT(space <= BBTOB(tail_blocks)); } } diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index 129068c..100a410 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -54,7 +54,6 @@ struct xfs_mount; BTOBB(XLOG_MAX_ICLOGS << (xfs_sb_version_haslogv2(&log->l_mp->m_sb) ? \ XLOG_MAX_RECORD_BSHIFT : XLOG_BIG_RECORD_BSHIFT)) - static inline xfs_lsn_t xlog_assign_lsn(uint cycle, uint block) { return ((xfs_lsn_t)cycle << 32) | block; @@ -506,8 +505,6 @@ typedef struct log { * log entries" */ xlog_in_core_t *l_iclog; /* head log queue */ spinlock_t l_icloglock; /* grab to change iclog state */ - xfs_lsn_t l_tail_lsn; /* lsn of 1st LR with unflushed - * buffers */ int l_curr_cycle; /* Cycle number of log writes */ int l_prev_cycle; /* Cycle number before last * block increment */ @@ -522,12 +519,15 @@ typedef struct log { int64_t l_grant_write_head; /* - * l_last_sync_lsn is an atomic so it can be set and read without - * needing to hold specific locks. To avoid operations contending with - * other hot objects, place it on a separate cacheline. + * l_last_sync_lsn and l_tail_lsn are atomics so they can be set and + * read without needing to hold specific locks. To avoid operations + * contending with other hot objects, place each of them on a separate + * cacheline. */ /* lsn of last LR on disk */ atomic64_t l_last_sync_lsn ____cacheline_aligned_in_smp; + /* lsn of 1st LR with unflushed * buffers */ + atomic64_t l_tail_lsn ____cacheline_aligned_in_smp; /* The following field are used for debugging; need to hold icloglock */ #ifdef DEBUG @@ -564,6 +564,31 @@ int xlog_write(struct log *log, struct xfs_log_vec *log_vector, xlog_in_core_t **commit_iclog, uint flags); /* + * When we crack an atomic LSN, we sample it first so that the value will not + * change while we are cracking it into the component values. This means we + * will always get consistent component values to work from. This should always + * be used to smaple and crack LSNs taht are stored and updated in atomic + * variables. + */ +static inline void +xlog_crack_atomic_lsn(atomic64_t *lsn, uint *cycle, uint *block) +{ + xfs_lsn_t val = atomic64_read(lsn); + + *cycle = CYCLE_LSN(val); + *block = BLOCK_LSN(val); +} + +/* + * Calculate and assign a value to an atomic LSN variable from component pieces. + */ +static inline void +xlog_assign_atomic_lsn(atomic64_t *lsn, uint cycle, uint block) +{ + atomic64_set(lsn, xlog_assign_lsn(cycle, block)); +} + +/* * When we crack the grrant head, we sample it first so that the value will not * change while we are cracking it into the component values. This means we * will always get consistent component values to work from. diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 7e5b8ab..147fb34 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -925,7 +925,7 @@ xlog_find_tail( log->l_curr_cycle = be32_to_cpu(rhead->h_cycle); if (found == 2) log->l_curr_cycle++; - log->l_tail_lsn = be64_to_cpu(rhead->h_tail_lsn); + atomic64_set(&log->l_tail_lsn, be64_to_cpu(rhead->h_tail_lsn)); atomic64_set(&log->l_last_sync_lsn, be64_to_cpu(rhead->h_lsn)); xlog_assign_grant_head(&log->l_grant_reserve_head, log->l_curr_cycle, BBTOB(log->l_curr_block)); @@ -960,7 +960,7 @@ xlog_find_tail( } after_umount_blk = (i + hblks + (int) BTOBB(be32_to_cpu(rhead->h_len))) % log->l_logBBsize; - tail_lsn = log->l_tail_lsn; + tail_lsn = atomic64_read(&log->l_tail_lsn); if (*head_blk == after_umount_blk && be32_to_cpu(rhead->h_num_logops) == 1) { umount_data_blk = (i + hblks) % log->l_logBBsize; @@ -975,12 +975,10 @@ xlog_find_tail( * log records will point recovery to after the * current unmount record. */ - log->l_tail_lsn = - xlog_assign_lsn(log->l_curr_cycle, - after_umount_blk); - atomic64_set(&log->l_last_sync_lsn, - xlog_assign_lsn(log->l_curr_cycle, - after_umount_blk)); + xlog_assign_atomic_lsn(&log->l_tail_lsn, + log->l_curr_cycle, after_umount_blk); + xlog_assign_atomic_lsn(&log->l_last_sync_lsn, + log->l_curr_cycle, after_umount_blk); *tail_blk = after_umount_blk; /* -- 1.7.2.3 From SRS0+Ksmg+16+fromorbit.com=dave@internode.on.net Sun Dec 12 23:01:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_TICKET autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD51brA160855 for ; Sun, 12 Dec 2010 23:01:37 -0600 X-ASG-Debug-ID: 1292215585-717502330000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 802F9143F6CF for ; Sun, 12 Dec 2010 20:46:26 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id sqjVFtxLks2FKEdw for ; Sun, 12 Dec 2010 20:46:26 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49439967-1927428 for ; Mon, 13 Dec 2010 15:16:24 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PS0Ip-00022O-7d for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:46:23 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PS0HL-0004mF-2K for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:44:51 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 01/12] xfs: convert log grant ticket queues to list heads Subject: [PATCH 01/12] xfs: convert log grant ticket queues to list heads Date: Mon, 13 Dec 2010 15:44:32 +1100 Message-Id: <1292215483-18224-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292215483-18224-1-git-send-email-david@fromorbit.com> References: <1292215483-18224-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1292215587 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49274 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The grant write and reserve queues use a roll-your-own double linked list, so convert it to a standard list_head structure and convert all the list traversals to use list_for_each_entry(). We can also get rid of the XLOG_TIC_IN_Q flag as we can use the list_empty() check to tell if the ticket is in a list or not. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_trace.h | 12 ++-- fs/xfs/xfs_log.c | 123 ++++++++++++++---------------------------- fs/xfs/xfs_log_priv.h | 11 ++--- 3 files changed, 51 insertions(+), 95 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index acef2e9..f400668 100644 --- a/fs/xfs/linux-2.6/xfs_trace.h +++ b/fs/xfs/linux-2.6/xfs_trace.h @@ -766,8 +766,8 @@ DECLARE_EVENT_CLASS(xfs_loggrant_class, __field(int, curr_res) __field(int, unit_res) __field(unsigned int, flags) - __field(void *, reserve_headq) - __field(void *, write_headq) + __field(void *, reserveq) + __field(void *, writeq) __field(int, grant_reserve_cycle) __field(int, grant_reserve_bytes) __field(int, grant_write_cycle) @@ -784,8 +784,8 @@ DECLARE_EVENT_CLASS(xfs_loggrant_class, __entry->curr_res = tic->t_curr_res; __entry->unit_res = tic->t_unit_res; __entry->flags = tic->t_flags; - __entry->reserve_headq = log->l_reserve_headq; - __entry->write_headq = log->l_write_headq; + __entry->reserveq = log->l_reserveq.next; + __entry->writeq = log->l_writeq.next; __entry->grant_reserve_cycle = log->l_grant_reserve_cycle; __entry->grant_reserve_bytes = log->l_grant_reserve_bytes; __entry->grant_write_cycle = log->l_grant_write_cycle; @@ -807,8 +807,8 @@ DECLARE_EVENT_CLASS(xfs_loggrant_class, __entry->curr_res, __entry->unit_res, __print_flags(__entry->flags, "|", XLOG_TIC_FLAGS), - __entry->reserve_headq, - __entry->write_headq, + __entry->reserveq, + __entry->writeq, __entry->grant_reserve_cycle, __entry->grant_reserve_bytes, __entry->grant_write_cycle, diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index cee4ab9..1b82735 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -95,38 +95,6 @@ STATIC void xlog_verify_tail_lsn(xlog_t *log, xlog_in_core_t *iclog, STATIC int xlog_iclogs_empty(xlog_t *log); - -static void -xlog_ins_ticketq(struct xlog_ticket **qp, struct xlog_ticket *tic) -{ - if (*qp) { - tic->t_next = (*qp); - tic->t_prev = (*qp)->t_prev; - (*qp)->t_prev->t_next = tic; - (*qp)->t_prev = tic; - } else { - tic->t_prev = tic->t_next = tic; - *qp = tic; - } - - tic->t_flags |= XLOG_TIC_IN_Q; -} - -static void -xlog_del_ticketq(struct xlog_ticket **qp, struct xlog_ticket *tic) -{ - if (tic == tic->t_next) { - *qp = NULL; - } else { - *qp = tic->t_next; - tic->t_next->t_prev = tic->t_prev; - tic->t_prev->t_next = tic->t_next; - } - - tic->t_next = tic->t_prev = NULL; - tic->t_flags &= ~XLOG_TIC_IN_Q; -} - static void xlog_grant_sub_space(struct log *log, int bytes) { @@ -724,7 +692,7 @@ xfs_log_move_tail(xfs_mount_t *mp, log->l_tail_lsn = tail_lsn; } - if ((tic = log->l_write_headq)) { + if (!list_empty(&log->l_writeq)) { #ifdef DEBUG if (log->l_flags & XLOG_ACTIVE_RECOVERY) panic("Recovery problem"); @@ -732,7 +700,7 @@ xfs_log_move_tail(xfs_mount_t *mp, cycle = log->l_grant_write_cycle; bytes = log->l_grant_write_bytes; free_bytes = xlog_space_left(log, cycle, bytes); - do { + list_for_each_entry(tic, &log->l_writeq, t_queue) { ASSERT(tic->t_flags & XLOG_TIC_PERM_RESERV); if (free_bytes < tic->t_unit_res && tail_lsn != 1) @@ -740,10 +708,10 @@ xfs_log_move_tail(xfs_mount_t *mp, tail_lsn = 0; free_bytes -= tic->t_unit_res; sv_signal(&tic->t_wait); - tic = tic->t_next; - } while (tic != log->l_write_headq); + } } - if ((tic = log->l_reserve_headq)) { + + if (!list_empty(&log->l_reserveq)) { #ifdef DEBUG if (log->l_flags & XLOG_ACTIVE_RECOVERY) panic("Recovery problem"); @@ -751,7 +719,7 @@ xfs_log_move_tail(xfs_mount_t *mp, cycle = log->l_grant_reserve_cycle; bytes = log->l_grant_reserve_bytes; free_bytes = xlog_space_left(log, cycle, bytes); - do { + list_for_each_entry(tic, &log->l_reserveq, t_queue) { if (tic->t_flags & XLOG_TIC_PERM_RESERV) need_bytes = tic->t_unit_res*tic->t_cnt; else @@ -761,8 +729,7 @@ xfs_log_move_tail(xfs_mount_t *mp, tail_lsn = 0; free_bytes -= need_bytes; sv_signal(&tic->t_wait); - tic = tic->t_next; - } while (tic != log->l_reserve_headq); + } } spin_unlock(&log->l_grant_lock); } /* xfs_log_move_tail */ @@ -1053,6 +1020,8 @@ xlog_alloc_log(xfs_mount_t *mp, log->l_curr_cycle = 1; /* 0 is bad since this is initial value */ log->l_grant_reserve_cycle = 1; log->l_grant_write_cycle = 1; + INIT_LIST_HEAD(&log->l_reserveq); + INIT_LIST_HEAD(&log->l_writeq); error = EFSCORRUPTED; if (xfs_sb_version_hassector(&mp->m_sb)) { @@ -2550,8 +2519,8 @@ xlog_grant_log_space(xlog_t *log, trace_xfs_log_grant_enter(log, tic); /* something is already sleeping; insert new transaction at end */ - if (log->l_reserve_headq) { - xlog_ins_ticketq(&log->l_reserve_headq, tic); + if (!list_empty(&log->l_reserveq)) { + list_add_tail(&tic->t_queue, &log->l_reserveq); trace_xfs_log_grant_sleep1(log, tic); @@ -2583,8 +2552,8 @@ redo: free_bytes = xlog_space_left(log, log->l_grant_reserve_cycle, log->l_grant_reserve_bytes); if (free_bytes < need_bytes) { - if ((tic->t_flags & XLOG_TIC_IN_Q) == 0) - xlog_ins_ticketq(&log->l_reserve_headq, tic); + if (list_empty(&tic->t_queue)) + list_add_tail(&tic->t_queue, &log->l_reserveq); trace_xfs_log_grant_sleep2(log, tic); @@ -2602,8 +2571,9 @@ redo: trace_xfs_log_grant_wake2(log, tic); goto redo; - } else if (tic->t_flags & XLOG_TIC_IN_Q) - xlog_del_ticketq(&log->l_reserve_headq, tic); + } + + list_del_init(&tic->t_queue); /* we've got enough space */ xlog_grant_add_space(log, need_bytes); @@ -2626,9 +2596,7 @@ redo: return 0; error_return: - if (tic->t_flags & XLOG_TIC_IN_Q) - xlog_del_ticketq(&log->l_reserve_headq, tic); - + list_del_init(&tic->t_queue); trace_xfs_log_grant_error(log, tic); /* @@ -2653,7 +2621,6 @@ xlog_regrant_write_log_space(xlog_t *log, xlog_ticket_t *tic) { int free_bytes, need_bytes; - xlog_ticket_t *ntic; #ifdef DEBUG xfs_lsn_t tail_lsn; #endif @@ -2683,22 +2650,23 @@ xlog_regrant_write_log_space(xlog_t *log, * this transaction. */ need_bytes = tic->t_unit_res; - if ((ntic = log->l_write_headq)) { + if (!list_empty(&log->l_writeq)) { + struct xlog_ticket *ntic; free_bytes = xlog_space_left(log, log->l_grant_write_cycle, log->l_grant_write_bytes); - do { + list_for_each_entry(ntic, &log->l_writeq, t_queue) { ASSERT(ntic->t_flags & XLOG_TIC_PERM_RESERV); if (free_bytes < ntic->t_unit_res) break; free_bytes -= ntic->t_unit_res; sv_signal(&ntic->t_wait); - ntic = ntic->t_next; - } while (ntic != log->l_write_headq); + } - if (ntic != log->l_write_headq) { - if ((tic->t_flags & XLOG_TIC_IN_Q) == 0) - xlog_ins_ticketq(&log->l_write_headq, tic); + if (ntic != list_first_entry(&log->l_writeq, + struct xlog_ticket, t_queue)) { + if (list_empty(&tic->t_queue)) + list_add_tail(&tic->t_queue, &log->l_writeq); trace_xfs_log_regrant_write_sleep1(log, tic); @@ -2727,8 +2695,8 @@ redo: free_bytes = xlog_space_left(log, log->l_grant_write_cycle, log->l_grant_write_bytes); if (free_bytes < need_bytes) { - if ((tic->t_flags & XLOG_TIC_IN_Q) == 0) - xlog_ins_ticketq(&log->l_write_headq, tic); + if (list_empty(&tic->t_queue)) + list_add_tail(&tic->t_queue, &log->l_writeq); spin_unlock(&log->l_grant_lock); xlog_grant_push_ail(log->l_mp, need_bytes); spin_lock(&log->l_grant_lock); @@ -2745,8 +2713,9 @@ redo: trace_xfs_log_regrant_write_wake2(log, tic); goto redo; - } else if (tic->t_flags & XLOG_TIC_IN_Q) - xlog_del_ticketq(&log->l_write_headq, tic); + } + + list_del_init(&tic->t_queue); /* we've got enough space */ xlog_grant_add_space_write(log, need_bytes); @@ -2766,9 +2735,7 @@ redo: error_return: - if (tic->t_flags & XLOG_TIC_IN_Q) - xlog_del_ticketq(&log->l_reserve_headq, tic); - + list_del_init(&tic->t_queue); trace_xfs_log_regrant_write_error(log, tic); /* @@ -3435,6 +3402,7 @@ xlog_ticket_alloc( } atomic_set(&tic->t_ref, 1); + INIT_LIST_HEAD(&tic->t_queue); tic->t_unit_res = unit_bytes; tic->t_curr_res = unit_bytes; tic->t_cnt = cnt; @@ -3742,26 +3710,17 @@ xfs_log_force_umount( spin_unlock(&log->l_icloglock); /* - * We don't want anybody waiting for log reservations - * after this. That means we have to wake up everybody - * queued up on reserve_headq as well as write_headq. - * In addition, we make sure in xlog_{re}grant_log_space - * that we don't enqueue anything once the SHUTDOWN flag - * is set, and this action is protected by the GRANTLOCK. + * We don't want anybody waiting for log reservations after this. That + * means we have to wake up everybody queued up on reserveq as well as + * writeq. In addition, we make sure in xlog_{re}grant_log_space that + * we don't enqueue anything once the SHUTDOWN flag is set, and this + * action is protected by the GRANTLOCK. */ - if ((tic = log->l_reserve_headq)) { - do { - sv_signal(&tic->t_wait); - tic = tic->t_next; - } while (tic != log->l_reserve_headq); - } + list_for_each_entry(tic, &log->l_reserveq, t_queue) + sv_signal(&tic->t_wait); - if ((tic = log->l_write_headq)) { - do { - sv_signal(&tic->t_wait); - tic = tic->t_next; - } while (tic != log->l_write_headq); - } + list_for_each_entry(tic, &log->l_writeq, t_queue) + sv_signal(&tic->t_wait); spin_unlock(&log->l_grant_lock); if (!(log->l_iclog->ic_state & XLOG_STATE_IOERROR)) { diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index edcdfe0..d45fe2d 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -133,12 +133,10 @@ static inline uint xlog_get_client_id(__be32 i) */ #define XLOG_TIC_INITED 0x1 /* has been initialized */ #define XLOG_TIC_PERM_RESERV 0x2 /* permanent reservation */ -#define XLOG_TIC_IN_Q 0x4 #define XLOG_TIC_FLAGS \ { XLOG_TIC_INITED, "XLOG_TIC_INITED" }, \ - { XLOG_TIC_PERM_RESERV, "XLOG_TIC_PERM_RESERV" }, \ - { XLOG_TIC_IN_Q, "XLOG_TIC_IN_Q" } + { XLOG_TIC_PERM_RESERV, "XLOG_TIC_PERM_RESERV" } #endif /* __KERNEL__ */ @@ -245,8 +243,7 @@ typedef struct xlog_res { typedef struct xlog_ticket { sv_t t_wait; /* ticket wait queue : 20 */ - struct xlog_ticket *t_next; /* :4|8 */ - struct xlog_ticket *t_prev; /* :4|8 */ + struct list_head t_queue; /* reserve/write queue */ xlog_tid_t t_tid; /* transaction identifier : 4 */ atomic_t t_ref; /* ticket reference count : 4 */ int t_curr_res; /* current reservation in bytes : 4 */ @@ -520,8 +517,8 @@ typedef struct log { /* The following block of fields are changed while holding grant_lock */ spinlock_t l_grant_lock ____cacheline_aligned_in_smp; - xlog_ticket_t *l_reserve_headq; - xlog_ticket_t *l_write_headq; + struct list_head l_reserveq; + struct list_head l_writeq; int l_grant_reserve_cycle; int l_grant_reserve_bytes; int l_grant_write_cycle; -- 1.7.2.3 From SRS0+gPCZ+16+fromorbit.com=dave@internode.on.net Sun Dec 12 23:01:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD51bPU160857 for ; Sun, 12 Dec 2010 23:01:37 -0600 X-ASG-Debug-ID: 1292215605-645802fe0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 076F0143FE54 for ; Sun, 12 Dec 2010 20:46:45 -0800 (PST) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id OQPzAMewCePS6iZt for ; Sun, 12 Dec 2010 20:46:45 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49755639-1927428 for ; Mon, 13 Dec 2010 15:16:44 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PS0J9-00022e-Eg for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:46:43 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PS0HV-0004mX-As for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:45:01 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 06/12] xfs: make AIL tail pushing independent of the grant lock Subject: [PATCH 06/12] xfs: make AIL tail pushing independent of the grant lock Date: Mon, 13 Dec 2010 15:44:37 +1100 Message-Id: <1292215483-18224-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292215483-18224-1-git-send-email-david@fromorbit.com> References: <1292215483-18224-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1292215607 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49274 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The xlog_grant_push_ail() currently takes the grant lock internally to sample the tail lsn, last sync lsn and the reserve grant head. Most of the callers already hold the grant lock but have to drop it before calling xlog_grant_push_ail(). This is a left over from when the AIL tail pushing was done in line and hence xlog_grant_push_ail had to drop the grant lock. AIL push is now done in another thread and hence we can safely hold the grant lock over the entire xlog_grant_push_ail call. Push the grant lock outside of xlog_grant_push_ail() to simplify the locking and synchronisation needed for tail pushing. This will reduce traffic on the grant lock by itself, but this is only one step in preparing for the complete removal of the grant lock. While there, clean up the formatting of xlog_grant_push_ail() to match the rest of the XFS code. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log.c | 111 ++++++++++++++++++++++++++--------------------------- 1 files changed, 54 insertions(+), 57 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 3656d77..d15bd5b 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -70,7 +70,7 @@ STATIC void xlog_state_want_sync(xlog_t *log, xlog_in_core_t *iclog); /* local functions to manipulate grant head */ STATIC int xlog_grant_log_space(xlog_t *log, xlog_ticket_t *xtic); -STATIC void xlog_grant_push_ail(xfs_mount_t *mp, +STATIC void xlog_grant_push_ail(struct log *log, int need_bytes); STATIC void xlog_regrant_reserve_log_space(xlog_t *log, xlog_ticket_t *ticket); @@ -318,7 +318,9 @@ xfs_log_reserve( trace_xfs_log_reserve(log, internal_ticket); - xlog_grant_push_ail(mp, internal_ticket->t_unit_res); + spin_lock(&log->l_grant_lock); + xlog_grant_push_ail(log, internal_ticket->t_unit_res); + spin_unlock(&log->l_grant_lock); retval = xlog_regrant_write_log_space(log, internal_ticket); } else { /* may sleep if need to allocate more tickets */ @@ -332,9 +334,11 @@ xfs_log_reserve( trace_xfs_log_reserve(log, internal_ticket); - xlog_grant_push_ail(mp, + spin_lock(&log->l_grant_lock); + xlog_grant_push_ail(log, (internal_ticket->t_unit_res * internal_ticket->t_cnt)); + spin_unlock(&log->l_grant_lock); retval = xlog_grant_log_space(log, internal_ticket); } @@ -1185,59 +1189,58 @@ xlog_commit_record( * water mark. In this manner, we would be creating a low water mark. */ STATIC void -xlog_grant_push_ail(xfs_mount_t *mp, - int need_bytes) +xlog_grant_push_ail( + struct log *log, + int need_bytes) { - xlog_t *log = mp->m_log; /* pointer to the log */ - xfs_lsn_t tail_lsn; /* lsn of the log tail */ - xfs_lsn_t threshold_lsn = 0; /* lsn we'd like to be at */ - int free_blocks; /* free blocks left to write to */ - int free_bytes; /* free bytes left to write to */ - int threshold_block; /* block in lsn we'd like to be at */ - int threshold_cycle; /* lsn cycle we'd like to be at */ - int free_threshold; - - ASSERT(BTOBB(need_bytes) < log->l_logBBsize); - - spin_lock(&log->l_grant_lock); - free_bytes = xlog_space_left(log, &log->l_grant_reserve_head); - tail_lsn = log->l_tail_lsn; - free_blocks = BTOBBT(free_bytes); - - /* - * Set the threshold for the minimum number of free blocks in the - * log to the maximum of what the caller needs, one quarter of the - * log, and 256 blocks. - */ - free_threshold = BTOBB(need_bytes); - free_threshold = MAX(free_threshold, (log->l_logBBsize >> 2)); - free_threshold = MAX(free_threshold, 256); - if (free_blocks < free_threshold) { + xfs_lsn_t threshold_lsn = 0; + xfs_lsn_t tail_lsn; + int free_blocks; + int free_bytes; + int threshold_block; + int threshold_cycle; + int free_threshold; + + ASSERT(BTOBB(need_bytes) < log->l_logBBsize); + + tail_lsn = log->l_tail_lsn; + free_bytes = xlog_space_left(log, &log->l_grant_reserve_head); + free_blocks = BTOBBT(free_bytes); + + /* + * Set the threshold for the minimum number of free blocks in the + * log to the maximum of what the caller needs, one quarter of the + * log, and 256 blocks. + */ + free_threshold = BTOBB(need_bytes); + free_threshold = MAX(free_threshold, (log->l_logBBsize >> 2)); + free_threshold = MAX(free_threshold, 256); + if (free_blocks >= free_threshold) + return; + threshold_block = BLOCK_LSN(tail_lsn) + free_threshold; threshold_cycle = CYCLE_LSN(tail_lsn); if (threshold_block >= log->l_logBBsize) { - threshold_block -= log->l_logBBsize; - threshold_cycle += 1; + threshold_block -= log->l_logBBsize; + threshold_cycle += 1; } - threshold_lsn = xlog_assign_lsn(threshold_cycle, threshold_block); - - /* Don't pass in an lsn greater than the lsn of the last + threshold_lsn = xlog_assign_lsn(threshold_cycle, + threshold_block); + /* + * Don't pass in an lsn greater than the lsn of the last * log record known to be on disk. */ if (XFS_LSN_CMP(threshold_lsn, log->l_last_sync_lsn) > 0) - threshold_lsn = log->l_last_sync_lsn; - } - spin_unlock(&log->l_grant_lock); - - /* - * Get the transaction layer to kick the dirty buffers out to - * disk asynchronously. No point in trying to do this if - * the filesystem is shutting down. - */ - if (threshold_lsn && - !XLOG_FORCED_SHUTDOWN(log)) - xfs_trans_ail_push(log->l_ailp, threshold_lsn); -} /* xlog_grant_push_ail */ + threshold_lsn = log->l_last_sync_lsn; + + /* + * Get the transaction layer to kick the dirty buffers out to + * disk asynchronously. No point in trying to do this if + * the filesystem is shutting down. + */ + if (!XLOG_FORCED_SHUTDOWN(log)) + xfs_trans_ail_push(log->l_ailp, threshold_lsn); +} /* * The bdstrat callback function for log bufs. This gives us a central @@ -2543,9 +2546,7 @@ redo: trace_xfs_log_grant_sleep2(log, tic); - spin_unlock(&log->l_grant_lock); - xlog_grant_push_ail(log->l_mp, need_bytes); - spin_lock(&log->l_grant_lock); + xlog_grant_push_ail(log, need_bytes); XFS_STATS_INC(xs_sleep_logspace); xlog_wait(&tic->t_wait, &log->l_grant_lock); @@ -2641,9 +2642,7 @@ xlog_regrant_write_log_space(xlog_t *log, trace_xfs_log_regrant_write_sleep1(log, tic); - spin_unlock(&log->l_grant_lock); - xlog_grant_push_ail(log->l_mp, need_bytes); - spin_lock(&log->l_grant_lock); + xlog_grant_push_ail(log, need_bytes); XFS_STATS_INC(xs_sleep_logspace); xlog_wait(&tic->t_wait, &log->l_grant_lock); @@ -2666,9 +2665,7 @@ redo: if (free_bytes < need_bytes) { if (list_empty(&tic->t_queue)) list_add_tail(&tic->t_queue, &log->l_writeq); - spin_unlock(&log->l_grant_lock); - xlog_grant_push_ail(log->l_mp, need_bytes); - spin_lock(&log->l_grant_lock); + xlog_grant_push_ail(log, need_bytes); XFS_STATS_INC(xs_sleep_logspace); trace_xfs_log_regrant_write_sleep2(log, tic); -- 1.7.2.3 From SRS0+w8Wj+16+fromorbit.com=dave@internode.on.net Sun Dec 12 23:01:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD51bKe160856 for ; Sun, 12 Dec 2010 23:01:37 -0600 X-ASG-Debug-ID: 1292215595-63ba03290000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B6069143FE4C for ; Sun, 12 Dec 2010 20:46:35 -0800 (PST) Received: from mail.internode.on.net (bld-mail20.adl6.internode.on.net [150.101.137.105]) by cuda.sgi.com with ESMTP id eFNZ4S1CxXdsarhY for ; Sun, 12 Dec 2010 20:46:35 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 4436859-1927428 for ; Mon, 13 Dec 2010 15:16:34 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PS0Iz-00022f-HJ for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:46:33 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PS0HV-0004ma-Ca for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:45:01 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 07/12] xfs: convert l_last_sync_lsn to an atomic variable Subject: [PATCH 07/12] xfs: convert l_last_sync_lsn to an atomic variable Date: Mon, 13 Dec 2010 15:44:38 +1100 Message-Id: <1292215483-18224-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292215483-18224-1-git-send-email-david@fromorbit.com> References: <1292215483-18224-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail20.adl6.internode.on.net[150.101.137.105] X-Barracuda-Start-Time: 1292215596 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49274 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner log->l_last_sync_lsn is updated in only one critical spot - log buffer Io completion - and is protected by the grant lock here. This requires the grant lock to be taken for every log buffer IO completion. Converting the l_last_sync_lsn variable to an atomic64_t means that we do not need to take the grant lock in log buffer IO completion to update it. This also removes the need for explicitly holding a spinlock to read the l_last_sync_lsn on 32 bit platforms. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_log.c | 55 +++++++++++++++++++++------------------------- fs/xfs/xfs_log_priv.h | 9 ++++++- fs/xfs/xfs_log_recover.c | 6 ++-- 3 files changed, 36 insertions(+), 34 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index d15bd5b..6ed6ee9 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -675,12 +675,8 @@ xfs_log_move_tail(xfs_mount_t *mp, if (XLOG_FORCED_SHUTDOWN(log)) return; - if (tail_lsn == 0) { - /* needed since sync_lsn is 64 bits */ - spin_lock(&log->l_icloglock); - tail_lsn = log->l_last_sync_lsn; - spin_unlock(&log->l_icloglock); - } + if (tail_lsn == 0) + tail_lsn = atomic64_read(&log->l_last_sync_lsn); spin_lock(&log->l_grant_lock); @@ -800,11 +796,9 @@ xlog_assign_tail_lsn(xfs_mount_t *mp) tail_lsn = xfs_trans_ail_tail(mp->m_ail); spin_lock(&log->l_grant_lock); - if (tail_lsn != 0) { - log->l_tail_lsn = tail_lsn; - } else { - tail_lsn = log->l_tail_lsn = log->l_last_sync_lsn; - } + if (!tail_lsn) + tail_lsn = atomic64_read(&log->l_last_sync_lsn); + log->l_tail_lsn = tail_lsn; spin_unlock(&log->l_grant_lock); return tail_lsn; @@ -1014,9 +1008,9 @@ xlog_alloc_log(xfs_mount_t *mp, log->l_flags |= XLOG_ACTIVE_RECOVERY; log->l_prev_block = -1; - log->l_tail_lsn = xlog_assign_lsn(1, 0); /* log->l_tail_lsn = 0x100000000LL; cycle = 1; current block = 0 */ - log->l_last_sync_lsn = log->l_tail_lsn; + log->l_tail_lsn = xlog_assign_lsn(1, 0); + atomic64_set(&log->l_last_sync_lsn, xlog_assign_lsn(1, 0)); log->l_curr_cycle = 1; /* 0 is bad since this is initial value */ xlog_assign_grant_head(&log->l_grant_reserve_head, 1, 0); xlog_assign_grant_head(&log->l_grant_write_head, 1, 0); @@ -1194,6 +1188,7 @@ xlog_grant_push_ail( int need_bytes) { xfs_lsn_t threshold_lsn = 0; + xfs_lsn_t last_sync_lsn; xfs_lsn_t tail_lsn; int free_blocks; int free_bytes; @@ -1228,10 +1223,12 @@ xlog_grant_push_ail( threshold_block); /* * Don't pass in an lsn greater than the lsn of the last - * log record known to be on disk. + * log record known to be on disk. Use a snapshot of the last sync lsn + * so that it doesn't change between the compare and the set. */ - if (XFS_LSN_CMP(threshold_lsn, log->l_last_sync_lsn) > 0) - threshold_lsn = log->l_last_sync_lsn; + last_sync_lsn = atomic64_read(&log->l_last_sync_lsn); + if (XFS_LSN_CMP(threshold_lsn, last_sync_lsn) > 0) + threshold_lsn = last_sync_lsn; /* * Get the transaction layer to kick the dirty buffers out to @@ -2194,7 +2191,7 @@ xlog_state_do_callback( lowest_lsn = xlog_get_lowest_lsn(log); if (lowest_lsn && XFS_LSN_CMP(lowest_lsn, - be64_to_cpu(iclog->ic_header.h_lsn)) < 0) { + be64_to_cpu(iclog->ic_header.h_lsn)) < 0) { iclog = iclog->ic_next; continue; /* Leave this iclog for * another thread */ @@ -2202,23 +2199,21 @@ xlog_state_do_callback( iclog->ic_state = XLOG_STATE_CALLBACK; - spin_unlock(&log->l_icloglock); - /* l_last_sync_lsn field protected by - * l_grant_lock. Don't worry about iclog's lsn. - * No one else can be here except us. + /* + * update the last_sync_lsn before we drop the + * icloglock to ensure we are the only one that + * can update it. */ - spin_lock(&log->l_grant_lock); - ASSERT(XFS_LSN_CMP(log->l_last_sync_lsn, - be64_to_cpu(iclog->ic_header.h_lsn)) <= 0); - log->l_last_sync_lsn = - be64_to_cpu(iclog->ic_header.h_lsn); - spin_unlock(&log->l_grant_lock); + ASSERT(XFS_LSN_CMP(atomic64_read(&log->l_last_sync_lsn), + be64_to_cpu(iclog->ic_header.h_lsn)) <= 0); + atomic64_set(&log->l_last_sync_lsn, + be64_to_cpu(iclog->ic_header.h_lsn)); - } else { - spin_unlock(&log->l_icloglock); + } else ioerrors++; - } + + spin_unlock(&log->l_icloglock); /* * Keep processing entries in the callback list until diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index 84c5e79..129068c 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -508,7 +508,6 @@ typedef struct log { spinlock_t l_icloglock; /* grab to change iclog state */ xfs_lsn_t l_tail_lsn; /* lsn of 1st LR with unflushed * buffers */ - xfs_lsn_t l_last_sync_lsn;/* lsn of last LR on disk */ int l_curr_cycle; /* Cycle number of log writes */ int l_prev_cycle; /* Cycle number before last * block increment */ @@ -522,6 +521,14 @@ typedef struct log { int64_t l_grant_reserve_head; int64_t l_grant_write_head; + /* + * l_last_sync_lsn is an atomic so it can be set and read without + * needing to hold specific locks. To avoid operations contending with + * other hot objects, place it on a separate cacheline. + */ + /* lsn of last LR on disk */ + atomic64_t l_last_sync_lsn ____cacheline_aligned_in_smp; + /* The following field are used for debugging; need to hold icloglock */ #ifdef DEBUG char *l_iclog_bak[XLOG_MAX_ICLOGS]; diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 3e91975..7e5b8ab 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -926,7 +926,7 @@ xlog_find_tail( if (found == 2) log->l_curr_cycle++; log->l_tail_lsn = be64_to_cpu(rhead->h_tail_lsn); - log->l_last_sync_lsn = be64_to_cpu(rhead->h_lsn); + atomic64_set(&log->l_last_sync_lsn, be64_to_cpu(rhead->h_lsn)); xlog_assign_grant_head(&log->l_grant_reserve_head, log->l_curr_cycle, BBTOB(log->l_curr_block)); xlog_assign_grant_head(&log->l_grant_write_head, log->l_curr_cycle, @@ -978,9 +978,9 @@ xlog_find_tail( log->l_tail_lsn = xlog_assign_lsn(log->l_curr_cycle, after_umount_blk); - log->l_last_sync_lsn = + atomic64_set(&log->l_last_sync_lsn, xlog_assign_lsn(log->l_curr_cycle, - after_umount_blk); + after_umount_blk)); *tail_blk = after_umount_blk; /* -- 1.7.2.3 From SRS0+Gu6A+16+fromorbit.com=dave@internode.on.net Sun Dec 12 23:01:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_57 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD51bVj160854 for ; Sun, 12 Dec 2010 23:01:37 -0600 X-ASG-Debug-ID: 1292215596-63be02f70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D5D04143FE50 for ; Sun, 12 Dec 2010 20:46:36 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id z9dljIF2TUYtAksJ for ; Sun, 12 Dec 2010 20:46:36 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49889413-1927428 for ; Mon, 13 Dec 2010 15:16:35 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PS0Iz-00022c-Dz for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:46:33 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PS0HV-0004mU-9E for xfs@oss.sgi.com; Mon, 13 Dec 2010 15:45:01 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 05/12] xfs: use wait queues directly for the log wait queues Subject: [PATCH 05/12] xfs: use wait queues directly for the log wait queues Date: Mon, 13 Dec 2010 15:44:36 +1100 Message-Id: <1292215483-18224-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292215483-18224-1-git-send-email-david@fromorbit.com> References: <1292215483-18224-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1292215597 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49274 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The log grant queues are one of the few places left using sv_t constructs for waiting. Given we are touching this code, we should convert them to plain wait queues. While there, convert all the other sv_t users in the log code as well. Seeing as this removes the last users of the sv_t type, remove the header file defining the wrapper and the fragments that still reference it. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/sv.h | 59 -------------------------------------- fs/xfs/linux-2.6/xfs_linux.h | 1 - fs/xfs/quota/xfs_dquot.c | 1 - fs/xfs/xfs_log.c | 64 ++++++++++++++++++----------------------- fs/xfs/xfs_log_cil.c | 8 ++-- fs/xfs/xfs_log_priv.h | 25 +++++++++++++--- 6 files changed, 52 insertions(+), 106 deletions(-) delete mode 100644 fs/xfs/linux-2.6/sv.h diff --git a/fs/xfs/linux-2.6/sv.h b/fs/xfs/linux-2.6/sv.h deleted file mode 100644 index 4dfc7c3..0000000 --- a/fs/xfs/linux-2.6/sv.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_SUPPORT_SV_H__ -#define __XFS_SUPPORT_SV_H__ - -#include -#include -#include - -/* - * Synchronisation variables. - * - * (Parameters "pri", "svf" and "rts" are not implemented) - */ - -typedef struct sv_s { - wait_queue_head_t waiters; -} sv_t; - -static inline void _sv_wait(sv_t *sv, spinlock_t *lock) -{ - DECLARE_WAITQUEUE(wait, current); - - add_wait_queue_exclusive(&sv->waiters, &wait); - __set_current_state(TASK_UNINTERRUPTIBLE); - spin_unlock(lock); - - schedule(); - - remove_wait_queue(&sv->waiters, &wait); -} - -#define sv_init(sv,flag,name) \ - init_waitqueue_head(&(sv)->waiters) -#define sv_destroy(sv) \ - /*NOTHING*/ -#define sv_wait(sv, pri, lock, s) \ - _sv_wait(sv, lock) -#define sv_signal(sv) \ - wake_up(&(sv)->waiters) -#define sv_broadcast(sv) \ - wake_up_all(&(sv)->waiters) - -#endif /* __XFS_SUPPORT_SV_H__ */ diff --git a/fs/xfs/linux-2.6/xfs_linux.h b/fs/xfs/linux-2.6/xfs_linux.h index 9fa4f2a..ccebd86 100644 --- a/fs/xfs/linux-2.6/xfs_linux.h +++ b/fs/xfs/linux-2.6/xfs_linux.h @@ -37,7 +37,6 @@ #include #include -#include #include #include diff --git a/fs/xfs/quota/xfs_dquot.c b/fs/xfs/quota/xfs_dquot.c index faf8e1a..d22aa31 100644 --- a/fs/xfs/quota/xfs_dquot.c +++ b/fs/xfs/quota/xfs_dquot.c @@ -149,7 +149,6 @@ xfs_qm_dqdestroy( ASSERT(list_empty(&dqp->q_freelist)); mutex_destroy(&dqp->q_qlock); - sv_destroy(&dqp->q_pinwait); kmem_zone_free(xfs_Gqm->qm_dqzone, dqp); atomic_dec(&xfs_Gqm->qm_totaldquots); diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 3299faa..3656d77 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -547,8 +547,8 @@ xfs_log_unmount_write(xfs_mount_t *mp) if (!(iclog->ic_state == XLOG_STATE_ACTIVE || iclog->ic_state == XLOG_STATE_DIRTY)) { if (!XLOG_FORCED_SHUTDOWN(log)) { - sv_wait(&iclog->ic_force_wait, PMEM, - &log->l_icloglock, s); + xlog_wait(&iclog->ic_force_wait, + &log->l_icloglock); } else { spin_unlock(&log->l_icloglock); } @@ -588,8 +588,8 @@ xfs_log_unmount_write(xfs_mount_t *mp) || iclog->ic_state == XLOG_STATE_DIRTY || iclog->ic_state == XLOG_STATE_IOERROR) ) { - sv_wait(&iclog->ic_force_wait, PMEM, - &log->l_icloglock, s); + xlog_wait(&iclog->ic_force_wait, + &log->l_icloglock); } else { spin_unlock(&log->l_icloglock); } @@ -700,7 +700,7 @@ xfs_log_move_tail(xfs_mount_t *mp, break; tail_lsn = 0; free_bytes -= tic->t_unit_res; - sv_signal(&tic->t_wait); + wake_up(&tic->t_wait); } } @@ -719,7 +719,7 @@ xfs_log_move_tail(xfs_mount_t *mp, break; tail_lsn = 0; free_bytes -= need_bytes; - sv_signal(&tic->t_wait); + wake_up(&tic->t_wait); } } spin_unlock(&log->l_grant_lock); @@ -1060,7 +1060,7 @@ xlog_alloc_log(xfs_mount_t *mp, spin_lock_init(&log->l_icloglock); spin_lock_init(&log->l_grant_lock); - sv_init(&log->l_flush_wait, 0, "flush_wait"); + init_waitqueue_head(&log->l_flush_wait); /* log record size must be multiple of BBSIZE; see xlog_rec_header_t */ ASSERT((XFS_BUF_SIZE(bp) & BBMASK) == 0); @@ -1116,8 +1116,8 @@ xlog_alloc_log(xfs_mount_t *mp, ASSERT(XFS_BUF_ISBUSY(iclog->ic_bp)); ASSERT(XFS_BUF_VALUSEMA(iclog->ic_bp) <= 0); - sv_init(&iclog->ic_force_wait, SV_DEFAULT, "iclog-force"); - sv_init(&iclog->ic_write_wait, SV_DEFAULT, "iclog-write"); + init_waitqueue_head(&iclog->ic_force_wait); + init_waitqueue_head(&iclog->ic_write_wait); iclogp = &iclog->ic_next; } @@ -1132,11 +1132,8 @@ xlog_alloc_log(xfs_mount_t *mp, out_free_iclog: for (iclog = log->l_iclog; iclog; iclog = prev_iclog) { prev_iclog = iclog->ic_next; - if (iclog->ic_bp) { - sv_destroy(&iclog->ic_force_wait); - sv_destroy(&iclog->ic_write_wait); + if (iclog->ic_bp) xfs_buf_free(iclog->ic_bp); - } kmem_free(iclog); } spinlock_destroy(&log->l_icloglock); @@ -1453,8 +1450,6 @@ xlog_dealloc_log(xlog_t *log) iclog = log->l_iclog; for (i=0; il_iclog_bufs; i++) { - sv_destroy(&iclog->ic_force_wait); - sv_destroy(&iclog->ic_write_wait); xfs_buf_free(iclog->ic_bp); next_iclog = iclog->ic_next; kmem_free(iclog); @@ -2261,7 +2256,7 @@ xlog_state_do_callback( xlog_state_clean_log(log); /* wake up threads waiting in xfs_log_force() */ - sv_broadcast(&iclog->ic_force_wait); + wake_up_all(&iclog->ic_force_wait); iclog = iclog->ic_next; } while (first_iclog != iclog); @@ -2308,7 +2303,7 @@ xlog_state_do_callback( spin_unlock(&log->l_icloglock); if (wake) - sv_broadcast(&log->l_flush_wait); + wake_up_all(&log->l_flush_wait); } @@ -2359,7 +2354,7 @@ xlog_state_done_syncing( * iclog buffer, we wake them all, one will get to do the * I/O, the others get to wait for the result. */ - sv_broadcast(&iclog->ic_write_wait); + wake_up_all(&iclog->ic_write_wait); spin_unlock(&log->l_icloglock); xlog_state_do_callback(log, aborted, iclog); /* also cleans log */ } /* xlog_state_done_syncing */ @@ -2408,7 +2403,7 @@ restart: XFS_STATS_INC(xs_log_noiclogs); /* Wait for log writes to have flushed */ - sv_wait(&log->l_flush_wait, 0, &log->l_icloglock, 0); + xlog_wait(&log->l_flush_wait, &log->l_icloglock); goto restart; } @@ -2523,7 +2518,8 @@ xlog_grant_log_space(xlog_t *log, goto error_return; XFS_STATS_INC(xs_sleep_logspace); - sv_wait(&tic->t_wait, PINOD|PLTWAIT, &log->l_grant_lock, s); + xlog_wait(&tic->t_wait, &log->l_grant_lock); + /* * If we got an error, and the filesystem is shutting down, * we'll catch it down below. So just continue... @@ -2552,7 +2548,7 @@ redo: spin_lock(&log->l_grant_lock); XFS_STATS_INC(xs_sleep_logspace); - sv_wait(&tic->t_wait, PINOD|PLTWAIT, &log->l_grant_lock, s); + xlog_wait(&tic->t_wait, &log->l_grant_lock); spin_lock(&log->l_grant_lock); if (XLOG_FORCED_SHUTDOWN(log)) @@ -2635,7 +2631,7 @@ xlog_regrant_write_log_space(xlog_t *log, if (free_bytes < ntic->t_unit_res) break; free_bytes -= ntic->t_unit_res; - sv_signal(&ntic->t_wait); + wake_up(&ntic->t_wait); } if (ntic != list_first_entry(&log->l_writeq, @@ -2650,8 +2646,7 @@ xlog_regrant_write_log_space(xlog_t *log, spin_lock(&log->l_grant_lock); XFS_STATS_INC(xs_sleep_logspace); - sv_wait(&tic->t_wait, PINOD|PLTWAIT, - &log->l_grant_lock, s); + xlog_wait(&tic->t_wait, &log->l_grant_lock); /* If we're shutting down, this tic is already * off the queue */ @@ -2677,8 +2672,7 @@ redo: XFS_STATS_INC(xs_sleep_logspace); trace_xfs_log_regrant_write_sleep2(log, tic); - - sv_wait(&tic->t_wait, PINOD|PLTWAIT, &log->l_grant_lock, s); + xlog_wait(&tic->t_wait, &log->l_grant_lock); /* If we're shutting down, this tic is already off the queue */ spin_lock(&log->l_grant_lock); @@ -3029,7 +3023,7 @@ maybe_sleep: return XFS_ERROR(EIO); } XFS_STATS_INC(xs_log_force_sleep); - sv_wait(&iclog->ic_force_wait, PINOD, &log->l_icloglock, s); + xlog_wait(&iclog->ic_force_wait, &log->l_icloglock); /* * No need to grab the log lock here since we're * only deciding whether or not to return EIO @@ -3147,8 +3141,8 @@ try_again: XFS_STATS_INC(xs_log_force_sleep); - sv_wait(&iclog->ic_prev->ic_write_wait, - PSWP, &log->l_icloglock, s); + xlog_wait(&iclog->ic_prev->ic_write_wait, + &log->l_icloglock); if (log_flushed) *log_flushed = 1; already_slept = 1; @@ -3176,7 +3170,7 @@ try_again: return XFS_ERROR(EIO); } XFS_STATS_INC(xs_log_force_sleep); - sv_wait(&iclog->ic_force_wait, PSWP, &log->l_icloglock, s); + xlog_wait(&iclog->ic_force_wait, &log->l_icloglock); /* * No need to grab the log lock here since we're * only deciding whether or not to return EIO @@ -3251,10 +3245,8 @@ xfs_log_ticket_put( xlog_ticket_t *ticket) { ASSERT(atomic_read(&ticket->t_ref) > 0); - if (atomic_dec_and_test(&ticket->t_ref)) { - sv_destroy(&ticket->t_wait); + if (atomic_dec_and_test(&ticket->t_ref)) kmem_zone_free(xfs_log_ticket_zone, ticket); - } } xlog_ticket_t * @@ -3387,7 +3379,7 @@ xlog_ticket_alloc( tic->t_trans_type = 0; if (xflags & XFS_LOG_PERM_RESERV) tic->t_flags |= XLOG_TIC_PERM_RESERV; - sv_init(&tic->t_wait, SV_DEFAULT, "logtick"); + init_waitqueue_head(&tic->t_wait); xlog_tic_reset_res(tic); @@ -3719,10 +3711,10 @@ xfs_log_force_umount( * action is protected by the GRANTLOCK. */ list_for_each_entry(tic, &log->l_reserveq, t_queue) - sv_signal(&tic->t_wait); + wake_up(&tic->t_wait); list_for_each_entry(tic, &log->l_writeq, t_queue) - sv_signal(&tic->t_wait); + wake_up(&tic->t_wait); spin_unlock(&log->l_grant_lock); if (!(log->l_iclog->ic_state & XLOG_STATE_IOERROR)) { diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index f36f1a2..9dc8125 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -61,7 +61,7 @@ xlog_cil_init( INIT_LIST_HEAD(&cil->xc_committing); spin_lock_init(&cil->xc_cil_lock); init_rwsem(&cil->xc_ctx_lock); - sv_init(&cil->xc_commit_wait, SV_DEFAULT, "cilwait"); + init_waitqueue_head(&cil->xc_commit_wait); INIT_LIST_HEAD(&ctx->committing); INIT_LIST_HEAD(&ctx->busy_extents); @@ -563,7 +563,7 @@ restart: * It is still being pushed! Wait for the push to * complete, then start again from the beginning. */ - sv_wait(&cil->xc_commit_wait, 0, &cil->xc_cil_lock, 0); + xlog_wait(&cil->xc_commit_wait, &cil->xc_cil_lock); goto restart; } } @@ -587,7 +587,7 @@ restart: */ spin_lock(&cil->xc_cil_lock); ctx->commit_lsn = commit_lsn; - sv_broadcast(&cil->xc_commit_wait); + wake_up_all(&cil->xc_commit_wait); spin_unlock(&cil->xc_cil_lock); /* release the hounds! */ @@ -752,7 +752,7 @@ restart: * It is still being pushed! Wait for the push to * complete, then start again from the beginning. */ - sv_wait(&cil->xc_commit_wait, 0, &cil->xc_cil_lock, 0); + xlog_wait(&cil->xc_commit_wait, &cil->xc_cil_lock); goto restart; } if (ctx->sequence != sequence) diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index 2fd4819..84c5e79 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -242,7 +242,7 @@ typedef struct xlog_res { } xlog_res_t; typedef struct xlog_ticket { - sv_t t_wait; /* ticket wait queue : 20 */ + wait_queue_head_t t_wait; /* ticket wait queue */ struct list_head t_queue; /* reserve/write queue */ xlog_tid_t t_tid; /* transaction identifier : 4 */ atomic_t t_ref; /* ticket reference count : 4 */ @@ -350,8 +350,8 @@ typedef union xlog_in_core2 { * and move everything else out to subsequent cachelines. */ typedef struct xlog_in_core { - sv_t ic_force_wait; - sv_t ic_write_wait; + wait_queue_head_t ic_force_wait; + wait_queue_head_t ic_write_wait; struct xlog_in_core *ic_next; struct xlog_in_core *ic_prev; struct xfs_buf *ic_bp; @@ -418,7 +418,7 @@ struct xfs_cil { struct xfs_cil_ctx *xc_ctx; struct rw_semaphore xc_ctx_lock; struct list_head xc_committing; - sv_t xc_commit_wait; + wait_queue_head_t xc_commit_wait; xfs_lsn_t xc_current_sequence; }; @@ -500,7 +500,7 @@ typedef struct log { int l_logBBsize; /* size of log in BB chunks */ /* The following block of fields are changed while holding icloglock */ - sv_t l_flush_wait ____cacheline_aligned_in_smp; + wait_queue_head_t l_flush_wait ____cacheline_aligned_in_smp; /* waiting for iclog flush */ int l_covered_state;/* state of "covering disk * log entries" */ @@ -600,6 +600,21 @@ xlog_cil_force(struct log *log) */ #define XLOG_UNMOUNT_REC_TYPE (-1U) +/* + * Wrapper function for waiting on a wait queue serialised against wakeups + * by a spinlock. This matches the semantics of all the wait queues used in the + * log code. + */ +static inline void xlog_wait(wait_queue_head_t *wq, spinlock_t *lock) +{ + DECLARE_WAITQUEUE(wait, current); + + add_wait_queue_exclusive(wq, &wait); + __set_current_state(TASK_UNINTERRUPTIBLE); + spin_unlock(lock); + schedule(); + remove_wait_queue(wq, &wait); +} #endif /* __KERNEL__ */ #endif /* __XFS_LOG_PRIV_H__ */ -- 1.7.2.3 From xin.zhong@intel.com Mon Dec 13 01:22:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_62 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBD7MISN171611 for ; Mon, 13 Dec 2010 01:22:18 -0600 X-ASG-Debug-ID: 1292225047-753001610000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mga09.intel.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 184F4144029F for ; Sun, 12 Dec 2010 23:24:08 -0800 (PST) Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by cuda.sgi.com with ESMTP id SJP95Bl3sFiusX92 for ; Sun, 12 Dec 2010 23:24:08 -0800 (PST) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga102.jf.intel.com with ESMTP; 12 Dec 2010 23:24:07 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.59,335,1288594800"; d="scan'208";a="583120024" Received: from zyh-fedora.bj.intel.com (HELO localhost.localdomain) ([10.238.135.222]) by orsmga002.jf.intel.com with ESMTP; 12 Dec 2010 23:24:06 -0800 From: "Zhong, Xin" To: xfs@oss.sgi.com Cc: xin.zhong@intel.com X-ASG-Orig-Subj: [PATCH] xfstests: pwrite hang when writing from mmaped buffer of the same page Subject: [PATCH] xfstests: pwrite hang when writing from mmaped buffer of the same page Date: Mon, 13 Dec 2010 15:24:43 +0800 Message-Id: <1292225083-17713-1-git-send-email-xin.zhong@intel.com> X-Mailer: git-send-email 1.6.2.2 X-Barracuda-Connect: mga09.intel.com[134.134.136.24] X-Barracuda-Start-Time: 1292225049 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49284 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean The problem is found in meego testing: http://bugs.meego.com/show_bug.cgi?id=6672 Only btrfs has this problem so far. Other linux fs works well. Signed-off-by: Zhong, Xin --- 248 | 57 ++++++++++++++++++++++++++++++++++++++++ 248.out | 2 + group | 1 + src/Makefile | 2 +- src/pwrite_mmap_blocked.c | 63 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 124 insertions(+), 1 deletions(-) create mode 100644 248 create mode 100644 248.out create mode 100644 src/pwrite_mmap_blocked.c diff --git a/248 b/248 new file mode 100644 index 0000000..3e996d3 --- /dev/null +++ b/248 @@ -0,0 +1,57 @@ +#! /bin/bash +# FS QA Test No. 248 +# +# Test for pwrite hang problem when writing from mmaped buffer of the same page +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 YOUR NAME HERE. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# +# creator +owner=xin.zhong@intel.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here + +# Modify as appropriate. +_supported_fs generic +_supported_os Linux + +TESTFILE=$TEST_DIR/test_file +TEST_PROG=$here/src/pwrite_mmap_blocked + +$TEST_PROG $TESTFILE + +# success, all done +status=0 +exit diff --git a/248.out b/248.out new file mode 100644 index 0000000..d02c1ac --- /dev/null +++ b/248.out @@ -0,0 +1,2 @@ +QA output created by 248 +pwrite 1 bytes from 2 to 3 diff --git a/group b/group index 0f94dd9..0b4f514 100644 --- a/group +++ b/group @@ -361,3 +361,4 @@ deprecated 245 auto quick dir 246 auto quick rw 247 auto quick rw +248 other diff --git a/src/Makefile b/src/Makefile index b827bd0..47d7334 100644 --- a/src/Makefile +++ b/src/Makefile @@ -17,7 +17,7 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ preallo_rw_pattern_writer ftrunc trunc fs_perms testx looptest \ locktest unwritten_mmap bulkstat_unlink_test t_stripealign \ bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable \ - stale_handle + stale_handle pwrite_mmap_blocked SUBDIRS = diff --git a/src/pwrite_mmap_blocked.c b/src/pwrite_mmap_blocked.c new file mode 100644 index 0000000..40d7f7b --- /dev/null +++ b/src/pwrite_mmap_blocked.c @@ -0,0 +1,63 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +char *progname; +loff_t size; +int fd; +char *filename="./test_file"; +void *mapped_mem; + + +int main(int argc, char *argv[]) +{ + int ret; + + progname = argv[0]; + size = 5; + fd = open(argv[1], O_RDWR|O_TRUNC|O_CREAT, 0666); + if (fd < 0) { + fprintf(stderr, "%s: Cannot open `%s': %s\n", + progname, filename, strerror(errno)); + exit(1); + } + + char *cc = "01234"; + if ((ret = pwrite(fd, (const char *)cc, + size, 0)) != size) { + fprintf(stderr, "%s: pwrite returned %d\n", + __FUNCTION__, ret); + perror("pwrite"); + exit(1); + } + + mapped_mem = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); + if (mapped_mem == MAP_FAILED) { + perror("mmap"); + exit(1); + } + loff_t amount = 1; + loff_t from = 2; + loff_t to = 3; + printf("pwrite %Ld bytes from %Ld to %Ld\n", amount, from, to); + if ((ret = pwrite(fd, (char *)mapped_mem + from, amount, to)) != amount) { + printf("%s: pwrite returned %d, not %Ld\n", + __FUNCTION__, ret, amount); + if (errno == EFAULT) { + printf("pwrite: EFAULT\n"); + } else if (ret < 0) { + perror("pwrite"); + exit(1); + } + } + munmap(mapped_mem,0); + close(fd); + exit(0); +} -- 1.6.2.2 From branto@redhat.com Mon Dec 13 04:53:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBDAr6NO183464 for ; Mon, 13 Dec 2010 04:53:06 -0600 X-ASG-Debug-ID: 1292237697-0ae9027c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx3-phx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 002241440EDE for ; Mon, 13 Dec 2010 02:54:57 -0800 (PST) Received: from mx3-phx2.redhat.com (mx3-phx2.redhat.com [209.132.183.24]) by cuda.sgi.com with ESMTP id 6vXbj1buagX6SEpV for ; Mon, 13 Dec 2010 02:54:57 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation Received: from mail01.corp.redhat.com (zmail01.collab.prod.int.phx2.redhat.com [10.5.5.41]) by mx3-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id oBDAsogd004558; Mon, 13 Dec 2010 05:54:50 -0500 Date: Mon, 13 Dec 2010 05:54:50 -0500 (EST) From: Boris Ranto To: Christoph Hellwig Cc: xfs@oss.sgi.com Message-ID: <36980345.1112451292237690337.JavaMail.root@zmail01.collab.prod.int.phx2.redhat.com> In-Reply-To: <1924340607.1111921292237137384.JavaMail.root@zmail01.collab.prod.int.phx2.redhat.com> X-ASG-Orig-Subj: Re: xfstests: ignore absolute address in filename in test case 237 Subject: Re: xfstests: ignore absolute address in filename in test case 237 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.5.5.71] X-Mailer: Zimbra 5.0.21_GA_3150.RHEL4_64 (ZimbraWebClient - FF3.0 (Linux)/5.0.21_GA_3150.RHEL4_64) X-Barracuda-Connect: mx3-phx2.redhat.com[209.132.183.24] X-Barracuda-Start-Time: 1292237698 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean ----- "Christoph Hellwig" wrote: > I don't mind the patch, but what version of getfacl would produce an > absolute filename? The behavior was found in acl-2.2.39-6.el5: * setfacl -m 'user:test:rw' file setfacl: /mnt/tests/kernel/filesystems/xfs/xfstests/file: Operation not permitted * setfacl --version setfacl 2.2.39 From BATV+8211b813bb02214bd551+2668+infradead.org+hch@bombadil.srs.infradead.org Mon Dec 13 10:18:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBDGI42q219134 for ; Mon, 13 Dec 2010 10:18:07 -0600 X-ASG-Debug-ID: 1292257196-34e302440000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id ECA4D143FC59 for ; Mon, 13 Dec 2010 08:19:56 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id uY3KqALAYRz90O2J for ; Mon, 13 Dec 2010 08:19:56 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PSB7y-00069o-Ay; Mon, 13 Dec 2010 16:19:54 +0000 Date: Mon, 13 Dec 2010 11:19:54 -0500 From: Christoph Hellwig To: "Zhong, Xin" Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfstests: pwrite hang when writing from mmaped buffer of the same page Subject: Re: [PATCH] xfstests: pwrite hang when writing from mmaped buffer of the same page Message-ID: <20101213161954.GA23509@infradead.org> References: <1292225083-17713-1-git-send-email-xin.zhong@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292225083-17713-1-git-send-email-xin.zhong@intel.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[18.85.46.34] X-Barracuda-Start-Time: 1292257196 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 13, 2010 at 03:24:43PM +0800, Zhong, Xin wrote: > The problem is found in meego testing: > http://bugs.meego.com/show_bug.cgi?id=6672 > Only btrfs has this problem so far. Other linux fs works well. Thanks, the patch pretty good. A few think I'd like to improved, though: > +_cleanup() > +{ > + cd / > + rm -f $tmp.* > +} > + > +# get standard environment, filters and checks > +. ./common.rc > +. ./common.filter > + > +# real QA test starts here > + > +# Modify as appropriate. > +_supported_fs generic > +_supported_os Linux > + > +TESTFILE=$TEST_DIR/test_file > +TEST_PROG=$here/src/pwrite_mmap_blocked > + > +$TEST_PROG $TESTFILE Please remove the test file after the test completed. This is best done in the cleanup function, as it's called both for sucessfull and error exits. > +QA output created by 248 > +pwrite 1 bytes from 2 to 3 > diff --git a/group b/group > index 0f94dd9..0b4f514 100644 > --- a/group > +++ b/group > @@ -361,3 +361,4 @@ deprecated > 245 auto quick dir > 246 auto quick rw > 247 auto quick rw > +248 other The test should also be part of the quick and rw groups. > diff --git a/src/pwrite_mmap_blocked.c b/src/pwrite_mmap_blocked.c > new file mode 100644 > index 0000000..40d7f7b > --- /dev/null > +++ b/src/pwrite_mmap_blocked.c > @@ -0,0 +1,63 @@ > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include Please add a license header to the program, preferably GPLv2 or GPLv2 or later. > + > +char *progname; > +loff_t size; > +int fd; > +char *filename="./test_file"; The program is actually using the file name passed as the first argument, and you're only using this variable for the error message, please just remove it. From Ivan.Novick@emc.com Mon Dec 13 16:23:14 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBDMNEI2016164 for ; Mon, 13 Dec 2010 16:23:14 -0600 X-ASG-Debug-ID: 1292279105-0f8c038e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mexforward.lss.emc.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D66CC1CBFEDB for ; Mon, 13 Dec 2010 14:25:05 -0800 (PST) Received: from mexforward.lss.emc.com (mexforward.lss.emc.com [128.222.32.20]) by cuda.sgi.com with ESMTP id W8nYyGKEz6ASiEl5 for ; Mon, 13 Dec 2010 14:25:05 -0800 (PST) Received: from hop04-l1d11-si04.isus.emc.com (HOP04-L1D11-SI04.isus.emc.com [10.254.111.24]) by mexforward.lss.emc.com (Switch-3.4.3/Switch-3.4.3) with ESMTP id oBDMP4pG016177 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 13 Dec 2010 17:25:04 -0500 Received: from mailhub.lss.emc.com (mailhub.lss.emc.com [10.254.221.145]) by hop04-l1d11-si04.isus.emc.com (RSA Interceptor) for ; Mon, 13 Dec 2010 17:25:01 -0500 Received: from mxhub19.corp.emc.com (mxhub19.corp.emc.com [10.254.93.48]) by mailhub.lss.emc.com (Switch-3.4.3/Switch-3.4.3) with ESMTP id oBDMOmnl028856 for ; Mon, 13 Dec 2010 17:24:48 -0500 Received: from mx06a.corp.emc.com ([169.254.1.172]) by mxhub19.corp.emc.com ([10.254.93.48]) with mapi; Mon, 13 Dec 2010 17:24:43 -0500 From: To: Date: Mon, 13 Dec 2010 17:24:46 -0500 X-ASG-Orig-Subj: inode64 mount option added after data exists Subject: inode64 mount option added after data exists Thread-Topic: inode64 mount option added after data exists Thread-Index: AcubFIzRra7BASioT/+SH5YMX9dqjA== Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: user-agent: Microsoft-MacOutlook/14.0.0.100825 acceptlanguage: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-EMM-MHVC: 1 X-Barracuda-Connect: mexforward.lss.emc.com[128.222.32.20] X-Barracuda-Start-Time: 1292279105 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49345 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi all, Quick question about the inode64 mount option. Is it safe to add this mount option to a file system that was already creat= ed and wrote lots of data without it. Will it still work as intended in this case (use 64 bit inodes)? Cheers, Ivan From xin.zhong@intel.com Mon Dec 13 20:58:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_62 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBE2wXEt059301 for ; Mon, 13 Dec 2010 20:58:33 -0600 X-ASG-Debug-ID: 1292295625-2677013a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mga02.intel.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9311C1E6A86 for ; Mon, 13 Dec 2010 19:00:25 -0800 (PST) Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by cuda.sgi.com with ESMTP id v33E99Zgkn7WIKjK for ; Mon, 13 Dec 2010 19:00:25 -0800 (PST) Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga101.jf.intel.com with ESMTP; 13 Dec 2010 19:00:11 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.59,339,1288594800"; d="scan'208";a="686848572" Received: from zyh-fedora.bj.intel.com (HELO localhost.localdomain) ([10.238.135.222]) by orsmga001.jf.intel.com with ESMTP; 13 Dec 2010 19:00:10 -0800 From: "Zhong, Xin" To: xfs@oss.sgi.com Cc: xin.zhong@intel.com X-ASG-Orig-Subj: [PATCH v2] xfstests: pwrite hang when writing from mmaped buffer of the same page Subject: [PATCH v2] xfstests: pwrite hang when writing from mmaped buffer of the same page Date: Tue, 14 Dec 2010 11:00:52 +0800 Message-Id: <1292295652-9508-1-git-send-email-xin.zhong@intel.com> X-Mailer: git-send-email 1.6.2.2 X-Barracuda-Connect: mga02.intel.com[134.134.136.20] X-Barracuda-Start-Time: 1292295625 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49363 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean The problem is found in meego testing on btrfs: http://bugs.meego.com/show_bug.cgi?id=6672 Reviewed-by: Hellwig, Christoph Signed-off-by: Zhong, Xin --- 248 | 58 +++++++++++++++++++++++++++++++++ 248.out | 2 + group | 1 + src/Makefile | 2 +- src/pwrite_mmap_blocked.c | 78 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 140 insertions(+), 1 deletions(-) create mode 100755 248 create mode 100644 248.out create mode 100644 src/pwrite_mmap_blocked.c diff --git a/248 b/248 new file mode 100755 index 0000000..a4664d9 --- /dev/null +++ b/248 @@ -0,0 +1,58 @@ +#! /bin/bash +# FS QA Test No. 248 +# +# Test for pwrite hang problem when writing from mmaped buffer of the same page +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 YOUR NAME HERE. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# +# creator +owner=xin.zhong@intel.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here + +# Modify as appropriate. +_supported_fs generic +_supported_os Linux + +TESTFILE=$TEST_DIR/test_file +TEST_PROG=$here/src/pwrite_mmap_blocked + +$TEST_PROG $TESTFILE +rm -f $TESTFILE + +# success, all done +status=0 +exit diff --git a/248.out b/248.out new file mode 100644 index 0000000..d02c1ac --- /dev/null +++ b/248.out @@ -0,0 +1,2 @@ +QA output created by 248 +pwrite 1 bytes from 2 to 3 diff --git a/group b/group index 0f94dd9..ddda26c 100644 --- a/group +++ b/group @@ -361,3 +361,4 @@ deprecated 245 auto quick dir 246 auto quick rw 247 auto quick rw +248 other quick rw diff --git a/src/Makefile b/src/Makefile index b827bd0..47d7334 100644 --- a/src/Makefile +++ b/src/Makefile @@ -17,7 +17,7 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ preallo_rw_pattern_writer ftrunc trunc fs_perms testx looptest \ locktest unwritten_mmap bulkstat_unlink_test t_stripealign \ bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable \ - stale_handle + stale_handle pwrite_mmap_blocked SUBDIRS = diff --git a/src/pwrite_mmap_blocked.c b/src/pwrite_mmap_blocked.c new file mode 100644 index 0000000..288a62f --- /dev/null +++ b/src/pwrite_mmap_blocked.c @@ -0,0 +1,78 @@ +/* Copyright (c) 2010 Intel Corporation + * + * 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; version 2 of the License + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 59 + * Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +char *progname; +loff_t size; +int fd; +void *mapped_mem; + + +int main(int argc, char *argv[]) +{ + int ret; + + progname = argv[0]; + size = 5; + fd = open(argv[1], O_RDWR|O_TRUNC|O_CREAT, 0666); + if (fd < 0) { + fprintf(stderr, "%s: Cannot open `%s': %s\n", + progname, argv[1], strerror(errno)); + exit(1); + } + + char *cc = "01234"; + if ((ret = pwrite(fd, (const char *)cc, + size, 0)) != size) { + fprintf(stderr, "%s: pwrite returned %d\n", + __FUNCTION__, ret); + perror("pwrite"); + exit(1); + } + + mapped_mem = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); + if (mapped_mem == MAP_FAILED) { + perror("mmap"); + exit(1); + } + loff_t amount = 1; + loff_t from = 2; + loff_t to = 3; + printf("pwrite %Ld bytes from %Ld to %Ld\n", amount, from, to); + if ((ret = pwrite(fd, (char *)mapped_mem + from, amount, to)) != amount) { + printf("%s: pwrite returned %d, not %Ld\n", + __FUNCTION__, ret, amount); + if (errno == EFAULT) { + printf("pwrite: EFAULT\n"); + } else if (ret < 0) { + perror("pwrite"); + exit(1); + } + } + munmap(mapped_mem,0); + close(fd); + exit(0); +} -- 1.6.2.2 From SRS0+nJ8m+17+fromorbit.com=david@internode.on.net Mon Dec 13 22:41:14 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_62 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBE4fDE9068971 for ; Mon, 13 Dec 2010 22:41:14 -0600 X-ASG-Debug-ID: 1292301782-77a2019d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CAC18143C89D for ; Mon, 13 Dec 2010 20:43:02 -0800 (PST) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id Q4AgH2kcdYJCHROt for ; Mon, 13 Dec 2010 20:43:02 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 38387949-1927428 for multiple; Tue, 14 Dec 2010 15:13:01 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PSMj5-0004FK-Gk; Tue, 14 Dec 2010 15:42:59 +1100 Date: Tue, 14 Dec 2010 15:42:59 +1100 From: Dave Chinner To: "Zhong, Xin" Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH v2] xfstests: pwrite hang when writing from mmaped buffer of the same page Subject: Re: [PATCH v2] xfstests: pwrite hang when writing from mmaped buffer of the same page Message-ID: <20101214044259.GA16267@dastard> References: <1292295652-9508-1-git-send-email-xin.zhong@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292295652-9508-1-git-send-email-xin.zhong@intel.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1292301784 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49370 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 14, 2010 at 11:00:52AM +0800, Zhong, Xin wrote: > The problem is found in meego testing on btrfs: > http://bugs.meego.com/show_bug.cgi?id=6672 > > Reviewed-by: Hellwig, Christoph > Signed-off-by: Zhong, Xin > --- > 248 | 58 +++++++++++++++++++++++++++++++++ > 248.out | 2 + > group | 1 + > src/Makefile | 2 +- > src/pwrite_mmap_blocked.c | 78 +++++++++++++++++++++++++++++++++++++++++++++ > 5 files changed, 140 insertions(+), 1 deletions(-) > create mode 100755 248 > create mode 100644 248.out > create mode 100644 src/pwrite_mmap_blocked.c > > diff --git a/248 b/248 > new file mode 100755 > index 0000000..a4664d9 > --- /dev/null > +++ b/248 > @@ -0,0 +1,58 @@ > +#! /bin/bash > +# FS QA Test No. 248 > +# > +# Test for pwrite hang problem when writing from mmaped buffer of the same page > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2010 YOUR NAME HERE. All Rights Reserved. ^^^^^^^^^^^^^^ Needs updating, I think. ;) While I'm here, a two minute review... .... > +_cleanup() > +{ > + cd / > + rm -f $tmp.* > +} > + > +# get standard environment, filters and checks > +. ./common.rc > +. ./common.filter > + > +# real QA test starts here > + > +# Modify as appropriate. > +_supported_fs generic > +_supported_os Linux > + > +TESTFILE=$TEST_DIR/test_file > +TEST_PROG=$here/src/pwrite_mmap_blocked > + > +$TEST_PROG $TESTFILE > +rm -f $TESTFILE This rm should be in the _cleanup() function so that it is removed even when the test is aborted. ..... > diff --git a/group b/group > index 0f94dd9..ddda26c 100644 > --- a/group > +++ b/group > @@ -361,3 +361,4 @@ deprecated > 245 auto quick dir > 246 auto quick rw > 247 auto quick rw > +248 other quick rw Why not the auto group? > +char *progname; > +loff_t size; > +int fd; > +void *mapped_mem; None of these need to be global. > + > + > +int main(int argc, char *argv[]) > +{ > + int ret; > + > + progname = argv[0]; > + size = 5; > + fd = open(argv[1], O_RDWR|O_TRUNC|O_CREAT, 0666); > + if (fd < 0) { > + fprintf(stderr, "%s: Cannot open `%s': %s\n", > + progname, argv[1], strerror(errno)); > + exit(1); > + } > + > + char *cc = "01234"; Don't mix declarations in the the code. Better would be: int ret; char *cc = "01234"; progname = argv[0]; size = strlen(cc); .... > + if ((ret = pwrite(fd, (const char *)cc, > + size, 0)) != size) { ret = pwrite(fd, cc, size, 0); if (ret != size) { > + fprintf(stderr, "%s: pwrite returned %d\n", > + __FUNCTION__, ret); > + perror("pwrite"); > + exit(1); > + } No need for both fprintf and perror calls. > + > + mapped_mem = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); > + if (mapped_mem == MAP_FAILED) { > + perror("mmap"); > + exit(1); > + } > + loff_t amount = 1; > + loff_t from = 2; > + loff_t to = 3; > + printf("pwrite %Ld bytes from %Ld to %Ld\n", amount, from, to); > + if ((ret = pwrite(fd, (char *)mapped_mem + from, amount, to)) != amount) { ret = pwrite(fd, (char *)mapped_mem + from, amount, to)); if (ret != amount) { > + printf("%s: pwrite returned %d, not %Ld\n", > + __FUNCTION__, ret, amount); > + if (errno == EFAULT) { > + printf("pwrite: EFAULT\n"); > + } else if (ret < 0) { > + perror("pwrite"); > + exit(1); > + } A single call to perror() will be sufficient here... > + } > + munmap(mapped_mem,0); > + close(fd); > + exit(0); > +} Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+nJ8m+17+fromorbit.com=david@internode.on.net Mon Dec 13 22:42:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBE4g82k069194 for ; Mon, 13 Dec 2010 22:42:08 -0600 X-ASG-Debug-ID: 1292301837-0a3302bc0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4BB3D1CC0DF6 for ; Mon, 13 Dec 2010 20:43:58 -0800 (PST) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id qdrixxL0E26J8DBR for ; Mon, 13 Dec 2010 20:43:58 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 38388022-1927428 for multiple; Tue, 14 Dec 2010 15:13:57 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PSMjz-0004FT-VM; Tue, 14 Dec 2010 15:43:56 +1100 Date: Tue, 14 Dec 2010 15:43:55 +1100 From: Dave Chinner To: Ivan.Novick@emc.com Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: inode64 mount option added after data exists Subject: Re: inode64 mount option added after data exists Message-ID: <20101214044355.GB16267@dastard> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1292301840 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0006 1.0000 -2.0169 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49369 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 13, 2010 at 05:24:46PM -0500, Ivan.Novick@emc.com wrote: > Hi all, > > Quick question about the inode64 mount option. > > Is it safe to add this mount option to a file system that was > already created and wrote lots of data without it. Yes. > Will it still work as intended in this case (use 64 bit inodes)? Yes, for newly created inodes and data. Cheers, Dave. -- Dave Chinner david@fromorbit.com From xin.zhong@intel.com Mon Dec 13 23:17:46 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_62 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBE5Hkhm073295 for ; Mon, 13 Dec 2010 23:17:46 -0600 X-ASG-Debug-ID: 1292303977-275b00b10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mga14.intel.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1974C1E7FBE for ; Mon, 13 Dec 2010 21:19:37 -0800 (PST) Received: from mga14.intel.com (mga14.intel.com [143.182.124.37]) by cuda.sgi.com with ESMTP id NBDS0b5sPRgWncTV for ; Mon, 13 Dec 2010 21:19:37 -0800 (PST) Received: from azsmga001.ch.intel.com ([10.2.17.19]) by azsmga102.ch.intel.com with ESMTP; 13 Dec 2010 21:19:36 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.59,340,1288594800"; d="scan'208";a="361304205" Received: from zyh-fedora.bj.intel.com (HELO localhost.localdomain) ([10.238.135.222]) by azsmga001.ch.intel.com with ESMTP; 13 Dec 2010 21:19:35 -0800 From: "Zhong, Xin" To: xfs@oss.sgi.com Cc: xin.zhong@intel.com X-ASG-Orig-Subj: [PATCH v3] xfstests: pwrite hang when writing from mmaped buffer of the same page Subject: [PATCH v3] xfstests: pwrite hang when writing from mmaped buffer of the same page Date: Tue, 14 Dec 2010 13:20:18 +0800 Message-Id: <1292304018-10827-1-git-send-email-xin.zhong@intel.com> X-Mailer: git-send-email 1.6.2.2 X-Barracuda-Connect: mga14.intel.com[143.182.124.37] X-Barracuda-Start-Time: 1292303978 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49371 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean The problem is found in meego testing on btrfs: http://bugs.meego.com/show_bug.cgi?id=6672 Reviewed-by: Hellwig, Christoph and Chinner, Dave Signed-off-by: Zhong, Xin --- 248 | 57 ++++++++++++++++++++++++++++++++++++ 248.out | 2 + group | 1 + src/Makefile | 2 +- src/pwrite_mmap_blocked.c | 71 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 132 insertions(+), 1 deletions(-) create mode 100644 248 create mode 100644 248.out create mode 100644 src/pwrite_mmap_blocked.c diff --git a/248 b/248 new file mode 100644 index 0000000..ea4313f --- /dev/null +++ b/248 @@ -0,0 +1,57 @@ +#! /bin/bash +# FS QA Test No. 248 +# +# Test for pwrite hang problem when writing from mmaped buffer of the same page +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 YOUR NAME HERE. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# +# creator +owner=xin.zhong@intel.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* $TESTFILE +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here + +# Modify as appropriate. +_supported_fs generic +_supported_os Linux + +TESTFILE=$TEST_DIR/test_file +TEST_PROG=$here/src/pwrite_mmap_blocked + +$TEST_PROG $TESTFILE + +# success, all done +status=0 +exit diff --git a/248.out b/248.out new file mode 100644 index 0000000..d02c1ac --- /dev/null +++ b/248.out @@ -0,0 +1,2 @@ +QA output created by 248 +pwrite 1 bytes from 2 to 3 diff --git a/group b/group index 0f94dd9..a40c98f 100644 --- a/group +++ b/group @@ -361,3 +361,4 @@ deprecated 245 auto quick dir 246 auto quick rw 247 auto quick rw +248 auto quick rw diff --git a/src/Makefile b/src/Makefile index b827bd0..47d7334 100644 --- a/src/Makefile +++ b/src/Makefile @@ -17,7 +17,7 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ preallo_rw_pattern_writer ftrunc trunc fs_perms testx looptest \ locktest unwritten_mmap bulkstat_unlink_test t_stripealign \ bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable \ - stale_handle + stale_handle pwrite_mmap_blocked SUBDIRS = diff --git a/src/pwrite_mmap_blocked.c b/src/pwrite_mmap_blocked.c new file mode 100644 index 0000000..6e7d4e7 --- /dev/null +++ b/src/pwrite_mmap_blocked.c @@ -0,0 +1,71 @@ +/* Copyright (c) 2010 Intel Corporation + * + * 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; version 2 of the License + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 59 + * Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + + +int main(int argc, char *argv[]) +{ + int ret; + char *cc = "01234"; + char *progname; + loff_t size; + int fd; + void *mapped_mem; + + progname = argv[0]; + size = 5; + fd = open(argv[1], O_RDWR|O_TRUNC|O_CREAT, 0666); + if (fd < 0) { + fprintf(stderr, "%s: Cannot open `%s': %s\n", + progname, argv[1], strerror(errno)); + exit(1); + } + + if ((ret = pwrite(fd, (const char *)cc, + size, 0)) != size) { + perror("pwrite"); + exit(1); + } + + mapped_mem = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); + if (mapped_mem == MAP_FAILED) { + perror("mmap"); + exit(1); + } + loff_t amount = 1; + loff_t from = 2; + loff_t to = 3; + printf("pwrite %Ld bytes from %Ld to %Ld\n", amount, from, to); + ret = pwrite(fd, (char *)mapped_mem + from, amount, to); + if (ret != amount) { + perror("pwrite"); + exit(1); + } + munmap(mapped_mem,0); + close(fd); + exit(0); +} -- 1.6.2.2 From michael.monnerie@is.it-management.at Tue Dec 14 01:18:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBE7ICEv086345 for ; Tue, 14 Dec 2010 01:18:12 -0600 X-ASG-Debug-ID: 1292311201-6a13013e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 30438144882E for ; Mon, 13 Dec 2010 23:20:02 -0800 (PST) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id d634rHbVtjEIFqqM for ; Mon, 13 Dec 2010 23:20:02 -0800 (PST) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id EA4EA144; Tue, 14 Dec 2010 08:19:59 +0100 (CET) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 47E0C401C2E; Tue, 14 Dec 2010 08:19:59 +0100 (CET) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: inode64 mount option added after data exists Subject: Re: inode64 mount option added after data exists Date: Tue, 14 Dec 2010 08:19:57 +0100 User-Agent: KMail/1.13.5 (Linux/2.6.34.7-0.5-desktop; KDE/4.4.4; x86_64; ; ) Cc: Dave Chinner , Ivan.Novick@emc.com References: <20101214044355.GB16267@dastard> In-Reply-To: <20101214044355.GB16267@dastard> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart3245705.9MkWnFbgBt"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201012140819.58723@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1292311203 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49380 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart3245705.9MkWnFbgBt Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Dienstag, 14. Dezember 2010 Dave Chinner wrote: > > Will it still work as intended in this case (use 64 bit inodes)? >=20 > Yes, for newly created inodes and data. When you have the existing files/dirs, would it help to take an existing=20 dir "$path/old", create a new dir "$path/new", and then do cd $path/old find . -type f -exec "ln {} ../new/" \; rm * mv ../new/* . to get the inodes created in the new space? This could be necessary in=20 case the first 1TB is full, and no more inodes can be created. I'm just=20 not sure if that would be enough. =2D-=20 mit freundlichen Gr=FCssen, Michael Monnerie, Ing. BSc it-management Internet Services: Prot=E9ger http://proteger.at [gesprochen: Prot-e-schee] Tel: +43 660 / 415 6531 // ****** Radiointerview zum Thema Spam ****** // http://www.it-podcast.at/archiv.html#podcast-100716 //=20 // Haus zu verkaufen: http://zmi.at/langegg/ --nextPart3245705.9MkWnFbgBt Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.15 (GNU/Linux) iEYEABECAAYFAk0HGp4ACgkQzhSR9xwSCbShuQCg8i4/s4sdSnbGbJZczZXOnvPO 7YYAoM31N6wvXMpkULJSW4sM3bUKQdfa =i7uX -----END PGP SIGNATURE----- --nextPart3245705.9MkWnFbgBt-- From anderegghvsz@yahoo.es Tue Dec 14 03:58:02 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.3 required=5.0 tests=BAYES_99,FREEMAIL_FROM, MIME_8BIT_HEADER,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBE9w2WL103137 for ; Tue, 14 Dec 2010 03:58:02 -0600 X-ASG-Debug-ID: 1292320792-3d6c01f60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from nm19-vm0.bullet.mail.ukl.yahoo.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id B24331CC1746 for ; Tue, 14 Dec 2010 01:59:53 -0800 (PST) Received: from nm19-vm0.bullet.mail.ukl.yahoo.com (nm19-vm0.bullet.mail.ukl.yahoo.com [217.146.183.113]) by cuda.sgi.com with SMTP id S8pJLUaIKB5S8ihM for ; Tue, 14 Dec 2010 01:59:53 -0800 (PST) Received: from [217.146.183.212] by nm19.bullet.mail.ukl.yahoo.com with NNFMP; 14 Dec 2010 09:59:52 -0000 Received: from [217.146.183.63] by tm5.bullet.mail.ukl.yahoo.com with NNFMP; 14 Dec 2010 09:59:52 -0000 Received: from [127.0.0.1] by omp1032.mail.ukl.yahoo.com with NNFMP; 14 Dec 2010 09:59:52 -0000 X-Yahoo-Newman-Id: 236109.98043.bm@omp1032.mail.ukl.yahoo.com Received: (qmail 57162 invoked from network); 14 Dec 2010 09:59:52 -0000 DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.es; h=DKIM-Signature:Received:X-Yahoo-SMTP:X-YMail-OSG:X-Yahoo-Newman-Property:Date:From:To:Subject:Message-ID:X-Mailer:MIME-Version:Content-Type:Content-Transfer-Encoding; b=B6ImltJaB4jzZnVPgC+rP38IsRCcA7p6CrPa7Yj/L0TQil4In52m5kyKkFKsRToDpzv+uGkY95I82J4CFa5Qxt6EWxLbX5jn3LbNc3pTmOanU1wUkI+Jhl9WSNb/tSj0aWhmhXf4lR7hnmKNRfUCuWJuRobbAsARVa+c1ZY3a1I= ; DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.es; s=s1024; t=1292320792; bh=eL1OsQBQgbhq4S6cvC9wU2UqlI60x780k2EWUneXSGg=; h=Received:X-Yahoo-SMTP:X-YMail-OSG:X-Yahoo-Newman-Property:Date:From:To:Subject:Message-ID:X-Mailer:MIME-Version:Content-Type:Content-Transfer-Encoding; b=3u4fwYNcTt/3kwZ7sfGHly0sht0IxXMoUCxs3D7fXmlF+6Yxla8l0EBQHsAuwMp9G8VSnj5kw7aGE7ZBedyIVq7ejS/JjCP+4mBakUYyHcqTiDdf+bz5hyF1CoRDo9IN1qkyavu3SDsFjJvZTi4zq8clNVjBCuJCq9pjp8REFBk= Received: from jqyhq (anderegghvsz@58.251.180.109 with login) by smtp120.mail.ukl.yahoo.com with SMTP; 14 Dec 2010 09:59:49 +0000 GMT X-Yahoo-SMTP: _zpcXzuswBAgS759FhxmB_viIOimAB7sVg-- X-YMail-OSG: 3uGrO10VM1n7YKDCP4dODNfDc5Qj4Aw9CDGMBNJ0WiRFX2G WGkh.fs37oW7uc9.f1DJrWcxhYjczsd7jJ4UKhfLUIAdLOcswq1pffCWnu1r u6Xk.o6_8DVF8992QvXJr2yPcO525Czw8WL9.Oe7iwGUO16ZM.abQKfQVSYK cUZBpOcEmNjgM4hId0rJNuJ6SgBZodb1ECPe0zjIdHH0GlhZ0KvaEArmCDYI 2qFivwRSoU__D0FcdpFuhmF2c1oa3EQeoXeBcYC1WMt5by6VRbgbTe3MAclq rSA-- X-Yahoo-Newman-Property: ymail-3 Date: Tue, 14 Dec 2010 17:59:49 +0800 From: "anderegghvsz@yahoo.es" To: "xfs" X-ASG-Orig-Subj: =?GB2312?B?x+uy6crV0ru34tPKvP4hYW5kZXJlZ2dodnN6QHlhaG9vLmVzcXs1LTIwfVZ7?= =?GB2312?B?NS0yMH0=?= Subject: =?GB2312?B?x+uy6crV0ru34tPKvP4hYW5kZXJlZ2dodnN6QHlhaG9vLmVzcXs1LTIwfVZ7?= =?GB2312?B?NS0yMH0=?= Message-ID: <201012141759491674827@yahoo.es> X-Mailer: Foxmail 6, 10, 201, 20 [cn] MIME-Version: 1.0 Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 X-Barracuda-Connect: nm19-vm0.bullet.mail.ukl.yahoo.com[217.146.183.113] X-Barracuda-Start-Time: 1292320793 X-Barracuda-Bayes: INNOCENT GLOBAL 0.3435 1.0000 -0.1761 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.55 X-Barracuda-Spam-Status: No, SCORE=0.55 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED, MIME_BASE64_TEXT, PR0N_SUBJECT, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49391 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.52 MIME_BASE64_TEXT RAW: Message text disguised using base64 encoding 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean xPq6w6Oh16jStbmp06bUrbOn0czLv8Xk1sa498Dgw+LLsM/j0cwuDQoNCiDW0LuqoaLcvcjYu8ah osvV0cyhorTz0KHQ3MOooaK7xrrXwqWhotK7vsXSu8H5oaK2rLPmz8Sy3bXIo6ENCg0KIMGqz7VR UaO6NjQyNzE0MzYyICAgus7J+jEzNjkyMjI3NzYyIA0KDQogsb7JzNDQz+PRzLa8yse+q7fCz7XB 0C6w/Newus3V5sa3sfDO3sG90fmjqNPQt8DOscLro6kgv9q40LS/1f0uOTUltrzKx9Xm0czLvy4N Cg0KINX9ueazp7zSvNO5pNbG1/cuob6+q7fCob8gs6e1xNKqx/O63NHPuPEu0czStsirsr/M2Mri vNO5pNPr1sbX99Xm1f2077W9wcu437Hq17y1xNKqx/Mho6jF+sG/vNu48cHt0umjqb270tfB47Wj t+fP1aOhDQoNCiDKx9fUs+ks1dC0/SzLzcDxLMX6t6IswePK2yy5q8u+LL7GteosINPpwNazocv5 tcjK19GhLCANCg0KILzbuPG4/LrPwO0sv9rOtrj8tL/V/SEgvPu79bi2v+4sx+u3xdDEubrC8iEg s7m118jDxPrO3rrzucvWrtPHIQ0KDQog0tShsLPP0MUuzvHKtS6439CnLrmy066hsc6q19rWvNPr xPqzpMbaus/X9ywgtPLIxcfrxOPBwr3iDQoNCiAgICAgICAgeWFob28uZXMoMy05KXlhaG9vLmVz KDMtOSk= From branto@redhat.com Tue Dec 14 08:51:53 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBEEprjV131851 for ; Tue, 14 Dec 2010 08:51:53 -0600 X-ASG-Debug-ID: 1292338424-4d0201cc0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E96A51E9572 for ; Tue, 14 Dec 2010 06:53:45 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id iFKNoMc2gLc2ftqd for ; Tue, 14 Dec 2010 06:53:45 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation 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.13.8/8.13.8) with ESMTP id oBEErdJR021196 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 14 Dec 2010 09:53:39 -0500 Received: from [10.34.26.208] (dhcp-26-208.brq.redhat.com [10.34.26.208]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id oBEErb0c016012; Tue, 14 Dec 2010 09:53:38 -0500 X-ASG-Orig-Subj: Re: xfstests: fix 108 through config mechanism Subject: Re: xfstests: fix 108 through config mechanism From: Boris Ranto To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20101210143717.GB1415@infradead.org> References: <1291905612.3196.49.camel@dhcp-31-190.brq.redhat.com> <20101210143717.GB1415@infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Tue, 14 Dec 2010 15:53:37 +0100 Message-ID: <1292338417.3296.57.camel@dhcp-31-190.brq.redhat.com> Mime-Version: 1.0 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: 1292338425 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, 2010-12-10 at 09:37 -0500, Christoph Hellwig wrote: > I don't rally like the per-test option. What about adding a > _filter_xfs_quota helper that uses sed to output a canonical > number of whitespaces? > I didn't like it much either but I found it quite easy to implement with quite high probability of future usage. I found the following modification sufficient although I'm not sure I put the _filter_spaces in right place (I'd say it's quite universal so it could find a usage in other cases): diff -urpN a/xfstests/108 b/xfstests/108 --- a/xfstests/108 2010-12-09 11:34:37.733245986 +0100 +++ b/xfstests/108 2010-12-14 14:50:16.813494309 +0100 @@ -72,9 +72,9 @@ test_accounting() for file in $SCRATCH_MNT/{buffer,direct,mmap}; do $here/src/lstat64 $file | head -3 | _filter_scratch done - xfs_quota -c "quota -hnb -$type $id" $QARGS | _filter_scratch - xfs_quota -c "quota -hni -$type $id" $QARGS | _filter_scratch - xfs_quota -c "quota -hnr -$type $id" $QARGS | _filter_scratch + xfs_quota -c "quota -hnb -$type $id" $QARGS | _filter_scratch | _filter_spaces + xfs_quota -c "quota -hni -$type $id" $QARGS | _filter_scratch | _filter_spaces + xfs_quota -c "quota -hnr -$type $id" $QARGS | _filter_scratch | _filter_spaces } export MOUNT_OPTIONS="-opquota" diff -urpN a/xfstests/108.out b/xfstests/108.out --- a/xfstests/108.out 2010-12-09 11:24:48.973251551 +0100 +++ b/xfstests/108.out 2010-12-14 15:01:33.640484268 +0100 @@ -32,11 +32,11 @@ projid = 3 Size: 16777216 Filetype: Regular File Mode: (0600/-rw-------) Uid: (1) Gid: (2) Disk quotas for User #1 (1) -Filesystem Blocks Quota Limit Warn/Time Mounted on -SCRATCH_DEV 48M 0 0 00 [------] SCRATCH_MNT +Filesystem Blocks Quota Limit Warn/Time Mounted on +SCRATCH_DEV 48M 0 0 00 [------] SCRATCH_MNT Disk quotas for User #1 (1) -Filesystem Files Quota Limit Warn/Time Mounted on -SCRATCH_DEV 3 0 0 00 [------] SCRATCH_MNT +Filesystem Files Quota Limit Warn/Time Mounted on +SCRATCH_DEV 3 0 0 00 [------] SCRATCH_MNT ### test group accounting @@ -64,11 +64,11 @@ projid = 3 Size: 16777216 Filetype: Regular File Mode: (0600/-rw-------) Uid: (1) Gid: (2) Disk quotas for Group #2 (2) -Filesystem Blocks Quota Limit Warn/Time Mounted on -SCRATCH_DEV 48M 0 0 00 [------] SCRATCH_MNT +Filesystem Blocks Quota Limit Warn/Time Mounted on +SCRATCH_DEV 48M 0 0 00 [------] SCRATCH_MNT Disk quotas for Group #2 (2) -Filesystem Files Quota Limit Warn/Time Mounted on -SCRATCH_DEV 3 0 0 00 [------] SCRATCH_MNT +Filesystem Files Quota Limit Warn/Time Mounted on +SCRATCH_DEV 3 0 0 00 [------] SCRATCH_MNT ### create files, setting up ownership (type=p) File: "SCRATCH_MNT/buffer" @@ -94,8 +94,8 @@ projid = 3 Size: 16777216 Filetype: Regular File Mode: (0600/-rw-------) Uid: (1) Gid: (2) Disk quotas for Project #3 (3) -Filesystem Blocks Quota Limit Warn/Time Mounted on -SCRATCH_DEV 48M 0 0 00 [------] SCRATCH_MNT +Filesystem Blocks Quota Limit Warn/Time Mounted on +SCRATCH_DEV 48M 0 0 00 [------] SCRATCH_MNT Disk quotas for Project #3 (3) -Filesystem Files Quota Limit Warn/Time Mounted on -SCRATCH_DEV 3 0 0 00 [------] SCRATCH_MNT +Filesystem Files Quota Limit Warn/Time Mounted on +SCRATCH_DEV 3 0 0 00 [------] SCRATCH_MNT diff -urpN a/xfstests/common.filter b/xfstests/common.filter --- a/xfstests/common.filter 2010-12-09 11:24:44.315240233 +0100 +++ b/xfstests/common.filter 2010-12-14 14:45:53.566228712 +0100 @@ -224,5 +224,10 @@ _filter_scratch() sed -e "s,$SCRATCH_DEV,SCRATCH_DEV,g" -e "s,$SCRATCH_MNT,SCRATCH_MNT,g" } +_filter_spaces() +{ + sed -e 's/ [ ]*/ /g' +} + # make sure this script returns success /bin/true Signed-off-by: Boris Ranto From BATV+a647025752f7ecdeadf6+2669+infradead.org+hch@bombadil.srs.infradead.org Tue Dec 14 13:15:27 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBEJFN88144415 for ; Tue, 14 Dec 2010 13:15:27 -0600 X-ASG-Debug-ID: 1292354236-4965015b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 855B51EAFC9 for ; Tue, 14 Dec 2010 11:17:16 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id xSF7CWWF6EolsNs9 for ; Tue, 14 Dec 2010 11:17:16 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PSaN7-0006tu-PQ; Tue, 14 Dec 2010 19:17:13 +0000 Date: Tue, 14 Dec 2010 14:17:13 -0500 From: Christoph Hellwig To: Boris Ranto Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfstests: fix 108 through config mechanism Subject: Re: xfstests: fix 108 through config mechanism Message-ID: <20101214191713.GA26513@infradead.org> References: <1291905612.3196.49.camel@dhcp-31-190.brq.redhat.com> <20101210143717.GB1415@infradead.org> <1292338417.3296.57.camel@dhcp-31-190.brq.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292338417.3296.57.camel@dhcp-31-190.brq.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[18.85.46.34] X-Barracuda-Start-Time: 1292354236 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 14, 2010 at 03:53:37PM +0100, Boris Ranto wrote: > I didn't like it much either but I found it quite easy to implement with quite high probability of future usage. > > I found the following modification sufficient although I'm not sure I put the _filter_spaces in right place (I'd say it's quite universal so it could find a usage in other cases): This patch looks good to me. Can you resent it in the correct format: - a descriptive subject - mail body containing a short explanation, than the signed-off-by line, then the actual patch. From BATV+a647025752f7ecdeadf6+2669+infradead.org+hch@bombadil.srs.infradead.org Tue Dec 14 13:16:53 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBEJGrFA144527 for ; Tue, 14 Dec 2010 13:16:53 -0600 X-ASG-Debug-ID: 1292354326-0bbd03d80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B86EF1EAFF0 for ; Tue, 14 Dec 2010 11:18:46 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id niaLNjU2BhOdrG12 for ; Tue, 14 Dec 2010 11:18:46 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PSaOc-0006v4-83; Tue, 14 Dec 2010 19:18:46 +0000 Date: Tue, 14 Dec 2010 14:18:46 -0500 From: Christoph Hellwig To: Boris Ranto Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfstests: ignore absolute address in filename in test case 237 Subject: Re: xfstests: ignore absolute address in filename in test case 237 Message-ID: <20101214191846.GB26513@infradead.org> References: <1924340607.1111921292237137384.JavaMail.root@zmail01.collab.prod.int.phx2.redhat.com> <36980345.1112451292237690337.JavaMail.root@zmail01.collab.prod.int.phx2.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <36980345.1112451292237690337.JavaMail.root@zmail01.collab.prod.int.phx2.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[18.85.46.34] X-Barracuda-Start-Time: 1292354326 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 13, 2010 at 05:54:50AM -0500, Boris Ranto wrote: > ----- "Christoph Hellwig" wrote: > > > I don't mind the patch, but what version of getfacl would produce an > > absolute filename? > > The behavior was found in acl-2.2.39-6.el5: > > * setfacl -m 'user:test:rw' file > setfacl: /mnt/tests/kernel/filesystems/xfs/xfstests/file: Operation not permitted > * setfacl --version > setfacl 2.2.39 Ok. I'll apply the patch. From paulmck@paulmck-ThinkPad-W500linux.vnet.ibm.com Tue Dec 14 14:21:17 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBEKLGVo147357 for ; Tue, 14 Dec 2010 14:21:16 -0600 X-ASG-Debug-ID: 1292358188-095803bf0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from e1.ny.us.ibm.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C40E4144EF8E for ; Tue, 14 Dec 2010 12:23:08 -0800 (PST) Received: from e1.ny.us.ibm.com (e1.ny.us.ibm.com [32.97.182.141]) by cuda.sgi.com with ESMTP id DlaVZqnloncf2kMC for ; Tue, 14 Dec 2010 12:23:08 -0800 (PST) Received: from d01dlp02.pok.ibm.com (d01dlp02.pok.ibm.com [9.56.224.85]) by e1.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id oBEKEPjT029168 for ; Tue, 14 Dec 2010 15:14:51 -0500 Received: from d01relay07.pok.ibm.com (d01relay07.pok.ibm.com [9.56.227.147]) by d01dlp02.pok.ibm.com (Postfix) with ESMTP id 298F04DE8047 for ; Tue, 14 Dec 2010 15:21:02 -0500 (EST) Received: from d01av04.pok.ibm.com (d01av04.pok.ibm.com [9.56.224.64]) by d01relay07.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id oBEKN6YC2138202 for ; Tue, 14 Dec 2010 15:23:06 -0500 Received: from d01av04.pok.ibm.com (loopback [127.0.0.1]) by d01av04.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id oBEKN5eU032025 for ; Tue, 14 Dec 2010 15:23:06 -0500 Received: from paulmck-ThinkPad-W500 (paulmck-ThinkPad-W500.beaverton.ibm.com [9.47.24.62]) by d01av04.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id oBEKN2g9031715; Tue, 14 Dec 2010 15:23:02 -0500 Received: by paulmck-ThinkPad-W500 (Postfix, from userid 1000) id 04AFA13F812; Tue, 14 Dec 2010 12:23:02 -0800 (PST) Date: Tue, 14 Dec 2010 12:23:01 -0800 From: "Paul E. McKenney" To: Dave Chinner Cc: xfs@oss.sgi.com, eric.dumazet@gmail.com X-ASG-Orig-Subj: Re: [PATCH 1/3] xfs: rcu free inodes Subject: Re: [PATCH 1/3] xfs: rcu free inodes Message-ID: <20101214202301.GG2161@linux.vnet.ibm.com> Reply-To: paulmck@linux.vnet.ibm.com References: <1292203957-15819-1-git-send-email-david@fromorbit.com> <1292203957-15819-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292203957-15819-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Content-Scanned: Fidelis XPS MAILER X-Barracuda-Connect: e1.ny.us.ibm.com[32.97.182.141] X-Barracuda-Start-Time: 1292358188 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.92 X-Barracuda-Spam-Status: No, SCORE=-0.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE_7582B, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49432 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.50 BSF_RULE_7582B Custom Rule 7582B X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 13, 2010 at 12:32:35PM +1100, Dave Chinner wrote: > From: Dave Chinner > > Introduce RCU freeing of XFS inodes so that we can convert lookup > traversals to use rcu_read_lock() protection. This patch only > introduces the RCU freeing to minimise the potential conflicts with > mainline if this is merged into mainline via a VFS patchset. It > abuses the i_dentry list for the RCU callback structure because the > VFS patches make this a union so it is safe to use like this and > simplifies and merge issues. > > This patch uses basic RCU freeing rather than SLAB_DESTROY_BY_RCU. > The later lookup patches need the same "found free inode" protection > regardless of the RCU freeing method used, so once again the RCU > freeing method can be dealt with apprpriately at merge time without > affecting any other code. There are only two call sites that free into xfs_inode_zone. One of them is initialization, before readers have access to the data strcuture, and the other is covered by this patch. So looks good to me! Reviewed-by: Paul E. McKenney > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_iget.c | 14 +++++++++++++- > 1 files changed, 13 insertions(+), 1 deletions(-) > > diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c > index cdb1c25..9fae475 100644 > --- a/fs/xfs/xfs_iget.c > +++ b/fs/xfs/xfs_iget.c > @@ -105,6 +105,18 @@ xfs_inode_alloc( > } > > void > +__xfs_inode_free( > + struct rcu_head *head) > +{ > + struct inode *inode = container_of((void *)head, > + struct inode, i_dentry); > + struct xfs_inode *ip = XFS_I(inode); > + > + INIT_LIST_HEAD(&inode->i_dentry); > + kmem_zone_free(xfs_inode_zone, ip); > +} > + > +void > xfs_inode_free( > struct xfs_inode *ip) > { > @@ -147,7 +159,7 @@ xfs_inode_free( > ASSERT(!spin_is_locked(&ip->i_flags_lock)); > ASSERT(completion_done(&ip->i_flush)); > > - kmem_zone_free(xfs_inode_zone, ip); > + call_rcu((struct rcu_head *)&VFS_I(ip)->i_dentry, __xfs_inode_free); > } > > /* > -- > 1.7.2.3 > From paulmck@paulmck-ThinkPad-W500linux.vnet.ibm.com Tue Dec 14 15:16:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBELGHuH149506 for ; Tue, 14 Dec 2010 15:16:18 -0600 X-ASG-Debug-ID: 1292361488-0831002d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from e1.ny.us.ibm.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A6A8A1450665 for ; Tue, 14 Dec 2010 13:18:08 -0800 (PST) Received: from e1.ny.us.ibm.com (e1.ny.us.ibm.com [32.97.182.141]) by cuda.sgi.com with ESMTP id CrGDUzRNGfO66oYl for ; Tue, 14 Dec 2010 13:18:08 -0800 (PST) Received: from d01dlp01.pok.ibm.com (d01dlp01.pok.ibm.com [9.56.224.56]) by e1.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id oBEL9dq6010291 for ; Tue, 14 Dec 2010 16:09:52 -0500 Received: from d01relay07.pok.ibm.com (d01relay07.pok.ibm.com [9.56.227.147]) by d01dlp01.pok.ibm.com (Postfix) with ESMTP id 1874672805E for ; Tue, 14 Dec 2010 16:18:08 -0500 (EST) Received: from d01av04.pok.ibm.com (d01av04.pok.ibm.com [9.56.224.64]) by d01relay07.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id oBELI6Wb1495236 for ; Tue, 14 Dec 2010 16:18:06 -0500 Received: from d01av04.pok.ibm.com (loopback [127.0.0.1]) by d01av04.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id oBELI5j5006212 for ; Tue, 14 Dec 2010 16:18:06 -0500 Received: from paulmck-ThinkPad-W500 (paulmck-ThinkPad-W500.beaverton.ibm.com [9.47.24.62]) by d01av04.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id oBELI10W005857; Tue, 14 Dec 2010 16:18:01 -0500 Received: by paulmck-ThinkPad-W500 (Postfix, from userid 1000) id 5792413F812; Tue, 14 Dec 2010 13:18:01 -0800 (PST) Date: Tue, 14 Dec 2010 13:18:01 -0800 From: "Paul E. McKenney" To: Dave Chinner Cc: xfs@oss.sgi.com, eric.dumazet@gmail.com X-ASG-Orig-Subj: Re: [PATCH 2/3] xfs: convert inode cache lookups to use RCU locking Subject: Re: [PATCH 2/3] xfs: convert inode cache lookups to use RCU locking Message-ID: <20101214211801.GH2161@linux.vnet.ibm.com> Reply-To: paulmck@linux.vnet.ibm.com References: <1292203957-15819-1-git-send-email-david@fromorbit.com> <1292203957-15819-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1292203957-15819-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Content-Scanned: Fidelis XPS MAILER X-Barracuda-Connect: e1.ny.us.ibm.com[32.97.182.141] X-Barracuda-Start-Time: 1292361489 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49436 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 13, 2010 at 12:32:36PM +1100, Dave Chinner wrote: > From: Dave Chinner > > With delayed logging greatly increasing the sustained parallelism of inode > operations, the inode cache locking is showing significant read vs write > contention when inode reclaim runs at the same time as lookups. There is > also a lot more write lock acquistions than there are read locks (4:1 ratio) > so the read locking is not really buying us much in the way of parallelism. > > To avoid the read vs write contention, change the cache to use RCU locking on > the read side. To avoid needing to RCU free every single inode, use the built > in slab RCU freeing mechanism. This requires us to be able to detect lookups of > freed inodes, so enÑ•ure that ever freed inode has an inode number of zero and > the XFS_IRECLAIM flag set. We already check the XFS_IRECLAIM flag in cache hit > lookup path, but also add a check for a zero inode number as well. > > We canthen convert all the read locking lockups to use RCU read side locking > and hence remove all read side locking. OK, so the xfs_inode uses straight RCU, and there fore cannot be freed and immediately reallocated, while the inode itself uses SLAB_DESTROY_BY_RCU, which does allow the inode to be freed and immediately reallocated, correct? Some questions and comments below. Thanx, Paul > Signed-off-by: Dave Chinner > Reviewed-by: Alex Elder > --- > fs/xfs/linux-2.6/xfs_sync.c | 27 ++++++++++++++++----- > fs/xfs/xfs_iget.c | 50 +++++++++++++++++++++++++++++++---------- > fs/xfs/xfs_inode.c | 52 +++++++++++++++++++++++++++++++++---------- > 3 files changed, 98 insertions(+), 31 deletions(-) > > diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c > index afb0d7c..5ee02d7 100644 > --- a/fs/xfs/linux-2.6/xfs_sync.c > +++ b/fs/xfs/linux-2.6/xfs_sync.c > @@ -53,14 +53,20 @@ xfs_inode_ag_walk_grab( > { > struct inode *inode = VFS_I(ip); > > + /* check for stale RCU freed inode */ > + spin_lock(&ip->i_flags_lock); > + if (!ip->i_ino) > + goto out_unlock_noent; > + > + /* avoid new or reclaimable inodes. Leave for reclaim code to flush */ > + if (__xfs_iflags_test(ip, XFS_INEW | XFS_IRECLAIMABLE | XFS_IRECLAIM)) > + goto out_unlock_noent; > + spin_unlock(&ip->i_flags_lock); > + OK, this works because the xfs_inode cannot be freed and reallocated (which the RCU change should enforce). It is not clear to me that the above would work if using the SLAB_DESTROY_BY_RCU approach, at least not unless some higher-level checks can reliably catch an inode changing identity due to quick free and reallocation. Also, all calls to xfs_inode_ag_walk_grab() must be in RCU read-side critical sections... I suggest a debug check for rcu_read_lock_held() to catch any call paths that might have slipped through. At first glance, it appears that RCU is replacing some of ->pag_ici_lock, but I could easily be mistaken. > /* nothing to sync during shutdown */ > if (XFS_FORCED_SHUTDOWN(ip->i_mount)) > return EFSCORRUPTED; > > - /* avoid new or reclaimable inodes. Leave for reclaim code to flush */ > - if (xfs_iflags_test(ip, XFS_INEW | XFS_IRECLAIMABLE | XFS_IRECLAIM)) > - return ENOENT; > - > /* If we can't grab the inode, it must on it's way to reclaim. */ > if (!igrab(inode)) > return ENOENT; > @@ -72,6 +78,10 @@ xfs_inode_ag_walk_grab( > > /* inode is valid */ > return 0; > + > +out_unlock_noent: > + spin_unlock(&ip->i_flags_lock); > + return ENOENT; > } > > STATIC int > @@ -98,12 +108,12 @@ restart: > int error = 0; > int i; > > - read_lock(&pag->pag_ici_lock); > + rcu_read_lock(); > nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, > (void **)batch, first_index, > XFS_LOOKUP_BATCH); > if (!nr_found) { > - read_unlock(&pag->pag_ici_lock); > + rcu_read_unlock(); > break; > } > > @@ -129,7 +139,7 @@ restart: > } > > /* unlock now we've grabbed the inodes. */ > - read_unlock(&pag->pag_ici_lock); > + rcu_read_unlock(); > > for (i = 0; i < nr_found; i++) { > if (!batch[i]) > @@ -639,6 +649,9 @@ xfs_reclaim_inode_grab( > struct xfs_inode *ip, > int flags) > { > + /* check for stale RCU freed inode */ > + if (!ip->i_ino) > + return 1; Does this mean that we need to be under rcu_read_lock() here? If not, how do we keep the inode from really being freed out from under us? (Again, if we do need to be under rcu_read_lock(), I highly recommend a debug check for rcu_read_lock_held().) > /* > * do some unlocked checks first to avoid unnecceary lock traffic. > diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c > index 9fae475..1e3b035 100644 > --- a/fs/xfs/xfs_iget.c > +++ b/fs/xfs/xfs_iget.c > @@ -80,6 +80,7 @@ xfs_inode_alloc( > ASSERT(atomic_read(&ip->i_pincount) == 0); > ASSERT(!spin_is_locked(&ip->i_flags_lock)); > ASSERT(completion_done(&ip->i_flush)); > + ASSERT(ip->i_ino == 0); > > mrlock_init(&ip->i_iolock, MRLOCK_BARRIER, "xfsio", ip->i_ino); > lockdep_set_class_and_name(&ip->i_iolock.mr_lock, > @@ -98,9 +99,6 @@ xfs_inode_alloc( > ip->i_size = 0; > ip->i_new_size = 0; > > - /* prevent anyone from using this yet */ > - VFS_I(ip)->i_state = I_NEW; > - > return ip; > } > > @@ -159,6 +157,16 @@ xfs_inode_free( > ASSERT(!spin_is_locked(&ip->i_flags_lock)); > ASSERT(completion_done(&ip->i_flush)); > > + /* > + * Because we use RCU freeing we need to ensure the inode always > + * appears to be reclaimed with an invalid inode number when in the > + * free state. The ip->i_flags_lock provides the barrier against lookup > + * races. > + */ > + spin_lock(&ip->i_flags_lock); > + ip->i_flags = XFS_IRECLAIM; > + ip->i_ino = 0; > + spin_unlock(&ip->i_flags_lock); OK, good! > call_rcu((struct rcu_head *)&VFS_I(ip)->i_dentry, __xfs_inode_free); > } > > @@ -169,14 +177,32 @@ static int > xfs_iget_cache_hit( > struct xfs_perag *pag, > struct xfs_inode *ip, > + xfs_ino_t ino, > int flags, > - int lock_flags) __releases(pag->pag_ici_lock) > + int lock_flags) __releases(RCU) > { > struct inode *inode = VFS_I(ip); > struct xfs_mount *mp = ip->i_mount; > int error; > > + /* > + * check for re-use of an inode within an RCU grace period due to the > + * radix tree nodes not being updated yet. We monitor for this by > + * setting the inode number to zero before freeing the inode structure. > + * If the inode has been reallocated and set up, then the inode number > + * will not match, so check for that, too. > + */ > spin_lock(&ip->i_flags_lock); > + if (ip->i_ino != ino) { > + trace_xfs_iget_skip(ip); > + XFS_STATS_INC(xs_ig_frecycle); > + spin_unlock(&ip->i_flags_lock); > + rcu_read_unlock(); > + /* Expire the grace period so we don't trip over it again. */ > + synchronize_rcu(); Hmmm... Interesting. Wouldn't the fact that we acquired the same lock that was held after removing the inode guarantee that an immediate retry would manage not to find this same inode again? If this is not the case, then readers finding it again will not be protected by the RCU grace period, right? In short, I don't understand why the synchronize_rcu() is needed. If it is somehow helping, that sounds to me like it is covering up a real bug that should be fixed separately. > + return EAGAIN; > + } > + > > /* > * If we are racing with another cache hit that is currently > @@ -219,7 +245,7 @@ xfs_iget_cache_hit( > ip->i_flags |= XFS_IRECLAIM; > > spin_unlock(&ip->i_flags_lock); > - read_unlock(&pag->pag_ici_lock); > + rcu_read_unlock(); > > error = -inode_init_always(mp->m_super, inode); > if (error) { > @@ -227,7 +253,7 @@ xfs_iget_cache_hit( > * Re-initializing the inode failed, and we are in deep > * trouble. Try to re-add it to the reclaim list. > */ > - read_lock(&pag->pag_ici_lock); > + rcu_read_lock(); > spin_lock(&ip->i_flags_lock); > > ip->i_flags &= ~XFS_INEW; > @@ -261,7 +287,7 @@ xfs_iget_cache_hit( > > /* We've got a live one. */ > spin_unlock(&ip->i_flags_lock); > - read_unlock(&pag->pag_ici_lock); > + rcu_read_unlock(); > trace_xfs_iget_hit(ip); > } > > @@ -275,7 +301,7 @@ xfs_iget_cache_hit( > > out_error: > spin_unlock(&ip->i_flags_lock); > - read_unlock(&pag->pag_ici_lock); > + rcu_read_unlock(); > return error; > } > > @@ -397,7 +423,7 @@ xfs_iget( > xfs_agino_t agino; > > /* reject inode numbers outside existing AGs */ > - if (XFS_INO_TO_AGNO(mp, ino) >= mp->m_sb.sb_agcount) > + if (!ino || XFS_INO_TO_AGNO(mp, ino) >= mp->m_sb.sb_agcount) For the above check to be safe, don't we need to already be in an RCU read-side critical section? Or is something else protecting us? > return EINVAL; > > /* get the perag structure and ensure that it's inode capable */ > @@ -406,15 +432,15 @@ xfs_iget( > > again: > error = 0; > - read_lock(&pag->pag_ici_lock); > + rcu_read_lock(); > ip = radix_tree_lookup(&pag->pag_ici_root, agino); > > if (ip) { > - error = xfs_iget_cache_hit(pag, ip, flags, lock_flags); > + error = xfs_iget_cache_hit(pag, ip, ino, flags, lock_flags); > if (error) > goto out_error_or_again; > } else { > - read_unlock(&pag->pag_ici_lock); > + rcu_read_unlock(); > XFS_STATS_INC(xs_ig_missed); > > error = xfs_iget_cache_miss(mp, pag, tp, ino, &ip, > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 108c7a0..43ffd90 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -2000,17 +2000,33 @@ xfs_ifree_cluster( > */ > for (i = 0; i < ninodes; i++) { > retry: > - read_lock(&pag->pag_ici_lock); > + rcu_read_lock(); > ip = radix_tree_lookup(&pag->pag_ici_root, > XFS_INO_TO_AGINO(mp, (inum + i))); > > - /* Inode not in memory or stale, nothing to do */ > - if (!ip || xfs_iflags_test(ip, XFS_ISTALE)) { > - read_unlock(&pag->pag_ici_lock); > + /* Inode not in memory, nothing to do */ > + if (!ip) { > + rcu_read_unlock(); > continue; > } > > /* > + * because this is an RCU protected lookup, we could > + * find a recently freed or even reallocated inode And here the inode might be immediately freed and then reallocated. (In contrast, this cannot happen to the xfs_inode.) > + * during the lookup. We need to check under the > + * i_flags_lock for a valid inode here. Skip it if it > + * is not valid, the wrong inode or stale. > + */ > + spin_lock(&ip->i_flags_lock); > + if (ip->i_ino != inum + i || > + __xfs_iflags_test(ip, XFS_ISTALE)) { > + spin_unlock(&ip->i_flags_lock); > + rcu_read_unlock(); > + continue; > + } > + spin_unlock(&ip->i_flags_lock); > + > + /* > * Don't try to lock/unlock the current inode, but we > * _cannot_ skip the other inodes that we did not find > * in the list attached to the buffer and are not > @@ -2019,11 +2035,11 @@ retry: > */ > if (ip != free_ip && > !xfs_ilock_nowait(ip, XFS_ILOCK_EXCL)) { > - read_unlock(&pag->pag_ici_lock); > + rcu_read_unlock(); > delay(1); > goto retry; > } > - read_unlock(&pag->pag_ici_lock); > + rcu_read_unlock(); > > xfs_iflock(ip); > xfs_iflags_set(ip, XFS_ISTALE); > @@ -2629,7 +2645,7 @@ xfs_iflush_cluster( > > mask = ~(((XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog)) - 1); > first_index = XFS_INO_TO_AGINO(mp, ip->i_ino) & mask; > - read_lock(&pag->pag_ici_lock); > + rcu_read_lock(); > /* really need a gang lookup range call here */ > nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void**)ilist, > first_index, inodes_per_cluster); > @@ -2640,9 +2656,21 @@ xfs_iflush_cluster( > iq = ilist[i]; > if (iq == ip) > continue; > - /* if the inode lies outside this cluster, we're done. */ > - if ((XFS_INO_TO_AGINO(mp, iq->i_ino) & mask) != first_index) > - break; > + > + /* > + * because this is an RCU protected lookup, we could find a > + * recently freed or even reallocated inode during the lookup. > + * We need to check under the i_flags_lock for a valid inode > + * here. Skip it if it is not valid or the wrong inode. > + */ > + spin_lock(&ip->i_flags_lock); > + if (!ip->i_ino || > + (XFS_INO_TO_AGINO(mp, iq->i_ino) & mask) != first_index) { > + spin_unlock(&ip->i_flags_lock); > + continue; > + } > + spin_unlock(&ip->i_flags_lock); > + > /* > * Do an un-protected check to see if the inode is dirty and > * is a candidate for flushing. These checks will be repeated > @@ -2692,7 +2720,7 @@ xfs_iflush_cluster( > } > > out_free: > - read_unlock(&pag->pag_ici_lock); > + rcu_read_unlock(); > kmem_free(ilist); > out_put: > xfs_perag_put(pag); > @@ -2704,7 +2732,7 @@ cluster_corrupt_out: > * Corruption detected in the clustering loop. Invalidate the > * inode buffer and shut down the filesystem. > */ > - read_unlock(&pag->pag_ici_lock); > + rcu_read_unlock(); > /* > * Clean up the buffer. If it was B_DELWRI, just release it -- > * brelse can handle it with no problems. If not, shut down the > -- > 1.7.2.3 > From paulmck@paulmck-ThinkPad-W500linux.vnet.ibm.com Tue Dec 14 15:17:16 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBELHGSN149561 for ; Tue, 14 Dec 2010 15:17:16 -0600 X-ASG-Debug-ID: 1292361548-735400100000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from e6.ny.us.ibm.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 411BC1CC66DD for ; Tue, 14 Dec 2010 13:19:08 -0800 (PST) Received: from e6.ny.us.ibm.com (e6.ny.us.ibm.com [32.97.182.146]) by cuda.sgi.com with ESMTP id xNW8pMPSrCJGcbjD for ; Tue, 14 Dec 2010 13:19:08 -0800 (PST) Received: from d01dlp02.pok.ibm.com (d01dlp02.pok.ibm.com [9.56.224.85]) by e6.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id oBEL3uam023960 for ; Tue, 14 Dec 2010 16:04:08 -0500 Received: from d01relay01.pok.ibm.com (d01relay01.pok.ibm.com [9.56.227.233]) by d01dlp02.pok.ibm.com (Postfix) with ESMTP id A1E094DE805A for ; Tue, 14 Dec 2010 16:17:02 -0500 (EST) Received: from d01av04.pok.ibm.com (d01av04.pok.ibm.com [9.56.224.64]) by d01relay01.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id oBELJ72p402810 for ; Tue, 14 Dec 2010 16:19:07 -0500 Received: from d01av04.pok.ibm.com (loopback [127.0.0.1]) by d01av04.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id oBELJ5X6010291 for ; Tue, 14 Dec 2010 16:19:07 -0500 Received: from paulmck-ThinkPad-W500 (paulmck-ThinkPad-W500.beaverton.ibm.com [9.47.24.62]) by d01av04.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id oBELJ4h3010248; Tue, 14 Dec 2010 16:19:04 -0500 Received: by paulmck-ThinkPad-W500 (Postfix, from userid 1000) id 1926513F812; Tue, 14 Dec 2010 13:19:04 -0800 (PST) Date: Tue, 14 Dec 2010 13:19:04 -0800 From: "Paul E. McKenney" To: Dave Chinner Cc: xfs@oss.sgi.com, eric.dumazet@gmail.com X-ASG-Orig-Subj: Re: [PATCH 3/3] xfs: convert pag_ici_lock to a spin lock Subject: Re: [PATCH 3/3] xfs: convert pag_ici_lock to a spin lock Message-ID: <20101214211904.GI2161@linux.vnet.ibm.com> Reply-To: paulmck@linux.vnet.ibm.com References: <1292203957-15819-1-git-send-email-david@fromorbit.com> <1292203957-15819-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292203957-15819-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Content-Scanned: Fidelis XPS MAILER X-Barracuda-Connect: e6.ny.us.ibm.com[32.97.182.146] X-Barracuda-Start-Time: 1292361549 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49435 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 13, 2010 at 12:32:37PM +1100, Dave Chinner wrote: > From: Dave Chinner > > now that we are using RCU protection for the inode cache lookups, > the lock is only needed on the modification side. Hence it is not > necessary for the lock to be a rwlock as there are no read side > holders anymore. Convert it to a spin lock to reflect it's exclusive > nature. Looks good! Reviewed-by: Paul E. McKenney > Signed-off-by: Dave Chinner > Reviewed-by: Alex Elder > Reviewed-by: Christoph Hellwig > --- > fs/xfs/linux-2.6/xfs_sync.c | 14 +++++++------- > fs/xfs/xfs_ag.h | 2 +- > fs/xfs/xfs_iget.c | 10 +++++----- > fs/xfs/xfs_mount.c | 2 +- > 4 files changed, 14 insertions(+), 14 deletions(-) > > diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c > index 5ee02d7..d3b3b4f 100644 > --- a/fs/xfs/linux-2.6/xfs_sync.c > +++ b/fs/xfs/linux-2.6/xfs_sync.c > @@ -602,12 +602,12 @@ xfs_inode_set_reclaim_tag( > struct xfs_perag *pag; > > pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); > - write_lock(&pag->pag_ici_lock); > + spin_lock(&pag->pag_ici_lock); > spin_lock(&ip->i_flags_lock); > __xfs_inode_set_reclaim_tag(pag, ip); > __xfs_iflags_set(ip, XFS_IRECLAIMABLE); > spin_unlock(&ip->i_flags_lock); > - write_unlock(&pag->pag_ici_lock); > + spin_unlock(&pag->pag_ici_lock); > xfs_perag_put(pag); > } > > @@ -808,12 +808,12 @@ reclaim: > * added to the tree assert that it's been there before to catch > * problems with the inode life time early on. > */ > - write_lock(&pag->pag_ici_lock); > + spin_lock(&pag->pag_ici_lock); > if (!radix_tree_delete(&pag->pag_ici_root, > XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino))) > ASSERT(0); > __xfs_inode_clear_reclaim(pag, ip); > - write_unlock(&pag->pag_ici_lock); > + spin_unlock(&pag->pag_ici_lock); > > /* > * Here we do an (almost) spurious inode lock in order to coordinate > @@ -877,14 +877,14 @@ restart: > struct xfs_inode *batch[XFS_LOOKUP_BATCH]; > int i; > > - write_lock(&pag->pag_ici_lock); > + spin_lock(&pag->pag_ici_lock); > nr_found = radix_tree_gang_lookup_tag( > &pag->pag_ici_root, > (void **)batch, first_index, > XFS_LOOKUP_BATCH, > XFS_ICI_RECLAIM_TAG); > if (!nr_found) { > - write_unlock(&pag->pag_ici_lock); > + spin_unlock(&pag->pag_ici_lock); > break; > } > > @@ -911,7 +911,7 @@ restart: > } > > /* unlock now we've grabbed the inodes. */ > - write_unlock(&pag->pag_ici_lock); > + spin_unlock(&pag->pag_ici_lock); > > for (i = 0; i < nr_found; i++) { > if (!batch[i]) > diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h > index 63c7a1a..58632cc 100644 > --- a/fs/xfs/xfs_ag.h > +++ b/fs/xfs/xfs_ag.h > @@ -227,7 +227,7 @@ typedef struct xfs_perag { > > atomic_t pagf_fstrms; /* # of filestreams active in this AG */ > > - rwlock_t pag_ici_lock; /* incore inode lock */ > + spinlock_t pag_ici_lock; /* incore inode cache lock */ > struct radix_tree_root pag_ici_root; /* incore inode cache root */ > int pag_ici_reclaimable; /* reclaimable inodes */ > struct mutex pag_ici_reclaim_lock; /* serialisation point */ > diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c > index 1e3b035..ec440da 100644 > --- a/fs/xfs/xfs_iget.c > +++ b/fs/xfs/xfs_iget.c > @@ -263,7 +263,7 @@ xfs_iget_cache_hit( > goto out_error; > } > > - write_lock(&pag->pag_ici_lock); > + spin_lock(&pag->pag_ici_lock); > spin_lock(&ip->i_flags_lock); > ip->i_flags &= ~(XFS_IRECLAIMABLE | XFS_IRECLAIM); > ip->i_flags |= XFS_INEW; > @@ -276,7 +276,7 @@ xfs_iget_cache_hit( > &xfs_iolock_active, "xfs_iolock_active"); > > spin_unlock(&ip->i_flags_lock); > - write_unlock(&pag->pag_ici_lock); > + spin_unlock(&pag->pag_ici_lock); > } else { > /* If the VFS inode is being torn down, pause and try again. */ > if (!igrab(inode)) { > @@ -354,7 +354,7 @@ xfs_iget_cache_miss( > BUG(); > } > > - write_lock(&pag->pag_ici_lock); > + spin_lock(&pag->pag_ici_lock); > > /* insert the new inode */ > error = radix_tree_insert(&pag->pag_ici_root, agino, ip); > @@ -369,14 +369,14 @@ xfs_iget_cache_miss( > ip->i_udquot = ip->i_gdquot = NULL; > xfs_iflags_set(ip, XFS_INEW); > > - write_unlock(&pag->pag_ici_lock); > + spin_unlock(&pag->pag_ici_lock); > radix_tree_preload_end(); > > *ipp = ip; > return 0; > > out_preload_end: > - write_unlock(&pag->pag_ici_lock); > + spin_unlock(&pag->pag_ici_lock); > radix_tree_preload_end(); > if (lock_flags) > xfs_iunlock(ip, lock_flags); > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index fe27338..52186c0 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -598,7 +598,7 @@ xfs_initialize_perag( > goto out_unwind; > pag->pag_agno = index; > pag->pag_mount = mp; > - rwlock_init(&pag->pag_ici_lock); > + spin_lock_init(&pag->pag_ici_lock); > mutex_init(&pag->pag_ici_reclaim_lock); > INIT_RADIX_TREE(&pag->pag_ici_root, GFP_ATOMIC); > spin_lock_init(&pag->pag_buf_lock); > -- > 1.7.2.3 > From SRS0+nJ8m+17+fromorbit.com=david@internode.on.net Tue Dec 14 16:59:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBEMx4T1152843 for ; Tue, 14 Dec 2010 16:59:05 -0600 X-ASG-Debug-ID: 1292367654-3f8901d40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 735831450E7D for ; Tue, 14 Dec 2010 15:00:54 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id MBkEiicwiM7oDnHc for ; Tue, 14 Dec 2010 15:00:54 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49852864-1927428 for multiple; Wed, 15 Dec 2010 09:30:49 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PSdrT-0005qC-G0; Wed, 15 Dec 2010 10:00:47 +1100 Date: Wed, 15 Dec 2010 10:00:47 +1100 From: Dave Chinner To: "Paul E. McKenney" Cc: xfs@oss.sgi.com, eric.dumazet@gmail.com X-ASG-Orig-Subj: Re: [PATCH 2/3] xfs: convert inode cache lookups to use RCU locking Subject: Re: [PATCH 2/3] xfs: convert inode cache lookups to use RCU locking Message-ID: <20101214230047.GC16267@dastard> References: <1292203957-15819-1-git-send-email-david@fromorbit.com> <1292203957-15819-3-git-send-email-david@fromorbit.com> <20101214211801.GH2161@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20101214211801.GH2161@linux.vnet.ibm.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1292367656 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49442 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 14, 2010 at 01:18:01PM -0800, Paul E. McKenney wrote: > On Mon, Dec 13, 2010 at 12:32:36PM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > With delayed logging greatly increasing the sustained parallelism of inode > > operations, the inode cache locking is showing significant read vs write > > contention when inode reclaim runs at the same time as lookups. There is > > also a lot more write lock acquistions than there are read locks (4:1 ratio) > > so the read locking is not really buying us much in the way of parallelism. > > > > To avoid the read vs write contention, change the cache to use RCU locking on > > the read side. To avoid needing to RCU free every single inode, use the built > > in slab RCU freeing mechanism. This requires us to be able to detect lookups of > > freed inodes, so enÑ•ure that ever freed inode has an inode number of zero and > > the XFS_IRECLAIM flag set. We already check the XFS_IRECLAIM flag in cache hit > > lookup path, but also add a check for a zero inode number as well. > > > > We canthen convert all the read locking lockups to use RCU read side locking > > and hence remove all read side locking. > > OK, so the xfs_inode uses straight RCU, and there fore cannot be freed and > immediately reallocated, while the inode itself uses SLAB_DESTROY_BY_RCU, > which does allow the inode to be freed and immediately reallocated, > correct? No, the struct inode is embedded in the struct xfs_inode, so they have the same lifecycle. i.e. we don't separately allocate and free the struct inode. So it is all using straight RCU. > Some questions and comments below. > > Thanx, Paul > > > Signed-off-by: Dave Chinner > > Reviewed-by: Alex Elder > > --- > > fs/xfs/linux-2.6/xfs_sync.c | 27 ++++++++++++++++----- > > fs/xfs/xfs_iget.c | 50 +++++++++++++++++++++++++++++++---------- > > fs/xfs/xfs_inode.c | 52 +++++++++++++++++++++++++++++++++---------- > > 3 files changed, 98 insertions(+), 31 deletions(-) > > > > diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c > > index afb0d7c..5ee02d7 100644 > > --- a/fs/xfs/linux-2.6/xfs_sync.c > > +++ b/fs/xfs/linux-2.6/xfs_sync.c > > @@ -53,14 +53,20 @@ xfs_inode_ag_walk_grab( > > { > > struct inode *inode = VFS_I(ip); > > > > + /* check for stale RCU freed inode */ > > + spin_lock(&ip->i_flags_lock); > > + if (!ip->i_ino) > > + goto out_unlock_noent; > > + > > + /* avoid new or reclaimable inodes. Leave for reclaim code to flush */ > > + if (__xfs_iflags_test(ip, XFS_INEW | XFS_IRECLAIMABLE | XFS_IRECLAIM)) > > + goto out_unlock_noent; > > + spin_unlock(&ip->i_flags_lock); > > + > > OK, this works because the xfs_inode cannot be freed and reallocated (which > the RCU change should enforce). It is not clear to me that the above > would work if using the SLAB_DESTROY_BY_RCU approach, at least not unless > some higher-level checks can reliably catch an inode changing identity > due to quick free and reallocation. In this case, I don't believe it matters if the inode has changed identity - we are walking for writeback, so if we get a reallocated inode we'll write it back if it is dirty. If it has not been reallocated or still being initialised, the !ip->i_ino and XFS_INEW|XFS_IRECLAIM checks are sufficient to avoid using the inode. I probably should add a comment to this effect, yes? > Also, all calls to xfs_inode_ag_walk_grab() must be in RCU read-side > critical sections... I suggest a debug check for rcu_read_lock_held() to > catch any call paths that might have slipped through. Yes, good idea. > At first glance, > it appears that RCU is replacing some of ->pag_ici_lock, but I could > easily be mistaken. Correct, it is replacing the read side of the ->pag_ici_lock. > > @@ -639,6 +649,9 @@ xfs_reclaim_inode_grab( > > struct xfs_inode *ip, > > int flags) > > { > > + /* check for stale RCU freed inode */ > > + if (!ip->i_ino) > > + return 1; > > Does this mean that we need to be under rcu_read_lock() here? If not, > how do we keep the inode from really being freed out from under us? Hmmm, I think I've mismerged a patch somewhere along the line. In this patch the reclaim tree walk is under the ->pag_ici_lock(), when in fact it should be under the rcu_read_lock(). Good catch, Paul. As it is, being under the ->pag_ici_lock means that the tree is consistent and we won't be seeing RCU freed inodes in the walk. Hence the code is functioning correctly, just not as wasss intended. > (Again, if we do need to be under rcu_read_lock(), I highly recommend > a debug check for rcu_read_lock_held().) Yup, which would have caught the merge screwup... .... > > > > + /* > > + * check for re-use of an inode within an RCU grace period due to the > > + * radix tree nodes not being updated yet. We monitor for this by > > + * setting the inode number to zero before freeing the inode structure. > > + * If the inode has been reallocated and set up, then the inode number > > + * will not match, so check for that, too. > > + */ > > spin_lock(&ip->i_flags_lock); > > + if (ip->i_ino != ino) { > > + trace_xfs_iget_skip(ip); > > + XFS_STATS_INC(xs_ig_frecycle); > > + spin_unlock(&ip->i_flags_lock); > > + rcu_read_unlock(); > > + /* Expire the grace period so we don't trip over it again. */ > > + synchronize_rcu(); > > Hmmm... Interesting. Wouldn't the fact that we acquired the same lock > that was held after removing the inode guarantee that an immediate retry > would manage not to find this same inode again? That is what I'm not sure of. I was more worried about resolving the contents of the radix tree nodes, not so much the inode itself. If a new traversal will resolve the tree correctly (which is what you are implying), then synchronize_rcu() is not needed.... > If this is not the case, then readers finding it again will not be > protected by the RCU grace period, right? > > In short, I don't understand why the synchronize_rcu() is needed. > If it is somehow helping, that sounds to me like it is covering up > a real bug that should be fixed separately. It isn't covering up a bug, it was more tryingt o be consistent with the rest of the xfs_inode lookup failures - we back off and try again later. If that is unnecessary resolve the RCU lookup race, then it can be dropped. > > @@ -397,7 +423,7 @@ xfs_iget( > > xfs_agino_t agino; > > > > /* reject inode numbers outside existing AGs */ > > - if (XFS_INO_TO_AGNO(mp, ino) >= mp->m_sb.sb_agcount) > > + if (!ino || XFS_INO_TO_AGNO(mp, ino) >= mp->m_sb.sb_agcount) > > For the above check to be safe, don't we need to already be in an > RCU read-side critical section? Or is something else protecting us? "ino" is the inode number used as the lookup key to find the struct xfs_inode. This is ensuring we don't try to look up an inode number of zero given it's new special meaning as a freed inode. Hence it can be safely validated outside the RCU read-side critical sectioni as it is a constant. Thanks for the review, Paul. I'll fix up the issues you've pointed out and retest. Cheers, Dave. -- Dave Chinner david@fromorbit.com From paulmck@paulmck-ThinkPad-W500linux.vnet.ibm.com Tue Dec 14 19:03:48 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBF13m2L158708 for ; Tue, 14 Dec 2010 19:03:48 -0600 X-ASG-Debug-ID: 1292375139-79d600760000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from e7.ny.us.ibm.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CB0981ECCAF for ; Tue, 14 Dec 2010 17:05:40 -0800 (PST) Received: from e7.ny.us.ibm.com (e7.ny.us.ibm.com [32.97.182.137]) by cuda.sgi.com with ESMTP id Uc0EpL4Ix3di9roa for ; Tue, 14 Dec 2010 17:05:40 -0800 (PST) Received: from d01dlp01.pok.ibm.com (d01dlp01.pok.ibm.com [9.56.224.56]) by e7.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id oBF0ljh6020083 for ; Tue, 14 Dec 2010 19:47:52 -0500 Received: from d01relay03.pok.ibm.com (d01relay03.pok.ibm.com [9.56.227.235]) by d01dlp01.pok.ibm.com (Postfix) with ESMTP id E864B728080 for ; Tue, 14 Dec 2010 20:05:38 -0500 (EST) Received: from d01av04.pok.ibm.com (d01av04.pok.ibm.com [9.56.224.64]) by d01relay03.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id oBF15cni298558 for ; Tue, 14 Dec 2010 20:05:38 -0500 Received: from d01av04.pok.ibm.com (loopback [127.0.0.1]) by d01av04.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id oBF15cFt027846 for ; Tue, 14 Dec 2010 20:05:38 -0500 Received: from paulmck-ThinkPad-W500 (paulmck-ThinkPad-W500.beaverton.ibm.com [9.47.24.62]) by d01av04.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id oBF15aXW027748; Tue, 14 Dec 2010 20:05:37 -0500 Received: by paulmck-ThinkPad-W500 (Postfix, from userid 1000) id 2951013F812; Tue, 14 Dec 2010 17:05:36 -0800 (PST) Date: Tue, 14 Dec 2010 17:05:36 -0800 From: "Paul E. McKenney" To: Dave Chinner Cc: xfs@oss.sgi.com, eric.dumazet@gmail.com X-ASG-Orig-Subj: Re: [PATCH 2/3] xfs: convert inode cache lookups to use RCU locking Subject: Re: [PATCH 2/3] xfs: convert inode cache lookups to use RCU locking Message-ID: <20101215010536.GT2161@linux.vnet.ibm.com> Reply-To: paulmck@linux.vnet.ibm.com References: <1292203957-15819-1-git-send-email-david@fromorbit.com> <1292203957-15819-3-git-send-email-david@fromorbit.com> <20101214211801.GH2161@linux.vnet.ibm.com> <20101214230047.GC16267@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20101214230047.GC16267@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) X-Content-Scanned: Fidelis XPS MAILER X-Barracuda-Connect: e7.ny.us.ibm.com[32.97.182.137] X-Barracuda-Start-Time: 1292375140 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.23 X-Barracuda-Spam-Status: No, SCORE=-0.23 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, MISSING_SUBJECT, MISSING_SUBJECT_2, NO_RECEIVED, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49451 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 MISSING_SUBJECT Missing Subject: header 0.00 TO_CC_NONE No To: or Cc: header -0.00 NO_RECEIVED Informational: message has no Received headers 0.50 BSF_RULE7568M Custom Rule 7568M 1.28 MISSING_SUBJECT_2 Missing Subject: header X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 15, 2010 at 10:00:47AM +1100, Dave Chinner wrote: > On Tue, Dec 14, 2010 at 01:18:01PM -0800, Paul E. McKenney wrote: > > On Mon, Dec 13, 2010 at 12:32:36PM +1100, Dave Chinner wrote: > > > From: Dave Chinner > > > > > > With delayed logging greatly increasing the sustained parallelism of inode > > > operations, the inode cache locking is showing significant read vs write > > > contention when inode reclaim runs at the same time as lookups. There is > > > also a lot more write lock acquistions than there are read locks (4:1 ratio) > > > so the read locking is not really buying us much in the way of parallelism. > > > > > > To avoid the read vs write contention, change the cache to use RCU locking on > > > the read side. To avoid needing to RCU free every single inode, use the built > > > in slab RCU freeing mechanism. This requires us to be able to detect lookups of > > > freed inodes, so enÑ•ure that ever freed inode has an inode number of zero and > > > the XFS_IRECLAIM flag set. We already check the XFS_IRECLAIM flag in cache hit > > > lookup path, but also add a check for a zero inode number as well. > > > > > > We canthen convert all the read locking lockups to use RCU read side locking > > > and hence remove all read side locking. > > > > OK, so the xfs_inode uses straight RCU, and there fore cannot be freed and > > immediately reallocated, while the inode itself uses SLAB_DESTROY_BY_RCU, > > which does allow the inode to be freed and immediately reallocated, > > correct? > > No, the struct inode is embedded in the struct xfs_inode, so they > have the same lifecycle. i.e. we don't separately allocate and free > the struct inode. So it is all using straight RCU. > > > Some questions and comments below. > > > > Thanx, Paul > > > > > Signed-off-by: Dave Chinner > > > Reviewed-by: Alex Elder > > > --- > > > fs/xfs/linux-2.6/xfs_sync.c | 27 ++++++++++++++++----- > > > fs/xfs/xfs_iget.c | 50 +++++++++++++++++++++++++++++++---------- > > > fs/xfs/xfs_inode.c | 52 +++++++++++++++++++++++++++++++++---------- > > > 3 files changed, 98 insertions(+), 31 deletions(-) > > > > > > diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c > > > index afb0d7c..5ee02d7 100644 > > > --- a/fs/xfs/linux-2.6/xfs_sync.c > > > +++ b/fs/xfs/linux-2.6/xfs_sync.c > > > @@ -53,14 +53,20 @@ xfs_inode_ag_walk_grab( > > > { > > > struct inode *inode = VFS_I(ip); > > > > > > + /* check for stale RCU freed inode */ > > > + spin_lock(&ip->i_flags_lock); > > > + if (!ip->i_ino) > > > + goto out_unlock_noent; > > > + > > > + /* avoid new or reclaimable inodes. Leave for reclaim code to flush */ > > > + if (__xfs_iflags_test(ip, XFS_INEW | XFS_IRECLAIMABLE | XFS_IRECLAIM)) > > > + goto out_unlock_noent; > > > + spin_unlock(&ip->i_flags_lock); > > > + > > > > OK, this works because the xfs_inode cannot be freed and reallocated (which > > the RCU change should enforce). It is not clear to me that the above > > would work if using the SLAB_DESTROY_BY_RCU approach, at least not unless > > some higher-level checks can reliably catch an inode changing identity > > due to quick free and reallocation. > > In this case, I don't believe it matters if the inode has changed > identity - we are walking for writeback, so if we get a reallocated > inode we'll write it back if it is dirty. If it has not been > reallocated or still being initialised, the !ip->i_ino and > XFS_INEW|XFS_IRECLAIM checks are sufficient to avoid using the inode. > > I probably should add a comment to this effect, yes? One vote in favor from me. ;-) > > Also, all calls to xfs_inode_ag_walk_grab() must be in RCU read-side > > critical sections... I suggest a debug check for rcu_read_lock_held() to > > catch any call paths that might have slipped through. > > Yes, good idea. > > > At first glance, > > it appears that RCU is replacing some of ->pag_ici_lock, but I could > > easily be mistaken. > > Correct, it is replacing the read side of the ->pag_ici_lock. OK, good! > > > @@ -639,6 +649,9 @@ xfs_reclaim_inode_grab( > > > struct xfs_inode *ip, > > > int flags) > > > { > > > + /* check for stale RCU freed inode */ > > > + if (!ip->i_ino) > > > + return 1; > > > > Does this mean that we need to be under rcu_read_lock() here? If not, > > how do we keep the inode from really being freed out from under us? > > Hmmm, I think I've mismerged a patch somewhere along the line. In > this patch the reclaim tree walk is under the ->pag_ici_lock(), when > in fact it should be under the rcu_read_lock(). Good catch, Paul. > > As it is, being under the ->pag_ici_lock means that the tree is > consistent and we won't be seeing RCU freed inodes in the walk. > Hence the code is functioning correctly, just not as wasss intended. > > > (Again, if we do need to be under rcu_read_lock(), I highly recommend > > a debug check for rcu_read_lock_held().) > > Yup, which would have caught the merge screwup... ;-) > .... > > > > > > + /* > > > + * check for re-use of an inode within an RCU grace period due to the > > > + * radix tree nodes not being updated yet. We monitor for this by > > > + * setting the inode number to zero before freeing the inode structure. > > > + * If the inode has been reallocated and set up, then the inode number > > > + * will not match, so check for that, too. > > > + */ > > > spin_lock(&ip->i_flags_lock); > > > + if (ip->i_ino != ino) { > > > + trace_xfs_iget_skip(ip); > > > + XFS_STATS_INC(xs_ig_frecycle); > > > + spin_unlock(&ip->i_flags_lock); > > > + rcu_read_unlock(); > > > + /* Expire the grace period so we don't trip over it again. */ > > > + synchronize_rcu(); > > > > Hmmm... Interesting. Wouldn't the fact that we acquired the same lock > > that was held after removing the inode guarantee that an immediate retry > > would manage not to find this same inode again? > > That is what I'm not sure of. I was more worried about resolving the > contents of the radix tree nodes, not so much the inode itself. If a > new traversal will resolve the tree correctly (which is what you are > implying), then synchronize_rcu() is not needed.... Here is the sequence of events that I believe must be in place: 1. Some CPU removes the vfs_inode from the radix tree, presumably while holding some lock whose identity does not matter here. 2. Before invoking call_rcu() on a given vfs_inode, this same CPU clears the inode number while holding ->i_flags_lock. If the CPU in #1 and #2 might be different, then either CPU #1 must hold ->i_flags_lock while removing the vfs_inode from the radix tree, or I don't understand how this can work even with the synchronize_rcu(). 3. Some CPU, possibly different than that in #1 and #2 above, executes the above code. If locking works correctly, it must see the earlier changes, so a subsequent access should see the results of #1 above, so that it won't see the element that was removed there. That said, I don't claim to understand either vfs or xfs very well, so I would be arbitrarily deeply confused. > > If this is not the case, then readers finding it again will not be > > protected by the RCU grace period, right? > > > > In short, I don't understand why the synchronize_rcu() is needed. > > If it is somehow helping, that sounds to me like it is covering up > > a real bug that should be fixed separately. > > It isn't covering up a bug, it was more tryingt o be consistent with > the rest of the xfs_inode lookup failures - we back off and try > again later. If that is unnecessary resolve the RCU lookup race, > then it can be dropped. OK, please let me know whether my sequence of steps above makes sense. > > > @@ -397,7 +423,7 @@ xfs_iget( > > > xfs_agino_t agino; > > > > > > /* reject inode numbers outside existing AGs */ > > > - if (XFS_INO_TO_AGNO(mp, ino) >= mp->m_sb.sb_agcount) > > > + if (!ino || XFS_INO_TO_AGNO(mp, ino) >= mp->m_sb.sb_agcount) > > > > For the above check to be safe, don't we need to already be in an > > RCU read-side critical section? Or is something else protecting us? > > "ino" is the inode number used as the lookup key to find the struct > xfs_inode. This is ensuring we don't try to look up an inode number > of zero given it's new special meaning as a freed inode. Hence it > can be safely validated outside the RCU read-side critical sectioni > as it is a constant. Ah, OK, got it! Thanx, Paul > Thanks for the review, Paul. I'll fix up the issues you've pointed > out and retest. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From SRS0+dQqb+18+fromorbit.com=dave@internode.on.net Tue Dec 14 19:23:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBF1NRcn159514 for ; Tue, 14 Dec 2010 19:23:28 -0600 X-ASG-Debug-ID: 1292376318-5e4802830000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1C9001EC89B for ; Tue, 14 Dec 2010 17:25:18 -0800 (PST) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id RdSE90aRFNplgCw1 for ; Tue, 14 Dec 2010 17:25:18 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 38498724-1927428 for ; Wed, 15 Dec 2010 11:55:17 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PSg7H-00064I-VZ for xfs@oss.sgi.com; Wed, 15 Dec 2010 12:25:16 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PSg5d-0004HE-NN for xfs@oss.sgi.com; Wed, 15 Dec 2010 12:23:33 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 3/7] xfs: factor post-write newsize updates Subject: [PATCH 3/7] xfs: factor post-write newsize updates Date: Wed, 15 Dec 2010 12:23:24 +1100 Message-Id: <1292376208-16282-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292376208-16282-1-git-send-email-david@fromorbit.com> References: <1292376208-16282-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1292376320 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.73 X-Barracuda-Spam-Status: No, SCORE=-0.73 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_SUBJECT, MISSING_SUBJECT_2, NO_RECEIVED, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49453 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 MISSING_SUBJECT Missing Subject: header 0.00 TO_CC_NONE No To: or Cc: header -0.00 NO_RECEIVED Informational: message has no Received headers 1.28 MISSING_SUBJECT_2 Missing Subject: header X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_file.c | 43 +++++++++++++++++++++---------------------- 1 files changed, 21 insertions(+), 22 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index 42adfff..4608aab 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -345,6 +345,25 @@ xfs_aio_write_isize_update( } } +/* + * If this was a direct or synchronous I/O that failed (such as ENOSPC) then + * part of the I/O may have been written to disk before the error occured. In + * this case the on-disk file size may have been adjusted beyond the in-memory + * file size and now needs to be truncated back. + */ +STATIC void +xfs_aio_write_newsize_update( + struct xfs_inode *ip) +{ + if (ip->i_new_size) { + xfs_ilock(ip, XFS_ILOCK_EXCL); + ip->i_new_size = 0; + if (ip->i_d.di_size > ip->i_size) + ip->i_d.di_size = ip->i_size; + xfs_iunlock(ip, XFS_ILOCK_EXCL); + } +} + STATIC ssize_t xfs_file_splice_write( struct pipe_inode_info *pipe, @@ -381,14 +400,7 @@ xfs_file_splice_write( ret = generic_file_splice_write(pipe, outfilp, ppos, count, flags); xfs_aio_write_isize_update(inode, ppos, ret); - - if (ip->i_new_size) { - xfs_ilock(ip, XFS_ILOCK_EXCL); - ip->i_new_size = 0; - if (ip->i_d.di_size > ip->i_size) - ip->i_d.di_size = ip->i_size; - xfs_iunlock(ip, XFS_ILOCK_EXCL); - } + xfs_aio_write_newsize_update(ip); xfs_iunlock(ip, XFS_IOLOCK_EXCL); return ret; } @@ -786,20 +798,7 @@ write_retry: } out_unlock_internal: - if (ip->i_new_size) { - xfs_ilock(ip, XFS_ILOCK_EXCL); - ip->i_new_size = 0; - /* - * If this was a direct or synchronous I/O that failed (such - * as ENOSPC) then part of the I/O may have been written to - * disk before the error occured. In this case the on-disk - * file size may have been adjusted beyond the in-memory file - * size and now needs to be truncated back. - */ - if (ip->i_d.di_size > ip->i_size) - ip->i_d.di_size = ip->i_size; - xfs_iunlock(ip, XFS_ILOCK_EXCL); - } + xfs_aio_write_newsize_update(ip); xfs_iunlock(ip, iolock); out_unlock_mutex: if (need_i_mutex) -- 1.7.2.3 From SRS0+dQqb+18+fromorbit.com=dave@internode.on.net Tue Dec 14 19:23:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBF1NR6T159515 for ; Tue, 14 Dec 2010 19:23:28 -0600 X-ASG-Debug-ID: 1292376318-188902e70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D63101CC777D for ; Tue, 14 Dec 2010 17:25:18 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id jC9gZ7zx1aPYIKBH for ; Tue, 14 Dec 2010 17:25:18 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49873086-1927428 for ; Wed, 15 Dec 2010 11:55:17 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PSg7I-00064W-5r for xfs@oss.sgi.com; Wed, 15 Dec 2010 12:25:16 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PSg5d-0004HQ-Ty for xfs@oss.sgi.com; Wed, 15 Dec 2010 12:23:33 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 7/7] xfs: serialise unaligned direct IOs Subject: [PATCH 7/7] xfs: serialise unaligned direct IOs Date: Wed, 15 Dec 2010 12:23:28 +1100 Message-Id: <1292376208-16282-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292376208-16282-1-git-send-email-david@fromorbit.com> References: <1292376208-16282-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1292376319 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.73 X-Barracuda-Spam-Status: No, SCORE=-0.73 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_SUBJECT, MISSING_SUBJECT_2, NO_RECEIVED, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49453 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 MISSING_SUBJECT Missing Subject: header 0.00 TO_CC_NONE No To: or Cc: header -0.00 NO_RECEIVED Informational: message has no Received headers 1.28 MISSING_SUBJECT_2 Missing Subject: header X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner When two concurrent unaligned, non-overlapping direct IOs are issued to the same block, the direct Io layer will race to zero the block. The result is that one of the concurrent IOs will overwrite data written by the other IO with zeros. This is demonstrated by the xfsqa test 240. To avoid this problem, serialise all unaligned direct IOs to an inode with a big hammer. We need a big hammer approach as we need to serialise AIO as well, so we can't just block writes on locks. Hence, the big hammer is calling xfs_ioend_wait() while holding out other unaligned direct IOs from starting. We don't bother trying to serialised aligned vs unaligned IOs as they are overlapping IO and the result of concurrent overlapping IOs is undefined - the result of either IO is a valid result so we let them race. Hence we only penalise unaligned IO, which already has a major overhead compared to aligned IO so this isn't a major problem. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_file.c | 29 ++++++++++++++++++++++++----- 1 files changed, 24 insertions(+), 5 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index 269da12..68f88a5 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -648,10 +648,21 @@ xfs_file_aio_write_checks( * xfs_file_dio_aio_write - handle direct IO writes * * Lock the inode appropriately to prepare for and issue a direct IO write. - * By spearating it from the buffered write path we remove all the tricky to + * By separating it from the buffered write path we remove all the tricky to * follow locking changes and looping. This also clearly indicates that XFS * does not fall back to buffered IO in the direct IO write path. * + * In most cases the direct IO writes will be done with IOLOCK_SHARED allowing + * them to be done in parallel with reads and other direct IO writes. However, + * if the IO is not aligned to filesystem blocks, the direct IO layer needs to + * do sub-block zeroing and that requires serialisation against other direct + * IOs to the same block. In this case we need to serialise the submission of + * the unaligned IOs so that we don't get racing block zeroing in the dio layer. + * To avoid the problem with aio, we also need to wait for outstanding IOs to + * complete so that unwritten extent conversion is completed before we try to + * map the overlapping block. This is currently implemented by hitting it + * with a big hammer (i.e. xfs_ioend_wait()). + * * Returns with locks held indicated by @need_i_mutex and @iolock. */ STATIC ssize_t @@ -671,6 +682,7 @@ xfs_file_dio_aio_write( struct xfs_mount *mp = ip->i_mount; ssize_t error = 0; size_t count = ocount; + int unaligned_io = 0; xfs_buftarg_t *target = XFS_IS_REALTIME_INODE(ip) ? mp->m_rtdev_targp : mp->m_ddev_targp; @@ -679,10 +691,15 @@ xfs_file_dio_aio_write( if ((pos & target->bt_smask) || (count & target->bt_smask)) return XFS_ERROR(-EINVAL); - if (mapping->nrpages || pos > ip->i_size) { + if ((pos & mp->m_blockmask) || ((pos + count) & mp->m_blockmask)) + unaligned_io = 1; + + if (unaligned_io || mapping->nrpages || pos > ip->i_size) { *iolock = XFS_IOLOCK_EXCL; *need_i_mutex = 1; mutex_lock(&inode->i_mutex); + if (unaligned_io) + xfs_ioend_wait(ip); } else { *iolock = XFS_IOLOCK_SHARED; } @@ -700,10 +717,12 @@ xfs_file_dio_aio_write( } if (*need_i_mutex) { - /* demote the lock now the cached pages are gone */ - xfs_ilock_demote(ip, XFS_IOLOCK_EXCL); + /* demote the lock now the cached pages are gone if we can */ + if (!unaligned_io) { + xfs_ilock_demote(ip, XFS_IOLOCK_EXCL); + *iolock = XFS_IOLOCK_SHARED; + } mutex_unlock(&inode->i_mutex); - *iolock = XFS_IOLOCK_SHARED; *need_i_mutex = 0; } -- 1.7.2.3 From SRS0+dQqb+18+fromorbit.com=dave@internode.on.net Tue Dec 14 19:23:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBF1NSLi159519 for ; Tue, 14 Dec 2010 19:23:28 -0600 X-ASG-Debug-ID: 1292376319-188a02fb0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id F193F1CC7782 for ; Tue, 14 Dec 2010 17:25:19 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id mRDLhaGdsQdcVSoC for ; Tue, 14 Dec 2010 17:25:19 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50369411-1927428 for ; Wed, 15 Dec 2010 11:55:18 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PSg7H-00064H-Tu for xfs@oss.sgi.com; Wed, 15 Dec 2010 12:25:15 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PSg5d-0004HB-Lg for xfs@oss.sgi.com; Wed, 15 Dec 2010 12:23:33 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/7] xfs: factor common post-write isize handling code Subject: [PATCH 2/7] xfs: factor common post-write isize handling code Date: Wed, 15 Dec 2010 12:23:23 +1100 Message-Id: <1292376208-16282-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292376208-16282-1-git-send-email-david@fromorbit.com> References: <1292376208-16282-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1292376320 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.73 X-Barracuda-Spam-Status: No, SCORE=-0.73 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_SUBJECT, MISSING_SUBJECT_2, NO_RECEIVED, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49453 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 MISSING_SUBJECT Missing Subject: header 0.00 TO_CC_NONE No To: or Cc: header -0.00 NO_RECEIVED Informational: message has no Received headers 1.28 MISSING_SUBJECT_2 Missing Subject: header X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_file.c | 52 +++++++++++++++++++++++------------------- 1 files changed, 28 insertions(+), 24 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index e1eaec2..42adfff 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -321,6 +321,30 @@ xfs_file_splice_read( return ret; } +STATIC void +xfs_aio_write_isize_update( + struct inode *inode, + loff_t *ppos, + ssize_t bytes_written) +{ + struct xfs_inode *ip = XFS_I(inode); + xfs_fsize_t isize = i_size_read(inode); + + if (bytes_written > 0) + XFS_STATS_ADD(xs_write_bytes, bytes_written); + + if (unlikely(bytes_written < 0 && bytes_written != -EFAULT && + *ppos > isize)) + *ppos = isize; + + if (*ppos > ip->i_size) { + xfs_ilock(ip, XFS_ILOCK_EXCL); + if (*ppos > ip->i_size) + ip->i_size = *ppos; + xfs_iunlock(ip, XFS_ILOCK_EXCL); + } +} + STATIC ssize_t xfs_file_splice_write( struct pipe_inode_info *pipe, @@ -331,7 +355,7 @@ xfs_file_splice_write( { struct inode *inode = outfilp->f_mapping->host; struct xfs_inode *ip = XFS_I(inode); - xfs_fsize_t isize, new_size; + xfs_fsize_t new_size; int ioflags = 0; ssize_t ret; @@ -355,19 +379,8 @@ xfs_file_splice_write( trace_xfs_file_splice_write(ip, count, *ppos, ioflags); ret = generic_file_splice_write(pipe, outfilp, ppos, count, flags); - if (ret > 0) - XFS_STATS_ADD(xs_write_bytes, ret); - - isize = i_size_read(inode); - if (unlikely(ret < 0 && ret != -EFAULT && *ppos > isize)) - *ppos = isize; - if (*ppos > ip->i_size) { - xfs_ilock(ip, XFS_ILOCK_EXCL); - if (*ppos > ip->i_size) - ip->i_size = *ppos; - xfs_iunlock(ip, XFS_ILOCK_EXCL); - } + xfs_aio_write_isize_update(inode, ppos, ret); if (ip->i_new_size) { xfs_ilock(ip, XFS_ILOCK_EXCL); @@ -576,7 +589,7 @@ xfs_file_aio_write( struct xfs_mount *mp = ip->i_mount; ssize_t ret = 0, error = 0; int ioflags = 0; - xfs_fsize_t isize, new_size; + xfs_fsize_t new_size; int iolock; size_t ocount = 0, count; int need_i_mutex; @@ -742,16 +755,7 @@ write_retry: current->backing_dev_info = NULL; - isize = i_size_read(inode); - if (unlikely(ret < 0 && ret != -EFAULT && iocb->ki_pos > isize)) - iocb->ki_pos = isize; - - if (iocb->ki_pos > ip->i_size) { - xfs_ilock(ip, XFS_ILOCK_EXCL); - if (iocb->ki_pos > ip->i_size) - ip->i_size = iocb->ki_pos; - xfs_iunlock(ip, XFS_ILOCK_EXCL); - } + xfs_aio_write_isize_update(inode, &iocb->ki_pos, ret); error = -ret; if (ret <= 0) -- 1.7.2.3 From SRS0+dQqb+18+fromorbit.com=dave@internode.on.net Tue Dec 14 19:23:31 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBF1NUNC159549 for ; Tue, 14 Dec 2010 19:23:30 -0600 X-ASG-Debug-ID: 1292376320-2863028c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DCA6514519C6 for ; Tue, 14 Dec 2010 17:25:21 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id 78i5YUhZshfnDhty for ; Tue, 14 Dec 2010 17:25:21 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50369412-1927428 for ; Wed, 15 Dec 2010 11:55:17 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PSg7I-00064P-4H for xfs@oss.sgi.com; Wed, 15 Dec 2010 12:25:16 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PSg5d-0004HN-SL for xfs@oss.sgi.com; Wed, 15 Dec 2010 12:23:33 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 6/7] xfs: factor common write setup code Subject: [PATCH 6/7] xfs: factor common write setup code Date: Wed, 15 Dec 2010 12:23:27 +1100 Message-Id: <1292376208-16282-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292376208-16282-1-git-send-email-david@fromorbit.com> References: <1292376208-16282-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1292376322 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.73 X-Barracuda-Spam-Status: No, SCORE=-0.73 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_SUBJECT, MISSING_SUBJECT_2, NO_RECEIVED, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49452 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 MISSING_SUBJECT Missing Subject: header 0.00 TO_CC_NONE No To: or Cc: header -0.00 NO_RECEIVED Informational: message has no Received headers 1.28 MISSING_SUBJECT_2 Missing Subject: header X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The buffered IO and direct Io write paths share a common set of checks and limiting code prior to issuing the write. Factor that into a common helper function. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_file.c | 130 ++++++++++++++++++++----------------------- 1 files changed, 61 insertions(+), 69 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index e10e703..269da12 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -588,6 +588,63 @@ out_lock: } /* + * Common pre-write limit and setup checks. + * + * Returns with iolock held according to @iolock. + */ +STATIC ssize_t +xfs_file_aio_write_checks( + struct file *file, + loff_t *pos, + size_t *count, + int *iolock) +{ + struct inode *inode = file->f_mapping->host; + struct xfs_inode *ip = XFS_I(inode); + xfs_fsize_t new_size; + int error; + + xfs_ilock(ip, XFS_ILOCK_EXCL|*iolock); + + error = generic_write_checks(file, pos, count, S_ISBLK(inode->i_mode)); + if (error) { + xfs_iunlock(ip, XFS_ILOCK_EXCL|*iolock); + *iolock = 0; + return error; + } + + new_size = *pos + *count; + if (new_size > ip->i_size) + ip->i_new_size = new_size; + + if (likely(!(file->f_mode & FMODE_NOCMTIME))) + file_update_time(file); + + /* + * If the offset is beyond the size of the file, we need to zero any + * blocks that fall between the existing EOF and the start of this + * write. + */ + if (*pos > ip->i_size) { + error = -xfs_zero_eof(ip, *pos, ip->i_size); + if (error) { + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return error; + } + } + xfs_iunlock(ip, XFS_ILOCK_EXCL); + + /* + * If we're writing the file then make sure to clear the setuid and + * setgid bits if the process is not being run by root. This keeps + * people from modifying setuid and setgid binaries. + */ + error = file_remove_suid(file); + return error; + +} + +/* * xfs_file_dio_aio_write - handle direct IO writes * * Lock the inode appropriately to prepare for and issue a direct IO write. @@ -613,7 +670,6 @@ xfs_file_dio_aio_write( struct xfs_inode *ip = XFS_I(inode); struct xfs_mount *mp = ip->i_mount; ssize_t error = 0; - xfs_fsize_t new_size; size_t count = ocount; xfs_buftarg_t *target = XFS_IS_REALTIME_INODE(ip) ? mp->m_rtdev_targp : mp->m_ddev_targp; @@ -630,47 +686,9 @@ xfs_file_dio_aio_write( } else { *iolock = XFS_IOLOCK_SHARED; } - xfs_ilock(ip, XFS_ILOCK_EXCL|*iolock); - - error = generic_write_checks(file, &pos, &count, - S_ISBLK(inode->i_mode)); - if (error) { - xfs_iunlock(ip, XFS_ILOCK_EXCL|*iolock); - *iolock = 0; - return error; - } - new_size = pos + count; - if (new_size > ip->i_size) - ip->i_new_size = new_size; - - if (likely(!(file->f_mode & FMODE_NOCMTIME))) - file_update_time(file); - - /* - * If the offset is beyond the size of the file, we have a couple of - * things to do. First, if there is already space allocated we need to - * either create holes or zero the disk or ... - * - * If there is a page where the previous size lands, we need to zero it - * out up to the new size. - */ - if (pos > ip->i_size) { - error = -xfs_zero_eof(ip, pos, ip->i_size); - if (error) { - xfs_iunlock(ip, XFS_ILOCK_EXCL); - return error; - } - } - xfs_iunlock(ip, XFS_ILOCK_EXCL); - - /* - * If we're writing the file then make sure to clear the setuid and - * setgid bits if the process is not being run by root. This keeps - * people from modifying setuid and setgid binaries. - */ - error = file_remove_suid(file); - if (unlikely(error)) + error = xfs_file_aio_write_checks(file, &pos, &count, iolock); + if (error) return error; if (mapping->nrpages) { @@ -713,40 +731,14 @@ xfs_file_buffered_aio_write( struct xfs_inode *ip = XFS_I(inode); ssize_t ret = 0, error = 0; int enospc = 0; - xfs_fsize_t new_size; size_t count = ocount; *iolock = XFS_IOLOCK_EXCL; *need_i_mutex = 1; mutex_lock(&inode->i_mutex); - xfs_ilock(ip, XFS_ILOCK_EXCL|*iolock); - - error = generic_write_checks(file, &pos, &count, - S_ISBLK(inode->i_mode)); - if (error) { - xfs_iunlock(ip, XFS_ILOCK_EXCL|*iolock); - *iolock = 0; - return error; - } - - new_size = pos + count; - if (new_size > ip->i_size) - ip->i_new_size = new_size; - if (likely(!(file->f_mode & FMODE_NOCMTIME))) - file_update_time(file); - - if (pos > ip->i_size) { - error = -xfs_zero_eof(ip, pos, ip->i_size); - if (error) { - xfs_iunlock(ip, XFS_ILOCK_EXCL); - return error; - } - } - xfs_iunlock(ip, XFS_ILOCK_EXCL); - - error = file_remove_suid(file); - if (unlikely(error)) + error = xfs_file_aio_write_checks(file, &pos, &count, iolock); + if (error) return error; /* We can write back this queue in page reclaim */ -- 1.7.2.3 From SRS0+AWmN+18+fromorbit.com=dave@internode.on.net Tue Dec 14 19:23:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBF1NRRO159513 for ; Tue, 14 Dec 2010 19:23:28 -0600 X-ASG-Debug-ID: 1292376318-188b030b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 057BA1CC7780 for ; Tue, 14 Dec 2010 17:25:18 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id 5cTGylSFUl60f1AT for ; Tue, 14 Dec 2010 17:25:18 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50125664-1927428 for ; Wed, 15 Dec 2010 11:55:17 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PSg7H-00064F-SC for xfs@oss.sgi.com; Wed, 15 Dec 2010 12:25:15 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PSg5d-0004H7-Hq for xfs@oss.sgi.com; Wed, 15 Dec 2010 12:23:33 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/7] xfs: serialise unaligned direct IOs Subject: [PATCH 0/7] xfs: serialise unaligned direct IOs Date: Wed, 15 Dec 2010 12:23:21 +1100 Message-Id: <1292376208-16282-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1292376320 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.73 X-Barracuda-Spam-Status: No, SCORE=-0.73 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_SUBJECT, MISSING_SUBJECT_2, NO_RECEIVED, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49453 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 MISSING_SUBJECT Missing Subject: header 0.00 TO_CC_NONE No To: or Cc: header -0.00 NO_RECEIVED Informational: message has no Received headers 1.28 MISSING_SUBJECT_2 Missing Subject: header X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Folks, This series aims to serialise unaligned direct IOs to an inode to avoid corruption causedby sub-block zeroing races. The previous approaches at the direct IO layer fail because for !DIO_LOCKING filesystems like XFS, there is no way we can track and serialise all the direct IOs to a given inode in a race free manner. While we can track them, we cannot close the races between mapping blocks and tracked IO completion occuring before subsequent tracking lookups without adding some kind of locking to the DIO layer. Hence for !DIO_LOCKING users, unaligned direct IO needs to be serialised at a higher layer. Because the xfs_file_aio_write() path is so twisted and difficult to follow, adding new locking cases to the code is difficult to verify that it is correct in all cases. Hence the series starts by cleaning up the code and splitting apart the direct IO and buffered IO paths before adding the unaligned direct IO detection and serialisation. The first patch fixes a sync write error handling bug - we should consider pushing that to .38. The next patches factor code that is common to write and splice into helpers. The direct and buffered IO paths are then separated out and the common write checks and bounds limiting is factored out into a helper. Finally, the serialisation of unaligned direct IOs is added by a big-hammer approach. That is, we take the i_mutex and XFS_IOLOCK_EXCL and hold them across the unaligned IO submission. This means that unaligned direct IO submission is serialised, and non-AIO DIO is serialised completely. For unaligned AIO DIO, this would only serialise the submission of the DIO, leaving the sub-block zeroing races open for unaligned writes into unwritten extents. To avoid this problem, we use xfs_ioend_wait() to ensure all AIO writes have completed before we submit the unaligned write. We do this wait holding the i_mutex so we serialise against other unaligned AIO as there is no need to serialise against aligned DIO. The following changes since commit cf7d7e5a1980d1116ee152d25dac382b112b9c17: Linux 2.6.37-rc5 (2010-12-06 20:09:04 -0800) are available in the git repository at: git://git.kernel.org/pub/scm/linux/dgc/xfsdev.git aio-unaligned Dave Chinner (7): xfs: ensure sync write errors are returned xfs: factor common post-write isize handling code xfs: factor post-write newsize updates xfs: split direct IO write path from xfs_file_aio_write xfs: split buffered IO write path from xfs_file_aio_write xfs: factor common write setup code xfs: serialise unaligned direct IOs fs/xfs/linux-2.6/xfs_file.c | 440 ++++++++++++++++++++++++------------------- 1 files changed, 248 insertions(+), 192 deletions(-) From SRS0+dQqb+18+fromorbit.com=dave@internode.on.net Tue Dec 14 19:23:31 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBF1NVGF159560 for ; Tue, 14 Dec 2010 19:23:31 -0600 X-ASG-Debug-ID: 1292376322-188102ec0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1FCC21CC7782 for ; Tue, 14 Dec 2010 17:25:23 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id yFpTkjoMbtgfUYRu for ; Tue, 14 Dec 2010 17:25:23 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49873093-1927428 for ; Wed, 15 Dec 2010 11:55:22 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PSg7H-00064G-SJ for xfs@oss.sgi.com; Wed, 15 Dec 2010 12:25:15 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PSg5d-0004H9-JU for xfs@oss.sgi.com; Wed, 15 Dec 2010 12:23:33 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 1/7] xfs: ensure sync write errors are returned Subject: [PATCH 1/7] xfs: ensure sync write errors are returned Date: Wed, 15 Dec 2010 12:23:22 +1100 Message-Id: <1292376208-16282-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292376208-16282-1-git-send-email-david@fromorbit.com> References: <1292376208-16282-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1292376324 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.73 X-Barracuda-Spam-Status: No, SCORE=-0.73 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_SUBJECT, MISSING_SUBJECT_2, NO_RECEIVED, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49453 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 MISSING_SUBJECT Missing Subject: header 0.00 TO_CC_NONE No To: or Cc: header -0.00 NO_RECEIVED Informational: message has no Received headers 1.28 MISSING_SUBJECT_2 Missing Subject: header X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner xfs_file_aio_write() only returns the error from synchronous flushing of the data and inode if error == 0. At the point where error is being checked, it is guaranteed to be > 0. Therefore any errors returned by the data or fsync flush will never be returned. Fix the checks so we overwrite the current error once and only if an error really occurred. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_file.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index ba8ad42..e1eaec2 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -769,7 +769,7 @@ write_retry: mutex_unlock(&inode->i_mutex); error2 = filemap_write_and_wait_range(mapping, pos, end); - if (!error) + if (error2) error = error2; if (need_i_mutex) mutex_lock(&inode->i_mutex); @@ -777,7 +777,7 @@ write_retry: error2 = -xfs_file_fsync(file, (file->f_flags & __O_SYNC) ? 0 : 1); - if (!error) + if (error2 && error >= 0) error = error2; } -- 1.7.2.3 From SRS0+dQqb+18+fromorbit.com=dave@internode.on.net Tue Dec 14 19:23:37 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBF1Naf0159598 for ; Tue, 14 Dec 2010 19:23:37 -0600 X-ASG-Debug-ID: 1292376327-188302d30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 809A61CC7786 for ; Tue, 14 Dec 2010 17:25:28 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id R5TXmGx2cSdwXBjs for ; Tue, 14 Dec 2010 17:25:28 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49873103-1927428 for ; Wed, 15 Dec 2010 11:55:27 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PSg7R-00064J-WE for xfs@oss.sgi.com; Wed, 15 Dec 2010 12:25:26 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PSg5d-0004HH-P0 for xfs@oss.sgi.com; Wed, 15 Dec 2010 12:23:33 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 4/7] xfs: split direct IO write path from xfs_file_aio_write Subject: [PATCH 4/7] xfs: split direct IO write path from xfs_file_aio_write Date: Wed, 15 Dec 2010 12:23:25 +1100 Message-Id: <1292376208-16282-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292376208-16282-1-git-send-email-david@fromorbit.com> References: <1292376208-16282-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1292376329 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.73 X-Barracuda-Spam-Status: No, SCORE=-0.73 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_SUBJECT, MISSING_SUBJECT_2, NO_RECEIVED, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49453 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 MISSING_SUBJECT Missing Subject: header 0.00 TO_CC_NONE No To: or Cc: header -0.00 NO_RECEIVED Informational: message has no Received headers 1.28 MISSING_SUBJECT_2 Missing Subject: header X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The current xfs_file_aio_write code is a mess of locking shenanigans to handle the different locking requirements of buffered and direct IO. Start to clean this up by disentangling the direct IO path from the mess. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_file.c | 184 +++++++++++++++++++++++++++--------------- 1 files changed, 118 insertions(+), 66 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index 4608aab..d70a249 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -587,6 +587,116 @@ out_lock: return error; } +/* + * xfs_file_dio_aio_write - handle direct IO writes + * + * Lock the inode appropriately to prepare for and issue a direct IO write. + * By spearating it from the buffered write path we remove all the tricky to + * follow locking changes and looping. This also clearly indicates that XFS + * does not fall back to buffered IO in the direct IO write path. + * + * Returns with locks held indicated by @need_i_mutex and @iolock. + */ +STATIC ssize_t +xfs_file_dio_aio_write( + struct kiocb *iocb, + const struct iovec *iovp, + unsigned long nr_segs, + loff_t pos, + size_t ocount, + int *need_i_mutex, + int *iolock) +{ + struct file *file = iocb->ki_filp; + struct address_space *mapping = file->f_mapping; + struct inode *inode = mapping->host; + struct xfs_inode *ip = XFS_I(inode); + struct xfs_mount *mp = ip->i_mount; + ssize_t error = 0; + xfs_fsize_t new_size; + size_t count = ocount; + xfs_buftarg_t *target = XFS_IS_REALTIME_INODE(ip) ? + mp->m_rtdev_targp : mp->m_ddev_targp; + + *need_i_mutex = 0; + *iolock = 0; + if ((pos & target->bt_smask) || (count & target->bt_smask)) + return XFS_ERROR(-EINVAL); + + if (mapping->nrpages || pos > ip->i_size) { + *iolock = XFS_IOLOCK_EXCL; + *need_i_mutex = 1; + mutex_lock(&inode->i_mutex); + } else { + *iolock = XFS_IOLOCK_SHARED; + } + xfs_ilock(ip, XFS_ILOCK_EXCL|*iolock); + + error = generic_write_checks(file, &pos, &count, + S_ISBLK(inode->i_mode)); + if (error) { + xfs_iunlock(ip, XFS_ILOCK_EXCL|*iolock); + *iolock = 0; + return error; + } + + new_size = pos + count; + if (new_size > ip->i_size) + ip->i_new_size = new_size; + + if (likely(!(file->f_mode & FMODE_NOCMTIME))) + file_update_time(file); + + /* + * If the offset is beyond the size of the file, we have a couple of + * things to do. First, if there is already space allocated we need to + * either create holes or zero the disk or ... + * + * If there is a page where the previous size lands, we need to zero it + * out up to the new size. + */ + if (pos > ip->i_size) { + error = -xfs_zero_eof(ip, pos, ip->i_size); + if (error) { + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return error; + } + } + xfs_iunlock(ip, XFS_ILOCK_EXCL); + + /* + * If we're writing the file then make sure to clear the setuid and + * setgid bits if the process is not being run by root. This keeps + * people from modifying setuid and setgid binaries. + */ + error = file_remove_suid(file); + if (unlikely(error)) + return error; + + if (mapping->nrpages) { + WARN_ON(*need_i_mutex == 0); + error = -xfs_flushinval_pages(ip, (pos & PAGE_CACHE_MASK), -1, + FI_REMAPF_LOCKED); + if (error) + return error; + } + + if (*need_i_mutex) { + /* demote the lock now the cached pages are gone */ + xfs_ilock_demote(ip, XFS_IOLOCK_EXCL); + mutex_unlock(&inode->i_mutex); + *iolock = XFS_IOLOCK_SHARED; + *need_i_mutex = 0; + } + + trace_xfs_file_direct_write(ip, count, iocb->ki_pos, 0); + error = generic_file_direct_write(iocb, iovp, + &nr_segs, pos, &iocb->ki_pos, count, ocount); + + /* No fallback to buffered IO on errors for XFS. */ + return error; +} + STATIC ssize_t xfs_file_aio_write( struct kiocb *iocb, @@ -628,19 +738,17 @@ xfs_file_aio_write( if (XFS_FORCED_SHUTDOWN(mp)) return -EIO; -relock: if (ioflags & IO_ISDIRECT) { - iolock = XFS_IOLOCK_SHARED; - need_i_mutex = 0; - } else { - iolock = XFS_IOLOCK_EXCL; - need_i_mutex = 1; - mutex_lock(&inode->i_mutex); + ret = xfs_file_dio_aio_write(iocb, iovp, nr_segs, pos, + ocount, &need_i_mutex, &iolock); + goto done_io; } + iolock = XFS_IOLOCK_EXCL; + need_i_mutex = 1; + mutex_lock(&inode->i_mutex); xfs_ilock(ip, XFS_ILOCK_EXCL|iolock); -start: error = -generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode)); if (error) { @@ -648,26 +756,6 @@ start: goto out_unlock_mutex; } - if (ioflags & IO_ISDIRECT) { - xfs_buftarg_t *target = - XFS_IS_REALTIME_INODE(ip) ? - mp->m_rtdev_targp : mp->m_ddev_targp; - - if ((pos & target->bt_smask) || (count & target->bt_smask)) { - xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock); - return XFS_ERROR(-EINVAL); - } - - if (!need_i_mutex && (mapping->nrpages || pos > ip->i_size)) { - xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock); - iolock = XFS_IOLOCK_EXCL; - need_i_mutex = 1; - mutex_lock(&inode->i_mutex); - xfs_ilock(ip, XFS_ILOCK_EXCL|iolock); - goto start; - } - } - new_size = pos + count; if (new_size > ip->i_size) ip->i_new_size = new_size; @@ -706,44 +794,7 @@ start: /* We can write back this queue in page reclaim */ current->backing_dev_info = mapping->backing_dev_info; - if ((ioflags & IO_ISDIRECT)) { - if (mapping->nrpages) { - WARN_ON(need_i_mutex == 0); - error = xfs_flushinval_pages(ip, - (pos & PAGE_CACHE_MASK), - -1, FI_REMAPF_LOCKED); - if (error) - goto out_unlock_internal; - } - - if (need_i_mutex) { - /* demote the lock now the cached pages are gone */ - xfs_ilock_demote(ip, XFS_IOLOCK_EXCL); - mutex_unlock(&inode->i_mutex); - - iolock = XFS_IOLOCK_SHARED; - need_i_mutex = 0; - } - - trace_xfs_file_direct_write(ip, count, iocb->ki_pos, ioflags); - ret = generic_file_direct_write(iocb, iovp, - &nr_segs, pos, &iocb->ki_pos, count, ocount); - - /* - * direct-io write to a hole: fall through to buffered I/O - * for completing the rest of the request. - */ - if (ret >= 0 && ret != count) { - XFS_STATS_ADD(xs_write_bytes, ret); - - pos += ret; - count -= ret; - - ioflags &= ~IO_ISDIRECT; - xfs_iunlock(ip, iolock); - goto relock; - } - } else { + if (!(ioflags & IO_ISDIRECT)) { int enospc = 0; ssize_t ret2 = 0; @@ -767,6 +818,7 @@ write_retry: current->backing_dev_info = NULL; +done_io: xfs_aio_write_isize_update(inode, &iocb->ki_pos, ret); error = -ret; -- 1.7.2.3 From SRS0+dQqb+18+fromorbit.com=dave@internode.on.net Tue Dec 14 19:23:37 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBF1NaRg159599 for ; Tue, 14 Dec 2010 19:23:37 -0600 X-ASG-Debug-ID: 1292376328-5e4802860000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B45971EC8A0 for ; Tue, 14 Dec 2010 17:25:28 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id LD9I4yWVSWnw1BNX for ; Tue, 14 Dec 2010 17:25:28 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50369427-1927428 for ; Wed, 15 Dec 2010 11:55:27 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PSg7I-00064M-2e for xfs@oss.sgi.com; Wed, 15 Dec 2010 12:25:16 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PSg5d-0004HK-Qd for xfs@oss.sgi.com; Wed, 15 Dec 2010 12:23:33 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 5/7] xfs: split buffered IO write path from xfs_file_aio_write Subject: [PATCH 5/7] xfs: split buffered IO write path from xfs_file_aio_write Date: Wed, 15 Dec 2010 12:23:26 +1100 Message-Id: <1292376208-16282-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292376208-16282-1-git-send-email-david@fromorbit.com> References: <1292376208-16282-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1292376329 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.73 X-Barracuda-Spam-Status: No, SCORE=-0.73 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_SUBJECT, MISSING_SUBJECT_2, NO_RECEIVED, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49453 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 MISSING_SUBJECT Missing Subject: header 0.00 TO_CC_NONE No To: or Cc: header -0.00 NO_RECEIVED Informational: message has no Received headers 1.28 MISSING_SUBJECT_2 Missing Subject: header X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Complete the split of the different write IO paths by splitting the buffered IO write path out of xfs_file_aio_write(). This makes the different mechanisms of the write patchs easier to follow. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_file.c | 160 ++++++++++++++++++++----------------------- 1 files changed, 75 insertions(+), 85 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index d70a249..e10e703 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -698,132 +698,123 @@ xfs_file_dio_aio_write( } STATIC ssize_t -xfs_file_aio_write( +xfs_file_buffered_aio_write( struct kiocb *iocb, const struct iovec *iovp, unsigned long nr_segs, - loff_t pos) + loff_t pos, + size_t ocount, + int *need_i_mutex, + int *iolock) { struct file *file = iocb->ki_filp; struct address_space *mapping = file->f_mapping; struct inode *inode = mapping->host; struct xfs_inode *ip = XFS_I(inode); - struct xfs_mount *mp = ip->i_mount; ssize_t ret = 0, error = 0; - int ioflags = 0; + int enospc = 0; xfs_fsize_t new_size; - int iolock; - size_t ocount = 0, count; - int need_i_mutex; - - XFS_STATS_INC(xs_write_calls); - - BUG_ON(iocb->ki_pos != pos); - - if (unlikely(file->f_flags & O_DIRECT)) - ioflags |= IO_ISDIRECT; - if (file->f_mode & FMODE_NOCMTIME) - ioflags |= IO_INVIS; - - error = generic_segment_checks(iovp, &nr_segs, &ocount, VERIFY_READ); - if (error) - return error; - - count = ocount; - if (count == 0) - return 0; - - xfs_wait_for_freeze(mp, SB_FREEZE_WRITE); - - if (XFS_FORCED_SHUTDOWN(mp)) - return -EIO; - - if (ioflags & IO_ISDIRECT) { - ret = xfs_file_dio_aio_write(iocb, iovp, nr_segs, pos, - ocount, &need_i_mutex, &iolock); - goto done_io; - } + size_t count = ocount; - iolock = XFS_IOLOCK_EXCL; - need_i_mutex = 1; + *iolock = XFS_IOLOCK_EXCL; + *need_i_mutex = 1; mutex_lock(&inode->i_mutex); - xfs_ilock(ip, XFS_ILOCK_EXCL|iolock); + xfs_ilock(ip, XFS_ILOCK_EXCL|*iolock); - error = -generic_write_checks(file, &pos, &count, + error = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode)); if (error) { - xfs_iunlock(ip, XFS_ILOCK_EXCL|iolock); - goto out_unlock_mutex; + xfs_iunlock(ip, XFS_ILOCK_EXCL|*iolock); + *iolock = 0; + return error; } new_size = pos + count; if (new_size > ip->i_size) ip->i_new_size = new_size; - if (likely(!(ioflags & IO_INVIS))) + if (likely(!(file->f_mode & FMODE_NOCMTIME))) file_update_time(file); - /* - * If the offset is beyond the size of the file, we have a couple - * of things to do. First, if there is already space allocated - * we need to either create holes or zero the disk or ... - * - * If there is a page where the previous size lands, we need - * to zero it out up to the new size. - */ - if (pos > ip->i_size) { - error = xfs_zero_eof(ip, pos, ip->i_size); + error = -xfs_zero_eof(ip, pos, ip->i_size); if (error) { xfs_iunlock(ip, XFS_ILOCK_EXCL); - goto out_unlock_internal; + return error; } } xfs_iunlock(ip, XFS_ILOCK_EXCL); - /* - * If we're writing the file then make sure to clear the - * setuid and setgid bits if the process is not being run - * by root. This keeps people from modifying setuid and - * setgid binaries. - */ - error = -file_remove_suid(file); + error = file_remove_suid(file); if (unlikely(error)) - goto out_unlock_internal; + return error; /* We can write back this queue in page reclaim */ current->backing_dev_info = mapping->backing_dev_info; - if (!(ioflags & IO_ISDIRECT)) { - int enospc = 0; - ssize_t ret2 = 0; - write_retry: - trace_xfs_file_buffered_write(ip, count, iocb->ki_pos, ioflags); - ret2 = generic_file_buffered_write(iocb, iovp, nr_segs, - pos, &iocb->ki_pos, count, ret); - /* - * if we just got an ENOSPC, flush the inode now we - * aren't holding any page locks and retry *once* - */ - if (ret2 == -ENOSPC && !enospc) { - error = xfs_flush_pages(ip, 0, -1, 0, FI_NONE); - if (error) - goto out_unlock_internal; - enospc = 1; - goto write_retry; - } - ret = ret2; + trace_xfs_file_buffered_write(ip, count, iocb->ki_pos, 0); + error = generic_file_buffered_write(iocb, iovp, nr_segs, + pos, &iocb->ki_pos, count, ret); + /* + * if we just got an ENOSPC, flush the inode now we aren't holding any + * page locks and retry *once* + */ + if (error == -ENOSPC && !enospc) { + error = -xfs_flush_pages(ip, 0, -1, 0, FI_NONE); + if (error) + return error; + enospc = 1; + goto write_retry; } - current->backing_dev_info = NULL; + return error; +} + +STATIC ssize_t +xfs_file_aio_write( + struct kiocb *iocb, + const struct iovec *iovp, + unsigned long nr_segs, + loff_t pos) +{ + struct file *file = iocb->ki_filp; + struct address_space *mapping = file->f_mapping; + struct inode *inode = mapping->host; + struct xfs_inode *ip = XFS_I(inode); + ssize_t ret = 0, error = 0; + int iolock; + size_t ocount = 0; + int need_i_mutex; + + XFS_STATS_INC(xs_write_calls); + + BUG_ON(iocb->ki_pos != pos); + + error = generic_segment_checks(iovp, &nr_segs, &ocount, VERIFY_READ); + if (error) + return error; + + if (ocount == 0) + return 0; + + xfs_wait_for_freeze(ip->i_mount, SB_FREEZE_WRITE); + + if (XFS_FORCED_SHUTDOWN(ip->i_mount)) + return -EIO; + + if (unlikely(file->f_flags & O_DIRECT)) + ret = xfs_file_dio_aio_write(iocb, iovp, nr_segs, pos, + ocount, &need_i_mutex, &iolock); + else + ret = xfs_file_buffered_aio_write(iocb, iovp, nr_segs, pos, + ocount, &need_i_mutex, &iolock); -done_io: xfs_aio_write_isize_update(inode, &iocb->ki_pos, ret); error = -ret; if (ret <= 0) - goto out_unlock_internal; + goto out_unlock; XFS_STATS_ADD(xs_write_bytes, ret); @@ -849,10 +840,9 @@ done_io: error = error2; } - out_unlock_internal: + out_unlock: xfs_aio_write_newsize_update(ip); xfs_iunlock(ip, iolock); - out_unlock_mutex: if (need_i_mutex) mutex_unlock(&inode->i_mutex); return -error; -- 1.7.2.3 From SRS0+NMKW+18+fromorbit.com=david@internode.on.net Tue Dec 14 20:49:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBF2n4PR163108 for ; Tue, 14 Dec 2010 20:49:05 -0600 X-ASG-Debug-ID: 1292381455-178a03310000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 43C8E1ECFDE for ; Tue, 14 Dec 2010 18:50:55 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id UBe9ceeBNZqncP6Y for ; Tue, 14 Dec 2010 18:50:55 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50136834-1927428 for multiple; Wed, 15 Dec 2010 13:20:51 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PShS5-0006BW-Rx; Wed, 15 Dec 2010 13:50:49 +1100 Date: Wed, 15 Dec 2010 13:50:49 +1100 From: Dave Chinner To: "Paul E. McKenney" Cc: xfs@oss.sgi.com, eric.dumazet@gmail.com X-ASG-Orig-Subj: Re: [PATCH 2/3] xfs: convert inode cache lookups to use RCU locking Subject: Re: [PATCH 2/3] xfs: convert inode cache lookups to use RCU locking Message-ID: <20101215025049.GE9925@dastard> References: <1292203957-15819-1-git-send-email-david@fromorbit.com> <1292203957-15819-3-git-send-email-david@fromorbit.com> <20101214211801.GH2161@linux.vnet.ibm.com> <20101214230047.GC16267@dastard> <20101215010536.GT2161@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101215010536.GT2161@linux.vnet.ibm.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1292381457 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.73 X-Barracuda-Spam-Status: No, SCORE=-0.73 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_SUBJECT, MISSING_SUBJECT_2, NO_RECEIVED, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49459 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 MISSING_SUBJECT Missing Subject: header 0.00 TO_CC_NONE No To: or Cc: header -0.00 NO_RECEIVED Informational: message has no Received headers 1.28 MISSING_SUBJECT_2 Missing Subject: header X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 14, 2010 at 05:05:36PM -0800, Paul E. McKenney wrote: > On Wed, Dec 15, 2010 at 10:00:47AM +1100, Dave Chinner wrote: > > On Tue, Dec 14, 2010 at 01:18:01PM -0800, Paul E. McKenney wrote: > > > On Mon, Dec 13, 2010 at 12:32:36PM +1100, Dave Chinner wrote: > > > > + /* > > > > + * check for re-use of an inode within an RCU grace period due to the > > > > + * radix tree nodes not being updated yet. We monitor for this by > > > > + * setting the inode number to zero before freeing the inode structure. > > > > + * If the inode has been reallocated and set up, then the inode number > > > > + * will not match, so check for that, too. > > > > + */ > > > > spin_lock(&ip->i_flags_lock); > > > > + if (ip->i_ino != ino) { > > > > + trace_xfs_iget_skip(ip); > > > > + XFS_STATS_INC(xs_ig_frecycle); > > > > + spin_unlock(&ip->i_flags_lock); > > > > + rcu_read_unlock(); > > > > + /* Expire the grace period so we don't trip over it again. */ > > > > + synchronize_rcu(); > > > > > > Hmmm... Interesting. Wouldn't the fact that we acquired the same lock > > > that was held after removing the inode guarantee that an immediate retry > > > would manage not to find this same inode again? > > > > That is what I'm not sure of. I was more worried about resolving the > > contents of the radix tree nodes, not so much the inode itself. If a > > new traversal will resolve the tree correctly (which is what you are > > implying), then synchronize_rcu() is not needed.... > > Here is the sequence of events that I believe must be in place: > s/vfs_inode/xfs_inode/g > 1. Some CPU removes the vfs_inode from the radix tree, presumably > while holding some lock whose identity does not matter here. Yes, the ->pag_ici_lock. > 2. Before invoking call_rcu() on a given vfs_inode, this same > CPU clears the inode number while holding ->i_flags_lock. Not necessarily the same CPU - there are points where we take sleeping locks for synchronisation with any remaining users, and we don't use preempt_disable() to prevent a change of CPU on a preemptible kernel. > If the CPU in #1 and #2 might be different, then either > CPU #1 must hold ->i_flags_lock while removing the vfs_inode > from the radix tree, or I don't understand how this can work > even with the synchronize_rcu(). I'm probably missing something, but why does the CPU we run call_rcu() to free the inode on matter w.r.t. which CPU it was deleted from the radix tree on? There is this comment in include/linux/radix-tree.h: * It is still required that the caller manage the synchronization and lifetimes * of the items. So if RCU lock-free lookups are used, typically this would mean * that the items have their own locks, or are amenable to lock-free access; and * that the items are freed by RCU (or only freed after having been deleted from * the radix tree *and* a synchronize_rcu() grace period). There is nothing there that mentions the items need to be deleted on the same CPU as they were removed from the radix tree or that the item lock needs to be held when the item is removed from the tree. AFAICT, the XFS code is following these guidelines. FWIW, this is where is got the idea of using synchronize_rcu() to ensure a llokup retry wouldn't see the same freed inode. I'm thinking that simply re-running the lookup will give the same guarantee because of the memory barriers in the radix tree lookup code... > 3. Some CPU, possibly different than that in #1 and #2 above, > executes the above code. If locking works correctly, it > must see the earlier changes, so a subsequent access should > see the results of #1 above, so that it won't see the element > that was removed there. Isn't the item validity considered separately to the tree traversal consistency? i.e. the item lock (i.e. ->i_flags_lock) provides a safe item validity check via the unlock->lock memory barrier, whilst the radix tree uses rcu_dereference() to provide memory barriers against the modifications? > That said, I don't claim to understand either vfs or xfs very well, so > I would be arbitrarily deeply confused. We might both be confused ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From sgi-linux-xfs@lo.gmane.org Tue Dec 14 23:48:24 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBF5mHKU172576 for ; Tue, 14 Dec 2010 23:48:23 -0600 X-ASG-Debug-ID: 1292392208-082c00460000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lo.gmane.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B5AE5145234A for ; Tue, 14 Dec 2010 21:50:08 -0800 (PST) Received: from lo.gmane.org (lo.gmane.org [80.91.229.12]) by cuda.sgi.com with ESMTP id ITGrhxFKWkLntQ56 for ; Tue, 14 Dec 2010 21:50:08 -0800 (PST) Received: from list by lo.gmane.org with local (Exim 4.69) (envelope-from ) id 1PSkFa-00030S-Cl for linux-xfs@oss.sgi.com; Wed, 15 Dec 2010 06:50:06 +0100 Received: from ppp121-45-207-179.lns20.cbr1.internode.on.net ([121.45.207.179]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 15 Dec 2010 06:50:06 +0100 Received: from npiggin by ppp121-45-207-179.lns20.cbr1.internode.on.net with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 15 Dec 2010 06:50:06 +0100 X-Injected-Via-Gmane: http://gmane.org/ To: linux-xfs@oss.sgi.com From: Nick Piggin X-ASG-Orig-Subj: Re: [PATCH 2/3] xfs: convert inode cache lookups to use RCU locking Subject: Re: [PATCH 2/3] xfs: convert inode cache lookups to use RCU locking Date: Wed, 15 Dec 2010 03:30:43 +0000 (UTC) Lines: 77 Message-ID: References: <1292203957-15819-1-git-send-email-david@fromorbit.com> <1292203957-15819-3-git-send-email-david@fromorbit.com> <20101214211801.GH2161@linux.vnet.ibm.com> <20101214230047.GC16267@dastard> <20101215010536.GT2161@linux.vnet.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Complaints-To: usenet@dough.gmane.org X-Gmane-NNTP-Posting-Host: sea.gmane.org User-Agent: Loom/3.14 (http://gmane.org/) X-Loom-IP: 121.45.207.179 (Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-us) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5) X-Barracuda-Connect: lo.gmane.org[80.91.229.12] X-Barracuda-Start-Time: 1292392209 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.73 X-Barracuda-Spam-Status: No, SCORE=-0.73 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_SUBJECT, MISSING_SUBJECT_2, NO_RECEIVED, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49470 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 MISSING_SUBJECT Missing Subject: header 0.00 TO_CC_NONE No To: or Cc: header -0.00 NO_RECEIVED Informational: message has no Received headers 1.28 MISSING_SUBJECT_2 Missing Subject: header X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Paul E. McKenney linux.vnet.ibm.com> writes: > On Wed, Dec 15, 2010 at 10:00:47AM +1100, Dave Chinner wrote: > > On Tue, Dec 14, 2010 at 01:18:01PM -0800, Paul E. McKenney wrote: > > > On Mon, Dec 13, 2010 at 12:32:36PM +1100, Dave Chinner wrote: > > > > > > > > + /* > > > > + * check for re-use of an inode within an RCU grace period due to the > > > > + * radix tree nodes not being updated yet. We monitor for this by > > > > + * setting the inode number to zero before freeing the inode structure. > > > > + * If the inode has been reallocated and set up, then the inode number > > > > + * will not match, so check for that, too. > > > > + */ > > > > spin_lock(&ip->i_flags_lock); > > > > + if (ip->i_ino != ino) { > > > > + trace_xfs_iget_skip(ip); > > > > + XFS_STATS_INC(xs_ig_frecycle); > > > > + spin_unlock(&ip->i_flags_lock); > > > > + rcu_read_unlock(); > > > > + /* Expire the grace period so we don't trip over it again. */ > > > > + synchronize_rcu(); > > > > > > Hmmm... Interesting. Wouldn't the fact that we acquired the same lock > > > that was held after removing the inode guarantee that an immediate retry > > > would manage not to find this same inode again? > > > > That is what I'm not sure of. I was more worried about resolving the > > contents of the radix tree nodes, not so much the inode itself. If a > > new traversal will resolve the tree correctly (which is what you are > > implying), then synchronize_rcu() is not needed.... [...] > > > If this is not the case, then readers finding it again will not be > > > protected by the RCU grace period, right? > > > > > > In short, I don't understand why the synchronize_rcu() is needed. > > > If it is somehow helping, that sounds to me like it is covering up > > > a real bug that should be fixed separately. > > > > It isn't covering up a bug, it was more tryingt o be consistent with > > the rest of the xfs_inode lookup failures - we back off and try > > again later. If that is unnecessary resolve the RCU lookup race, > > then it can be dropped. The RCU radix tree should have the same type of causality semantics as, say, loading and storing a single word, if that helps think about it. So the favourite sequence: x = 1; smp_wmb(); y = 1; r2 = y; smp_rmb(); r1 = x; Then r2 == 1 implies r1 == 1. Ie. if we "see" something has happened on a CPU (from another CPU), then we will also see everything that has previously happened on that CPU (provided the correct barriers are there). radix_tree_delete(&tree, idx); smp_wmb(); y = 1; r2 = y; smp_rmb(); r1 = radix_tree_lookup(&tree, idx); So if we see r2 == 1, then r1 will be NULL. In this case, if you can observe something that has happened after the inode is removed from the tree (ie. i_ino has changed), then you should not find it in the tree after a subsequent lookup (no synchronize_rcu required, just appropriate locking or barriers). BTW. I wondered if you can also do the radix_tree tag lookup for reclaim under RCU? From paulmck@paulmck-ThinkPad-W500linux.vnet.ibm.com Wed Dec 15 00:32:47 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBF6WkqF177346 for ; Wed, 15 Dec 2010 00:32:47 -0600 X-ASG-Debug-ID: 1292394878-1d3603810000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from e7.ny.us.ibm.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3A6671CC88FA for ; Tue, 14 Dec 2010 22:34:38 -0800 (PST) Received: from e7.ny.us.ibm.com (e7.ny.us.ibm.com [32.97.182.137]) by cuda.sgi.com with ESMTP id K5aMZRLJ3Rh0Q5ef for ; Tue, 14 Dec 2010 22:34:38 -0800 (PST) Received: from d01dlp02.pok.ibm.com (d01dlp02.pok.ibm.com [9.56.224.85]) by e7.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id oBF6GoQu019515 for ; Wed, 15 Dec 2010 01:16:50 -0500 Received: from d01relay05.pok.ibm.com (d01relay05.pok.ibm.com [9.56.227.237]) by d01dlp02.pok.ibm.com (Postfix) with ESMTP id 39CED4DE803E for ; Wed, 15 Dec 2010 01:32:32 -0500 (EST) Received: from d01av04.pok.ibm.com (d01av04.pok.ibm.com [9.56.224.64]) by d01relay05.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id oBF6YbdY163328 for ; Wed, 15 Dec 2010 01:34:37 -0500 Received: from d01av04.pok.ibm.com (loopback [127.0.0.1]) by d01av04.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id oBF6YbFk023568 for ; Wed, 15 Dec 2010 01:34:37 -0500 Received: from paulmck-ThinkPad-W500 (sig-9-65-65-137.mts.ibm.com [9.65.65.137]) by d01av04.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id oBF6YalE023532; Wed, 15 Dec 2010 01:34:36 -0500 Received: by paulmck-ThinkPad-W500 (Postfix, from userid 1000) id C85CB13F812; Tue, 14 Dec 2010 22:34:35 -0800 (PST) Date: Tue, 14 Dec 2010 22:34:35 -0800 From: "Paul E. McKenney" To: Dave Chinner Cc: xfs@oss.sgi.com, eric.dumazet@gmail.com X-ASG-Orig-Subj: Re: [PATCH 2/3] xfs: convert inode cache lookups to use RCU locking Subject: Re: [PATCH 2/3] xfs: convert inode cache lookups to use RCU locking Message-ID: <20101215063435.GB2217@linux.vnet.ibm.com> Reply-To: paulmck@linux.vnet.ibm.com References: <1292203957-15819-1-git-send-email-david@fromorbit.com> <1292203957-15819-3-git-send-email-david@fromorbit.com> <20101214211801.GH2161@linux.vnet.ibm.com> <20101214230047.GC16267@dastard> <20101215010536.GT2161@linux.vnet.ibm.com> <20101215025049.GE9925@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101215025049.GE9925@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) X-Content-Scanned: Fidelis XPS MAILER X-Barracuda-Connect: e7.ny.us.ibm.com[32.97.182.137] X-Barracuda-Start-Time: 1292394879 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.73 X-Barracuda-Spam-Status: No, SCORE=-0.73 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_SUBJECT, MISSING_SUBJECT_2, NO_RECEIVED, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49473 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 MISSING_SUBJECT Missing Subject: header 0.00 TO_CC_NONE No To: or Cc: header -0.00 NO_RECEIVED Informational: message has no Received headers 1.28 MISSING_SUBJECT_2 Missing Subject: header X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 15, 2010 at 01:50:49PM +1100, Dave Chinner wrote: > On Tue, Dec 14, 2010 at 05:05:36PM -0800, Paul E. McKenney wrote: > > On Wed, Dec 15, 2010 at 10:00:47AM +1100, Dave Chinner wrote: > > > On Tue, Dec 14, 2010 at 01:18:01PM -0800, Paul E. McKenney wrote: > > > > On Mon, Dec 13, 2010 at 12:32:36PM +1100, Dave Chinner wrote: > > > > > + /* > > > > > + * check for re-use of an inode within an RCU grace period due to the > > > > > + * radix tree nodes not being updated yet. We monitor for this by > > > > > + * setting the inode number to zero before freeing the inode structure. > > > > > + * If the inode has been reallocated and set up, then the inode number > > > > > + * will not match, so check for that, too. > > > > > + */ > > > > > spin_lock(&ip->i_flags_lock); > > > > > + if (ip->i_ino != ino) { > > > > > + trace_xfs_iget_skip(ip); > > > > > + XFS_STATS_INC(xs_ig_frecycle); > > > > > + spin_unlock(&ip->i_flags_lock); > > > > > + rcu_read_unlock(); > > > > > + /* Expire the grace period so we don't trip over it again. */ > > > > > + synchronize_rcu(); > > > > > > > > Hmmm... Interesting. Wouldn't the fact that we acquired the same lock > > > > that was held after removing the inode guarantee that an immediate retry > > > > would manage not to find this same inode again? > > > > > > That is what I'm not sure of. I was more worried about resolving the > > > contents of the radix tree nodes, not so much the inode itself. If a > > > new traversal will resolve the tree correctly (which is what you are > > > implying), then synchronize_rcu() is not needed.... > > > > Here is the sequence of events that I believe must be in place: > > s/vfs_inode/xfs_inode/g Good point! > > 1. Some CPU removes the vfs_inode from the radix tree, presumably > > while holding some lock whose identity does not matter here. > > Yes, the ->pag_ici_lock. OK. > > 2. Before invoking call_rcu() on a given vfs_inode, this same > > CPU clears the inode number while holding ->i_flags_lock. > > Not necessarily the same CPU - there are points where we take > sleeping locks for synchronisation with any remaining users, and > we don't use preempt_disable() to prevent a change of CPU on a > preemptible kernel. > > > If the CPU in #1 and #2 might be different, then either > > CPU #1 must hold ->i_flags_lock while removing the vfs_inode > > from the radix tree, or I don't understand how this can work > > even with the synchronize_rcu(). > > I'm probably missing something, but why does the CPU we run > call_rcu() to free the inode on matter w.r.t. which CPU it was > deleted from the radix tree on? I was oversimplifying. What matters is that the item was deleted from the radix tree unambiguously before it was passed to call_rcu(). There are a number of ways to make this happen: 1. Do the removal and the call_rcu() on the same CPU, in that order. 2. Do the removal while holding a given lock, and do the call_rcu() under a later critical section for that same lock. 3. Do the removal while holding lock A one CPU 1, then later acquire lock B on CPU 1, and then do the call_rcu() after a later acquisition of lock B on some other CPU. There are a bunch of other variations on this theme, but the key requirement is again that the call_rcu() happen unambiguously after the removal. Otherwise, how is the grace period supposed to guarantee that all RCU readers that might be accessing the removed xfs_inode really have completed? > There is this comment in include/linux/radix-tree.h: > > * It is still required that the caller manage the synchronization and lifetimes > * of the items. So if RCU lock-free lookups are used, typically this would mean > * that the items have their own locks, or are amenable to lock-free access; and > * that the items are freed by RCU (or only freed after having been deleted from > * the radix tree *and* a synchronize_rcu() grace period). > > There is nothing there that mentions the items need to be deleted on > the same CPU as they were removed from the radix tree or that the > item lock needs to be held when the item is removed from the tree. > AFAICT, the XFS code is following these guidelines. Well, the grace period (from either synchronize_rcu() or call_rcu()) does need to start unambiguously after the deletion from the radix tree. Should we upgrade the comment? > FWIW, this is where is got the idea of using synchronize_rcu() to > ensure a llokup retry wouldn't see the same freed inode. I'm > thinking that simply re-running the lookup will give the same > guarantee because of the memory barriers in the radix tree lookup > code... Maybe... But we do need to be sure, right? > > 3. Some CPU, possibly different than that in #1 and #2 above, > > executes the above code. If locking works correctly, it > > must see the earlier changes, so a subsequent access should > > see the results of #1 above, so that it won't see the element > > that was removed there. > > Isn't the item validity considered separately to the tree traversal > consistency? i.e. the item lock (i.e. ->i_flags_lock) provides a > safe item validity check via the unlock->lock memory barrier, whilst > the radix tree uses rcu_dereference() to provide memory barriers > against the modifications? But the safe validity check assumes that the RCU grace period starts unambiguously after the item has been removed. Violate that assumption, and all bets are off. > > That said, I don't claim to understand either vfs or xfs very well, so > > I would be arbitrarily deeply confused. > > We might both be confused ;) Sounds like the most likely possibility, now that you mention it. ;-) Thanx, Paul From SRS0+ffzZ+18+fromorbit.com=david@internode.on.net Wed Dec 15 00:33:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBF6XjkZ177419 for ; Wed, 15 Dec 2010 00:33:45 -0600 X-ASG-Debug-ID: 1292394936-247802d50000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 38A411CC890C for ; Tue, 14 Dec 2010 22:35:37 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id jYwr0BxLiPUek3GE for ; Tue, 14 Dec 2010 22:35:37 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49915167-1927428 for multiple; Wed, 15 Dec 2010 17:05:36 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PSkxa-0006SF-Fe; Wed, 15 Dec 2010 17:35:34 +1100 Date: Wed, 15 Dec 2010 17:35:34 +1100 From: Dave Chinner To: Nick Piggin Cc: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/3] xfs: convert inode cache lookups to use RCU locking Subject: Re: [PATCH 2/3] xfs: convert inode cache lookups to use RCU locking Message-ID: <20101215063534.GF9925@dastard> References: <1292203957-15819-1-git-send-email-david@fromorbit.com> <1292203957-15819-3-git-send-email-david@fromorbit.com> <20101214211801.GH2161@linux.vnet.ibm.com> <20101214230047.GC16267@dastard> <20101215010536.GT2161@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1292394938 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.73 X-Barracuda-Spam-Status: No, SCORE=-0.73 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_SUBJECT, MISSING_SUBJECT_2, NO_RECEIVED, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49473 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 MISSING_SUBJECT Missing Subject: header 0.00 TO_CC_NONE No To: or Cc: header -0.00 NO_RECEIVED Informational: message has no Received headers 1.28 MISSING_SUBJECT_2 Missing Subject: header X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 15, 2010 at 03:30:43AM +0000, Nick Piggin wrote: > In this case, if you can observe something that has happened after the > inode is removed from the tree (ie. i_ino has changed), then you should > not find it in the tree after a subsequent lookup (no synchronize_rcu > required, just appropriate locking or barriers). Ok, that's what I thought was supposed to be the case. Thanks for confirming that, Nick. > BTW. I wondered if you can also do the radix_tree tag lookup for reclaim > under RCU? It's currently under the ->pag_ici_lock using a radix_tree_gang_lookup_tag, though I think this was a mismerge bug from an earlier version. I intended it to be under RCU as the "inode OK for reclaim" validation checks won't touch an inode that already has XFS_IRECLAIM already set (i.e. already under reclaim or freed), so the reliability of tag lookups is not a big deal. The lookup probably needs to check if XFS_IRECLAIMABLE is set (rather than asserting it is set) to avoid so as to only reclaim inodes that are really in the reclaimable state. Note that ->i_flags_lock controls all the state changes, so it should provide the necessary item memory barriers to ensure that only reclaimable inodes are found for reclaim. Cheers, Dave. -- Dave Chinner david@fromorbit.com From npiggin@kernel.dk Wed Dec 15 02:03:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBF83cAF182974 for ; Wed, 15 Dec 2010 02:03:38 -0600 X-ASG-Debug-ID: 1292400329-1915016e0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail07.adl2.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 036381CC8FBF for ; Wed, 15 Dec 2010 00:05:30 -0800 (PST) Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id hl9NZe9x6DOYAbbL for ; Wed, 15 Dec 2010 00:05:30 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvsEAJoDCE15Lc+z/2dsb2JhbACkI3TBMYVKBA Received: from ppp121-45-207-179.lns20.cbr1.internode.on.net (HELO laptop.local0.net) ([121.45.207.179]) by ipmail07.adl2.internode.on.net with ESMTP; 15 Dec 2010 18:35:28 +1030 Received: by laptop.local0.net (Postfix, from userid 1000) id 6D3CB2981A; Wed, 15 Dec 2010 19:05:25 +1100 (EST) Date: Wed, 15 Dec 2010 19:05:25 +1100 From: Nick Piggin To: Dave Chinner Cc: Nick Piggin , linux-xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/3] xfs: convert inode cache lookups to use RCU locking Subject: Re: [PATCH 2/3] xfs: convert inode cache lookups to use RCU locking Message-ID: <20101215080525.GA4199@amd> References: <1292203957-15819-1-git-send-email-david@fromorbit.com> <1292203957-15819-3-git-send-email-david@fromorbit.com> <20101214211801.GH2161@linux.vnet.ibm.com> <20101214230047.GC16267@dastard> <20101215010536.GT2161@linux.vnet.ibm.com> <20101215063534.GF9925@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101215063534.GF9925@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1292400331 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.73 X-Barracuda-Spam-Status: No, SCORE=-0.73 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_SUBJECT, MISSING_SUBJECT_2, NO_RECEIVED, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49479 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 MISSING_SUBJECT Missing Subject: header 0.00 TO_CC_NONE No To: or Cc: header -0.00 NO_RECEIVED Informational: message has no Received headers 1.28 MISSING_SUBJECT_2 Missing Subject: header X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 15, 2010 at 05:35:34PM +1100, Dave Chinner wrote: > On Wed, Dec 15, 2010 at 03:30:43AM +0000, Nick Piggin wrote: > > In this case, if you can observe something that has happened after the > > inode is removed from the tree (ie. i_ino has changed), then you should > > not find it in the tree after a subsequent lookup (no synchronize_rcu > > required, just appropriate locking or barriers). > > Ok, that's what I thought was supposed to be the case. Thanks > for confirming that, Nick. > > > BTW. I wondered if you can also do the radix_tree tag lookup for reclaim > > under RCU? > > It's currently under the ->pag_ici_lock using a > radix_tree_gang_lookup_tag, though I think this was a mismerge bug > from an earlier version. > > I intended it to be under RCU as the "inode OK for reclaim" > validation checks won't touch an inode that already has XFS_IRECLAIM > already set (i.e. already under reclaim or freed), so the > reliability of tag lookups is not a big deal. That would be nice, a while back I was seeing lock contention in reclaim there, and tried some hacks to improve it, but this should solve it properly. The tag lookups should be reliable too -- we use them in pagecache dirty writeout. Basically same causality rules: if we observe (given the required barriers or locks) an event we know to have happened after the tag was set and before it is cleared, then the tag lookup should find the item. > The lookup probably needs to check if XFS_IRECLAIMABLE is set > (rather than asserting it is set) to avoid so as to only reclaim > inodes that are really in the reclaimable state. Note that > ->i_flags_lock controls all the state changes, so it should provide > the necessary item memory barriers to ensure that only reclaimable > inodes are found for reclaim. If you are checking and clearing those flags under lock, then I think everything will be fine. lock() set deleted flag unlock() delete from radix tree versus look up from radix tree lock() check deleted flag... Then at this point we would know that if the deleted flag is not set, then the item can not have been deleted from the radix tree by the 1st sequence. The stores that delete the item from the radix tree may be visible before the deleted flag is visible (due to release-barrier ordering), but that's not a problem here. Thanks, Nick From BATV+dac281eab5e50afe0418+2670+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 15 06:06:52 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBFC6otT199050 for ; Wed, 15 Dec 2010 06:06:52 -0600 X-ASG-Debug-ID: 1292414923-73a701610000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9A41E1CCCCC0 for ; Wed, 15 Dec 2010 04:08:43 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id LQ13HFLELeItFaFh for ; Wed, 15 Dec 2010 04:08:43 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PSq9w-0007jD-94; Wed, 15 Dec 2010 12:08:40 +0000 Date: Wed, 15 Dec 2010 07:08:40 -0500 From: Christoph Hellwig To: "Zhong, Xin" Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH v3] xfstests: pwrite hang when writing from mmaped buffer of the same page Subject: Re: [PATCH v3] xfstests: pwrite hang when writing from mmaped buffer of the same page Message-ID: <20101215120840.GA29650@infradead.org> References: <1292304018-10827-1-git-send-email-xin.zhong@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292304018-10827-1-git-send-email-xin.zhong@intel.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[18.85.46.34] X-Barracuda-Start-Time: 1292414923 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 14, 2010 at 01:20:18PM +0800, Zhong, Xin wrote: > The problem is found in meego testing on btrfs: > http://bugs.meego.com/show_bug.cgi?id=6672 > > Reviewed-by: Hellwig, Christoph and Chinner, Dave > Signed-off-by: Zhong, Xin Thanks, the new patch looks good. I'll fix up the rewiewed-by line to be two separate ones, and move the variable declarations to the top of the main functions as pointed out by Dave and will commit it. From BATV+dac281eab5e50afe0418+2670+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 15 06:16:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBFCGJGr199734 for ; Wed, 15 Dec 2010 06:16:19 -0600 X-ASG-Debug-ID: 1292415493-730e02530000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 57F7C1CCCD81 for ; Wed, 15 Dec 2010 04:18:13 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id R9gnQE60hZ3ufD8U for ; Wed, 15 Dec 2010 04:18:13 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PSqJ9-0000pw-5x; Wed, 15 Dec 2010 12:18:11 +0000 Date: Wed, 15 Dec 2010 07:18:11 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: provide a inode iolock lockdep class Subject: Re: [PATCH] xfs: provide a inode iolock lockdep class Message-ID: <20101215121811.GA3122@infradead.org> References: <1292202431-15320-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292202431-15320-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[18.85.46.34] X-Barracuda-Start-Time: 1292415493 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 13, 2010 at 12:07:11PM +1100, Dave Chinner wrote: > From: Dave Chinner > > The XFS iolock needs to be re-initialised to a new lock class before > it enters reclaim to prevent lockdep false positives. Unfortunately, > this is not sufficient protection as inodes in the XFS_IRECLAIMABLE > state can be recycled and not re-initialised before being reused. > > We need to re-initialise the lock state when transfering out of > XFS_IRECLAIMABLE state to XFS_INEW, but we need to keep the same > class as if the inode was just allocated. Hence we need a specific > lockdep class variable for the iolock so that both initialisations > use the same class. > > While there, add a specific class for inodes in the reclaim state so > that it is easy to tell from lockdep reports what state the inode > was in that generated the report. Looks good to me. As long as we have the mrlock abstraction we might as well hide this behind it, but as I plan on killing the abstraction that's probably not worth the effort. Reviewed-by: Christoph Hellwig From branto@redhat.com Wed Dec 15 09:05:41 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBFF5fHr211493 for ; Wed, 15 Dec 2010 09:05:41 -0600 X-ASG-Debug-ID: 1292425654-06eb02f00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 262981CCD204 for ; Wed, 15 Dec 2010 07:07:34 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Cp3BPprD7CCX620o for ; Wed, 15 Dec 2010 07:07:34 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation 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.13.8/8.13.8) with ESMTP id oBFF7VK3022704 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 15 Dec 2010 10:07:31 -0500 Received: from [10.34.26.208] (dhcp-26-208.brq.redhat.com [10.34.26.208]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id oBFF5dW4013811 for ; Wed, 15 Dec 2010 10:05:39 -0500 X-ASG-Orig-Subj: xfstests: filter spaces in xfs_quota output in test case 108 Subject: xfstests: filter spaces in xfs_quota output in test case 108 From: Boris Ranto To: xfs Content-Type: text/plain; charset="UTF-8" Date: Wed, 15 Dec 2010 16:05:38 +0100 Message-ID: <1292425538.3220.14.camel@dhcp-31-190.brq.redhat.com> Mime-Version: 1.0 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1292425655 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Program xfs_quota can output different amounts of spaces when it is trying to align its output. This can cause output mismatch on several systems when testing test case 108. Attached patch will filter all the consecutive spaces in xfs_quota output to just one space making the test case independent of the alignment. Signed-off-by: Boris Ranto diff -urpN a/xfstests/108 b/xfstests/108 --- a/xfstests/108 2010-12-09 11:34:37.733245986 +0100 +++ b/xfstests/108 2010-12-14 14:50:16.813494309 +0100 @@ -72,9 +72,9 @@ test_accounting() for file in $SCRATCH_MNT/{buffer,direct,mmap}; do $here/src/lstat64 $file | head -3 | _filter_scratch done - xfs_quota -c "quota -hnb -$type $id" $QARGS | _filter_scratch - xfs_quota -c "quota -hni -$type $id" $QARGS | _filter_scratch - xfs_quota -c "quota -hnr -$type $id" $QARGS | _filter_scratch + xfs_quota -c "quota -hnb -$type $id" $QARGS | _filter_scratch | _filter_spaces + xfs_quota -c "quota -hni -$type $id" $QARGS | _filter_scratch | _filter_spaces + xfs_quota -c "quota -hnr -$type $id" $QARGS | _filter_scratch | _filter_spaces } export MOUNT_OPTIONS="-opquota" diff -urpN a/xfstests/108.out b/xfstests/108.out --- a/xfstests/108.out 2010-12-09 11:24:48.973251551 +0100 +++ b/xfstests/108.out 2010-12-14 15:01:33.640484268 +0100 @@ -32,11 +32,11 @@ projid = 3 Size: 16777216 Filetype: Regular File Mode: (0600/-rw-------) Uid: (1) Gid: (2) Disk quotas for User #1 (1) -Filesystem Blocks Quota Limit Warn/Time Mounted on -SCRATCH_DEV 48M 0 0 00 [------] SCRATCH_MNT +Filesystem Blocks Quota Limit Warn/Time Mounted on +SCRATCH_DEV 48M 0 0 00 [------] SCRATCH_MNT Disk quotas for User #1 (1) -Filesystem Files Quota Limit Warn/Time Mounted on -SCRATCH_DEV 3 0 0 00 [------] SCRATCH_MNT +Filesystem Files Quota Limit Warn/Time Mounted on +SCRATCH_DEV 3 0 0 00 [------] SCRATCH_MNT ### test group accounting @@ -64,11 +64,11 @@ projid = 3 Size: 16777216 Filetype: Regular File Mode: (0600/-rw-------) Uid: (1) Gid: (2) Disk quotas for Group #2 (2) -Filesystem Blocks Quota Limit Warn/Time Mounted on -SCRATCH_DEV 48M 0 0 00 [------] SCRATCH_MNT +Filesystem Blocks Quota Limit Warn/Time Mounted on +SCRATCH_DEV 48M 0 0 00 [------] SCRATCH_MNT Disk quotas for Group #2 (2) -Filesystem Files Quota Limit Warn/Time Mounted on -SCRATCH_DEV 3 0 0 00 [------] SCRATCH_MNT +Filesystem Files Quota Limit Warn/Time Mounted on +SCRATCH_DEV 3 0 0 00 [------] SCRATCH_MNT ### create files, setting up ownership (type=p) File: "SCRATCH_MNT/buffer" @@ -94,8 +94,8 @@ projid = 3 Size: 16777216 Filetype: Regular File Mode: (0600/-rw-------) Uid: (1) Gid: (2) Disk quotas for Project #3 (3) -Filesystem Blocks Quota Limit Warn/Time Mounted on -SCRATCH_DEV 48M 0 0 00 [------] SCRATCH_MNT +Filesystem Blocks Quota Limit Warn/Time Mounted on +SCRATCH_DEV 48M 0 0 00 [------] SCRATCH_MNT Disk quotas for Project #3 (3) -Filesystem Files Quota Limit Warn/Time Mounted on -SCRATCH_DEV 3 0 0 00 [------] SCRATCH_MNT +Filesystem Files Quota Limit Warn/Time Mounted on +SCRATCH_DEV 3 0 0 00 [------] SCRATCH_MNT diff -urpN a/xfstests/common.filter b/xfstests/common.filter --- a/xfstests/common.filter 2010-12-09 11:24:44.315240233 +0100 +++ b/xfstests/common.filter 2010-12-14 14:45:53.566228712 +0100 @@ -224,5 +224,10 @@ _filter_scratch() sed -e "s,$SCRATCH_DEV,SCRATCH_DEV,g" -e "s,$SCRATCH_MNT,SCRATCH_MNT,g" } +_filter_spaces() +{ + sed -e 's/ [ ]*/ /g' +} + # make sure this script returns success /bin/true From SZak@nds.com Wed Dec 15 09:36:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.8 required=5.0 tests=BAYES_50,HTML_MESSAGE autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBFFajZc213630 for ; Wed, 15 Dec 2010 09:36:45 -0600 X-ASG-Debug-ID: 1292427516-626c035d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ilsmtp.nds.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1F0D41F35CC for ; Wed, 15 Dec 2010 07:38:37 -0800 (PST) Received: from ilsmtp.nds.com (ilsmtp.nds.com [192.118.32.12]) by cuda.sgi.com with ESMTP id fXVZwqQ3bu966lBA for ; Wed, 15 Dec 2010 07:38:37 -0800 (PST) From: "Zak, Semion" To: "xfs@oss.sgi.com" CC: XTV FS Group Date: Wed, 15 Dec 2010 17:39:03 +0200 X-ASG-Orig-Subj: XFS in LINUX embedded environment Subject: XFS in LINUX embedded environment Thread-Topic: XFS in LINUX embedded environment Thread-Index: AcucbjKFOfu2hNPnQMKpWG/dmqVFtQ== Message-ID: <6385EF5E30011E42B75895D851412B2A64BB14EFEA@ILMA1.IL.NDS.COM> 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_6385EF5E30011E42B75895D851412B2A64BB14EFEAILMA1ILNDSCOM_" MIME-Version: 1.0 X-Barracuda-Connect: ilsmtp.nds.com[192.118.32.12] X-Barracuda-Start-Time: 1292427518 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.73 X-Barracuda-Spam-Status: No, SCORE=-0.73 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=HTML_MESSAGE, MISSING_SUBJECT, MISSING_SUBJECT_2, NO_RECEIVED, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49509 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.01 MISSING_SUBJECT Missing Subject: header 0.00 TO_CC_NONE No To: or Cc: header -0.00 NO_RECEIVED Informational: message has no Received headers 1.28 MISSING_SUBJECT_2 Missing Subject: header X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --_000_6385EF5E30011E42B75895D851412B2A64BB14EFEAILMA1ILNDSCOM_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hi, I try to use XFS in LINUX embedded environment, without virtual memory. In one of the tests I got "Out of memory" error. My question is: Is it possible to bound or decrease memory use by XFS? Thanks, Semion. ________________________________ This message is confidential and intended only for the addressee. If you ha= ve received this message in error, please immediately notify the postmaster= @nds.com and delete it from your system as well as any copies. The content = of e-mails as well as traffic data may be monitored by NDS for employment a= nd security purposes. To protect the environment please do not print this e-mail unless necessary= . An NDS Group Limited company. www.nds.com --_000_6385EF5E30011E42B75895D851412B2A64BB14EFEAILMA1ILNDSCOM_ Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

Hi,

I try to use XFS in LINUX embedded environment, with= out virtual memory.

In one of the tests I got “Out of memory”= ; error.

My question is:

 

Is it possible to bound or decrease memory use by XF= S?

 

 

Thanks,

 

Semion.



This message is confidential= and intended only for the addressee. If you have received this message in = error, please immediately notify the postmaster@nds.com and delete it from = your system as well as any copies. The content of e-mails as well as traffic data may be monitored by NDS for emp= loyment and security purposes.
To protect the environment please do not print this e-mail unless necessary= .

An NDS Group Limited company. www.nds.com
--_000_6385EF5E30011E42B75895D851412B2A64BB14EFEAILMA1ILNDSCOM_-- From BATV+dac281eab5e50afe0418+2670+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 15 12:55:41 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBFItew4228957 for ; Wed, 15 Dec 2010 12:55:41 -0600 X-ASG-Debug-ID: 1292439453-4b0a00320000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 829231F5092 for ; Wed, 15 Dec 2010 10:57:34 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id ZhTKZfFnde5fCdD8 for ; Wed, 15 Dec 2010 10:57:34 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PSwXc-0002qV-A9; Wed, 15 Dec 2010 18:57:32 +0000 Date: Wed, 15 Dec 2010 13:57:32 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: dynamic speculative EOF preallocation Subject: Re: [PATCH 1/2] xfs: dynamic speculative EOF preallocation Message-ID: <20101215185732.GA10826@infradead.org> References: <1292203511-15685-1-git-send-email-david@fromorbit.com> <1292203511-15685-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292203511-15685-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[18.85.46.34] X-Barracuda-Start-Time: 1292439454 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean With this patch my 32-bit x86 VM hangs when running test 014, although I can interrupt it. With the full patchset applied I get softlockup warnings in this test for xfsaild, which seems related. Also test 012 fails, but that might be intentional (?). From SRS0+YXM++18+fromorbit.com=david@internode.on.net Wed Dec 15 16:55:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBFMtLSE246673 for ; Wed, 15 Dec 2010 16:55:22 -0600 X-ASG-Debug-ID: 1292453833-736a03950000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 11AE31F5F76 for ; Wed, 15 Dec 2010 14:57:13 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id wz319DeiaLh27TTF for ; Wed, 15 Dec 2010 14:57:13 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49838529-1927428 for multiple; Thu, 16 Dec 2010 09:27:12 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PT0HW-0007oy-MR; Thu, 16 Dec 2010 09:57:10 +1100 Date: Thu, 16 Dec 2010 09:57:10 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: provide a inode iolock lockdep class Subject: Re: [PATCH] xfs: provide a inode iolock lockdep class Message-ID: <20101215225710.GG9925@dastard> References: <1292202431-15320-1-git-send-email-david@fromorbit.com> <20101215121811.GA3122@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101215121811.GA3122@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1292453835 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49539 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 15, 2010 at 07:18:11AM -0500, Christoph Hellwig wrote: > On Mon, Dec 13, 2010 at 12:07:11PM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > The XFS iolock needs to be re-initialised to a new lock class before > > it enters reclaim to prevent lockdep false positives. Unfortunately, > > this is not sufficient protection as inodes in the XFS_IRECLAIMABLE > > state can be recycled and not re-initialised before being reused. > > > > We need to re-initialise the lock state when transfering out of > > XFS_IRECLAIMABLE state to XFS_INEW, but we need to keep the same > > class as if the inode was just allocated. Hence we need a specific > > lockdep class variable for the iolock so that both initialisations > > use the same class. > > > > While there, add a specific class for inodes in the reclaim state so > > that it is easy to tell from lockdep reports what state the inode > > was in that generated the report. > > Looks good to me. As long as we have the mrlock abstraction we might as > well hide this behind it, but as I plan on killing the abstraction > that's probably not worth the effort. I thought about doing that, too, after looking at what the abstraction still provides us with. I think it only provides an extra "is write locked" debug check which I think could be added to the generic rwsem code pretty easily. But I've got a big enough patch stack out for review right now. ;) > Reviewed-by: Christoph Hellwig Thanks, I'll add it to the for-2.6.38 stack. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+T1S8+18+fromorbit.com=david@internode.on.net Wed Dec 15 16:57:02 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBFMv2hH246821 for ; Wed, 15 Dec 2010 16:57:02 -0600 X-ASG-Debug-ID: 1292453933-0b4f034b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6D0311458CC4 for ; Wed, 15 Dec 2010 14:58:53 -0800 (PST) Received: from mail.internode.on.net (bld-mail20.adl6.internode.on.net [150.101.137.105]) by cuda.sgi.com with ESMTP id a3mKKyJ6Tq4CbqdE for ; Wed, 15 Dec 2010 14:58:53 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 4793310-1927428 for multiple; Thu, 16 Dec 2010 09:28:52 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PT0J8-0007pQ-SZ; Thu, 16 Dec 2010 09:58:50 +1100 Date: Thu, 16 Dec 2010 09:58:50 +1100 From: Dave Chinner To: "Zhong, Xin" Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH v3] xfstests: pwrite hang when writing from mmaped buffer of the same page Subject: Re: [PATCH v3] xfstests: pwrite hang when writing from mmaped buffer of the same page Message-ID: <20101215225850.GH9925@dastard> References: <1292304018-10827-1-git-send-email-xin.zhong@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292304018-10827-1-git-send-email-xin.zhong@intel.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail20.adl6.internode.on.net[150.101.137.105] X-Barracuda-Start-Time: 1292453935 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0209 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49538 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 14, 2010 at 01:20:18PM +0800, Zhong, Xin wrote: > The problem is found in meego testing on btrfs: > http://bugs.meego.com/show_bug.cgi?id=6672 > > Reviewed-by: Hellwig, Christoph and Chinner, Dave > Signed-off-by: Zhong, Xin > --- > 248 | 57 ++++++++++++++++++++++++++++++++++++ > 248.out | 2 + > group | 1 + > src/Makefile | 2 +- > src/pwrite_mmap_blocked.c | 71 +++++++++++++++++++++++++++++++++++++++++++++ > 5 files changed, 132 insertions(+), 1 deletions(-) > create mode 100644 248 > create mode 100644 248.out > create mode 100644 src/pwrite_mmap_blocked.c > > diff --git a/248 b/248 > new file mode 100644 > index 0000000..ea4313f > --- /dev/null > +++ b/248 > @@ -0,0 +1,57 @@ > +#! /bin/bash > +# FS QA Test No. 248 > +# > +# Test for pwrite hang problem when writing from mmaped buffer of the same page > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2010 YOUR NAME HERE. All Rights Reserved. Still needs the copyright line updated. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+pYTf+18+fromorbit.com=david@internode.on.net Wed Dec 15 17:02:48 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBFN2llX247140 for ; Wed, 15 Dec 2010 17:02:47 -0600 X-ASG-Debug-ID: 1292454279-736e03c90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5296A1F5FD6 for ; Wed, 15 Dec 2010 15:04:39 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id fF72Po2IrNzDEDJV for ; Wed, 15 Dec 2010 15:04:39 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49481074-1927428 for multiple; Thu, 16 Dec 2010 09:34:32 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PT0OT-0007q5-4t; Thu, 16 Dec 2010 10:04:21 +1100 Date: Thu, 16 Dec 2010 10:04:21 +1100 From: Dave Chinner To: "Zak, Semion" Cc: "xfs@oss.sgi.com" , XTV FS Group X-ASG-Orig-Subj: Re: XFS in LINUX embedded environment Subject: Re: XFS in LINUX embedded environment Message-ID: <20101215230421.GI9925@dastard> References: <6385EF5E30011E42B75895D851412B2A64BB14EFEA@ILMA1.IL.NDS.COM> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <6385EF5E30011E42B75895D851412B2A64BB14EFEA@ILMA1.IL.NDS.COM> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1292454281 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0208 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49539 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 15, 2010 at 05:39:03PM +0200, Zak, Semion wrote: > Hi, > I try to use XFS in LINUX embedded environment, without virtual memory. Can you describe your platform and environment for us? Does "without virtual memory" mean you are using a uclinux variant? Or does it mean you are simply not using any swap? > In one of the tests I got "Out of memory" error. Can you provide the test case and details of the OOM error? > My question is: > > Is it possible to bound or decrease memory use by XFS? Not directly - same as every other linux filesystem. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+T1S8+18+fromorbit.com=david@internode.on.net Wed Dec 15 17:24:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBFNOHOR248557 for ; Wed, 15 Dec 2010 17:24:18 -0600 X-ASG-Debug-ID: 1292455569-0b3103a70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 12466152DF0A for ; Wed, 15 Dec 2010 15:26:09 -0800 (PST) Received: from mail.internode.on.net (bld-mail20.adl6.internode.on.net [150.101.137.105]) by cuda.sgi.com with ESMTP id GIxDvKT9rO7TpVGY for ; Wed, 15 Dec 2010 15:26:09 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 4797446-1927428 for multiple; Thu, 16 Dec 2010 09:56:08 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PT0jX-0007sH-39; Thu, 16 Dec 2010 10:26:07 +1100 Date: Thu, 16 Dec 2010 10:26:07 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 00/10] writeback updates V2 Subject: Re: [PATCH 00/10] writeback updates V2 Message-ID: <20101215232606.GJ9925@dastard> References: <20101210084215.259628825@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101210084215.259628825@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail20.adl6.internode.on.net[150.101.137.105] X-Barracuda-Start-Time: 1292455571 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0022 1.0000 -2.0066 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.01 X-Barracuda-Spam-Status: No, SCORE=-2.01 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49540 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, Dec 10, 2010 at 03:42:15AM -0500, Christoph Hellwig wrote: > - add IO_DIRECT per Dave's review comment > - fix up a commit message as per Dave's review comment > - add Reviewed-by: tags for Dave's reviews Christoph, do you want me to add this to my xfs-for-2.6.38 branch so it is easier to test with all the other pending changes we have for 2.6.38? Cheers, Dave. -- Dave Chinner david@fromorbit.com From xin.zhong@intel.com Wed Dec 15 19:47:47 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBG1llvu254526 for ; Wed, 15 Dec 2010 19:47:47 -0600 X-ASG-Debug-ID: 1292464180-1de200aa0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mga14.intel.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CFCBF1F670C for ; Wed, 15 Dec 2010 17:49:40 -0800 (PST) Received: from mga14.intel.com (mga14.intel.com [143.182.124.37]) by cuda.sgi.com with ESMTP id oNvsqpEQBuwEp2VB for ; Wed, 15 Dec 2010 17:49:40 -0800 (PST) Received: from azsmga001.ch.intel.com ([10.2.17.19]) by azsmga102.ch.intel.com with ESMTP; 15 Dec 2010 17:49:39 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.59,352,1288594800"; d="scan'208";a="362363751" Received: from pgsmsx602.gar.corp.intel.com ([10.221.43.81]) by azsmga001.ch.intel.com with ESMTP; 15 Dec 2010 17:49:38 -0800 Received: from pgsmsx509.gar.corp.intel.com (172.30.13.17) by pgsmsx602.gar.corp.intel.com (10.221.43.81) with Microsoft SMTP Server (TLS) id 8.2.254.0; Thu, 16 Dec 2010 09:48:40 +0800 Received: from shsmsx601.ccr.corp.intel.com (10.239.4.112) by PGSMSX509.gar.corp.intel.com (172.30.13.17) with Microsoft SMTP Server (TLS) id 8.2.254.0; Thu, 16 Dec 2010 09:48:38 +0800 Received: from shsmsx502.ccr.corp.intel.com ([10.239.4.96]) by shsmsx601.ccr.corp.intel.com ([10.239.4.112]) with mapi; Thu, 16 Dec 2010 09:48:29 +0800 From: "Zhong, Xin" To: Christoph Hellwig CC: "xfs@oss.sgi.com" Date: Thu, 16 Dec 2010 09:48:29 +0800 X-ASG-Orig-Subj: RE: [PATCH v3] xfstests: pwrite hang when writing from mmaped buffer of the same page Subject: RE: [PATCH v3] xfstests: pwrite hang when writing from mmaped buffer of the same page Thread-Topic: [PATCH v3] xfstests: pwrite hang when writing from mmaped buffer of the same page Thread-Index: AcucUNXqbnCOTXXARre661hBt8bZ9wAcmvCg Message-ID: <1865303E0DED764181A9D882DEF65FB6859A064AFE@shsmsx502.ccr.corp.intel.com> References: <1292304018-10827-1-git-send-email-xin.zhong@intel.com> <20101215120840.GA29650@infradead.org> In-Reply-To: <20101215120840.GA29650@infradead.org> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Barracuda-Connect: mga14.intel.com[143.182.124.37] X-Barracuda-Start-Time: 1292464180 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49549 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Thanks a lot for your help! -----Original Message----- From: Christoph Hellwig [mailto:hch@infradead.org]=20 Sent: Wednesday, December 15, 2010 8:09 PM To: Zhong, Xin Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3] xfstests: pwrite hang when writing from mmaped buff= er of the same page On Tue, Dec 14, 2010 at 01:20:18PM +0800, Zhong, Xin wrote: > The problem is found in meego testing on btrfs: > http://bugs.meego.com/show_bug.cgi?id=3D6672 >=20 > Reviewed-by: Hellwig, Christoph and Chinner, Dave > Signed-off-by: Zhong, Xin Thanks, the new patch looks good. I'll fix up the rewiewed-by line to be two separate ones, and move the variable declarations to the top of the main functions as pointed out by Dave and will commit it. From xin.zhong@intel.com Wed Dec 15 20:21:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBG2LXhJ256552 for ; Wed, 15 Dec 2010 20:21:34 -0600 X-ASG-Debug-ID: 1292466206-4f3101540000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mga11.intel.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DF01B14594BC for ; Wed, 15 Dec 2010 18:23:26 -0800 (PST) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by cuda.sgi.com with ESMTP id N3fbsuMRbvZPGmU7 for ; Wed, 15 Dec 2010 18:23:26 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP; 15 Dec 2010 18:23:26 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.59,352,1288594800"; d="scan'208";a="636820982" Received: from pgsmsx602.gar.corp.intel.com ([10.221.43.81]) by fmsmga002.fm.intel.com with ESMTP; 15 Dec 2010 18:23:25 -0800 Received: from pgsmsx509.gar.corp.intel.com (172.30.13.17) by pgsmsx602.gar.corp.intel.com (10.221.43.81) with Microsoft SMTP Server (TLS) id 8.2.254.0; Thu, 16 Dec 2010 10:22:40 +0800 Received: from shsmsx601.ccr.corp.intel.com (10.239.4.112) by PGSMSX509.gar.corp.intel.com (172.30.13.17) with Microsoft SMTP Server (TLS) id 8.2.254.0; Thu, 16 Dec 2010 10:22:40 +0800 Received: from shsmsx502.ccr.corp.intel.com ([10.239.4.96]) by shsmsx601.ccr.corp.intel.com ([10.239.4.112]) with mapi; Thu, 16 Dec 2010 10:22:39 +0800 From: "Zhong, Xin" To: Dave Chinner CC: "xfs@oss.sgi.com" Date: Thu, 16 Dec 2010 10:22:38 +0800 X-ASG-Orig-Subj: RE: [PATCH v3] xfstests: pwrite hang when writing from mmaped buffer of the same page Subject: RE: [PATCH v3] xfstests: pwrite hang when writing from mmaped buffer of the same page Thread-Topic: [PATCH v3] xfstests: pwrite hang when writing from mmaped buffer of the same page Thread-Index: Acucq6rsRhS8L/3RSfeW9O81lzZEWwAHGEHQ Message-ID: <1865303E0DED764181A9D882DEF65FB6859A064B54@shsmsx502.ccr.corp.intel.com> References: <1292304018-10827-1-git-send-email-xin.zhong@intel.com> <20101215225850.GH9925@dastard> In-Reply-To: <20101215225850.GH9925@dastard> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Barracuda-Connect: mga11.intel.com[192.55.52.93] X-Barracuda-Start-Time: 1292466207 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean I will submit another one. Thanks a lot for your careful review,:-). -----Original Message----- From: Dave Chinner [mailto:david@fromorbit.com]=20 Sent: Thursday, December 16, 2010 6:59 AM To: Zhong, Xin Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3] xfstests: pwrite hang when writing from mmaped buff= er of the same page On Tue, Dec 14, 2010 at 01:20:18PM +0800, Zhong, Xin wrote: > The problem is found in meego testing on btrfs: > http://bugs.meego.com/show_bug.cgi?id=3D6672 >=20 > Reviewed-by: Hellwig, Christoph and Chinner, Dave > Signed-off-by: Zhong, Xin > --- > 248 | 57 ++++++++++++++++++++++++++++++++++++ > 248.out | 2 + > group | 1 + > src/Makefile | 2 +- > src/pwrite_mmap_blocked.c | 71 +++++++++++++++++++++++++++++++++++++++= ++++++ > 5 files changed, 132 insertions(+), 1 deletions(-) > create mode 100644 248 > create mode 100644 248.out > create mode 100644 src/pwrite_mmap_blocked.c >=20 > diff --git a/248 b/248 > new file mode 100644 > index 0000000..ea4313f > --- /dev/null > +++ b/248 > @@ -0,0 +1,57 @@ > +#! /bin/bash > +# FS QA Test No. 248 > +# > +# Test for pwrite hang problem when writing from mmaped buffer of the sa= me page=20 > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2010 YOUR NAME HERE. All Rights Reserved. Still needs the copyright line updated. Cheers, Dave. --=20 Dave Chinner david@fromorbit.com From xin.zhong@intel.com Wed Dec 15 20:28:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_62 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBG2S6mb256948 for ; Wed, 15 Dec 2010 20:28:07 -0600 X-ASG-Debug-ID: 1292466599-3b6502f80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mga11.intel.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D14061CD0819 for ; Wed, 15 Dec 2010 18:29:59 -0800 (PST) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by cuda.sgi.com with ESMTP id BuijKB487HIRRteV for ; Wed, 15 Dec 2010 18:29:59 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP; 15 Dec 2010 18:29:56 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.59,352,1288594800"; d="scan'208";a="636822713" Received: from zyh-fedora.bj.intel.com (HELO localhost.localdomain) ([10.238.135.222]) by fmsmga002.fm.intel.com with ESMTP; 15 Dec 2010 18:29:56 -0800 From: "Zhong, Xin" To: xfs@oss.sgi.com Cc: xin.zhong@intel.com X-ASG-Orig-Subj: [PATCH v4] xfstests: pwrite hang when writing from mmaped buffer of the same page Subject: [PATCH v4] xfstests: pwrite hang when writing from mmaped buffer of the same page Date: Thu, 16 Dec 2010 10:30:52 +0800 Message-Id: <1292466652-15563-1-git-send-email-xin.zhong@intel.com> X-Mailer: git-send-email 1.6.2.2 X-Barracuda-Connect: mga11.intel.com[192.55.52.93] X-Barracuda-Start-Time: 1292466600 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean The problem is found in meego testing on btrfs: http://bugs.meego.com/show_bug.cgi?id=6672 Reviewed-by: Hellwig, Christoph Reviewed-by: Chinner, Dave Signed-off-by: Zhong, Xin --- 248 | 58 +++++++++++++++++++++++++++++++++++ 248.out | 2 + group | 1 + src/Makefile | 2 +- src/pwrite_mmap_blocked.c | 73 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 135 insertions(+), 1 deletions(-) create mode 100644 248 create mode 100644 248.out create mode 100644 src/pwrite_mmap_blocked.c diff --git a/248 b/248 new file mode 100644 index 0000000..38eb442 --- /dev/null +++ b/248 @@ -0,0 +1,58 @@ +#! /bin/bash +# FS QA Test No. 248 +# +# Test for pwrite hang problem when writing from mmaped buffer of the same page +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 Intel Corporation +# +# 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; version 2 of the License +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., 59 +# Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +#----------------------------------------------------------------------- +# +# creator +owner=xin.zhong@intel.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* $TESTFILE +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here + +# Modify as appropriate. +_supported_fs generic +_supported_os Linux + +TESTFILE=$TEST_DIR/test_file +TEST_PROG=$here/src/pwrite_mmap_blocked + +$TEST_PROG $TESTFILE + +# success, all done +status=0 +exit diff --git a/248.out b/248.out new file mode 100644 index 0000000..d02c1ac --- /dev/null +++ b/248.out @@ -0,0 +1,2 @@ +QA output created by 248 +pwrite 1 bytes from 2 to 3 diff --git a/group b/group index 0f94dd9..a40c98f 100644 --- a/group +++ b/group @@ -361,3 +361,4 @@ deprecated 245 auto quick dir 246 auto quick rw 247 auto quick rw +248 auto quick rw diff --git a/src/Makefile b/src/Makefile index b827bd0..47d7334 100644 --- a/src/Makefile +++ b/src/Makefile @@ -17,7 +17,7 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ preallo_rw_pattern_writer ftrunc trunc fs_perms testx looptest \ locktest unwritten_mmap bulkstat_unlink_test t_stripealign \ bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable \ - stale_handle + stale_handle pwrite_mmap_blocked SUBDIRS = diff --git a/src/pwrite_mmap_blocked.c b/src/pwrite_mmap_blocked.c new file mode 100644 index 0000000..f24f718 --- /dev/null +++ b/src/pwrite_mmap_blocked.c @@ -0,0 +1,73 @@ +/* Copyright (c) 2010 Intel Corporation + * + * 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; version 2 of the License + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 59 + * Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + + +int main(int argc, char *argv[]) +{ + int ret; + char *cc = "01234"; + char *progname; + loff_t size; + loff_t amount = 1; + loff_t from = 2; + loff_t to = 3; + int fd; + void *mapped_mem; + + progname = argv[0]; + size = 5; + fd = open(argv[1], O_RDWR|O_TRUNC|O_CREAT, 0666); + if (fd < 0) { + fprintf(stderr, "%s: Cannot open `%s': %s\n", + progname, argv[1], strerror(errno)); + exit(1); + } + + if ((ret = pwrite(fd, (const char *)cc, + size, 0)) != size) { + perror("pwrite"); + exit(1); + } + + mapped_mem = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); + if (mapped_mem == MAP_FAILED) { + perror("mmap"); + exit(1); + } + printf("pwrite %Ld bytes from %Ld to %Ld\n", amount, from, to); + + ret = pwrite(fd, (char *)mapped_mem + from, amount, to); + if (ret != amount) { + perror("pwrite"); + exit(1); + } + + munmap(mapped_mem,0); + close(fd); + exit(0); +} -- 1.6.2.2 From SRS0+pXza+19+fromorbit.com=david@internode.on.net Wed Dec 15 21:10:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBG3ATwB259412 for ; Wed, 15 Dec 2010 21:10:30 -0600 X-ASG-Debug-ID: 1292469141-7b7f01720000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 272A31CD09C7 for ; Wed, 15 Dec 2010 19:12:21 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id 7PqJxtTjVEPKLE8m for ; Wed, 15 Dec 2010 19:12:21 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 49832004-1927428 for multiple; Thu, 16 Dec 2010 13:42:20 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PT4GL-00089z-Ca; Thu, 16 Dec 2010 14:12:13 +1100 Date: Thu, 16 Dec 2010 14:12:13 +1100 From: Dave Chinner To: "Zhong, Xin" Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH v4] xfstests: pwrite hang when writing from mmaped buffer of the same page Subject: Re: [PATCH v4] xfstests: pwrite hang when writing from mmaped buffer of the same page Message-ID: <20101216031213.GK9925@dastard> References: <1292466652-15563-1-git-send-email-xin.zhong@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292466652-15563-1-git-send-email-xin.zhong@intel.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1292469143 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49555 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 16, 2010 at 10:30:52AM +0800, Zhong, Xin wrote: > The problem is found in meego testing on btrfs: > http://bugs.meego.com/show_bug.cgi?id=6672 > > Reviewed-by: Hellwig, Christoph > Reviewed-by: Chinner, Dave > Signed-off-by: Zhong, Xin Looks good now. Thanks. Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+73387e9b29d2b39967e5+2671+infradead.org+hch@bombadil.srs.infradead.org Thu Dec 16 02:41:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBG8f0kt019404 for ; Thu, 16 Dec 2010 02:41:01 -0600 X-ASG-Debug-ID: 1292488974-23b7039b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 02DCD1F72D2 for ; Thu, 16 Dec 2010 00:42:54 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id hqQUUcHG9hHl1Smz for ; Thu, 16 Dec 2010 00:42:54 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PT9QI-0007qS-NQ; Thu, 16 Dec 2010 08:42:50 +0000 Date: Thu, 16 Dec 2010 03:42:50 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 00/10] writeback updates V2 Subject: Re: [PATCH 00/10] writeback updates V2 Message-ID: <20101216084250.GA30107@infradead.org> References: <20101210084215.259628825@bombadil.infradead.org> <20101215232606.GJ9925@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101215232606.GJ9925@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[18.85.46.34] X-Barracuda-Start-Time: 1292488975 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 16, 2010 at 10:26:07AM +1100, Dave Chinner wrote: > On Fri, Dec 10, 2010 at 03:42:15AM -0500, Christoph Hellwig wrote: > > - add IO_DIRECT per Dave's review comment > > - fix up a commit message as per Dave's review comment > > - add Reviewed-by: tags for Dave's reviews > > Christoph, do you want me to add this to my xfs-for-2.6.38 branch so > it is easier to test with all the other pending changes we have for > 2.6.38? That's fine with me. From BATV+73387e9b29d2b39967e5+2671+infradead.org+hch@bombadil.srs.infradead.org Thu Dec 16 04:11:39 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBGABcZJ033589 for ; Thu, 16 Dec 2010 04:11:39 -0600 X-ASG-Debug-ID: 1292494412-62fd01300000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 146BB1F7D15 for ; Thu, 16 Dec 2010 02:13:32 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id BFLEOOjNidPHVgeS for ; Thu, 16 Dec 2010 02:13:32 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PTAq3-0005M1-TL; Thu, 16 Dec 2010 10:13:31 +0000 Date: Thu, 16 Dec 2010 05:13:31 -0500 From: Christoph Hellwig To: "Zhong, Xin" Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH v4] xfstests: pwrite hang when writing from mmaped buffer of the same page Subject: Re: [PATCH v4] xfstests: pwrite hang when writing from mmaped buffer of the same page Message-ID: <20101216101331.GA20505@infradead.org> References: <1292466652-15563-1-git-send-email-xin.zhong@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292466652-15563-1-git-send-email-xin.zhong@intel.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[18.85.46.34] X-Barracuda-Start-Time: 1292494413 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 16, 2010 at 10:30:52AM +0800, Zhong, Xin wrote: > The problem is found in meego testing on btrfs: > http://bugs.meego.com/show_bug.cgi?id=6672 As I didn't get around commiting v3 yesterday i've now put in this updated version. Thanks a lot again! From BATV+73387e9b29d2b39967e5+2671+infradead.org+hch@bombadil.srs.infradead.org Thu Dec 16 05:54:09 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBGBs7xG046924 for ; Thu, 16 Dec 2010 05:54:09 -0600 X-ASG-Debug-ID: 1292500561-4a7700060000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2505E1CD1F9A for ; Thu, 16 Dec 2010 03:56:02 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id zfLxfPmgEVtu9tTS for ; Thu, 16 Dec 2010 03:56:02 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PTCRF-0005K4-Ck; Thu, 16 Dec 2010 11:56:01 +0000 Date: Thu, 16 Dec 2010 06:56:01 -0500 From: Christoph Hellwig To: Boris Ranto Cc: xfs X-ASG-Orig-Subj: Re: xfstests: filter spaces in xfs_quota output in test case 108 Subject: Re: xfstests: filter spaces in xfs_quota output in test case 108 Message-ID: <20101216115601.GA20445@infradead.org> References: <1292425538.3220.14.camel@dhcp-31-190.brq.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292425538.3220.14.camel@dhcp-31-190.brq.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[18.85.46.34] X-Barracuda-Start-Time: 1292500562 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 15, 2010 at 04:05:38PM +0100, Boris Ranto wrote: > Program xfs_quota can output different amounts of spaces when it is trying to align its output. > This can cause output mismatch on several systems when testing test case 108. > > Attached patch will filter all the consecutive spaces in xfs_quota output to just one space making the test case independent of the alignment. > Thanks, applied. From BATV+73387e9b29d2b39967e5+2671+infradead.org+hch@bombadil.srs.infradead.org Thu Dec 16 05:55:46 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBGBtku3047203 for ; Thu, 16 Dec 2010 05:55:46 -0600 X-ASG-Debug-ID: 1292500660-549400bc0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CE8111F7AB1 for ; Thu, 16 Dec 2010 03:57:40 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 2d6H710Cg0MxWuPn for ; Thu, 16 Dec 2010 03:57:40 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PTCSo-0005Lo-UO; Thu, 16 Dec 2010 11:57:38 +0000 Date: Thu, 16 Dec 2010 06:57:38 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/7] xfs: ensure sync write errors are returned Subject: Re: [PATCH 1/7] xfs: ensure sync write errors are returned Message-ID: <20101216115738.GB20445@infradead.org> References: <1292376208-16282-1-git-send-email-david@fromorbit.com> <1292376208-16282-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292376208-16282-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[18.85.46.34] X-Barracuda-Start-Time: 1292500660 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean > error2 = filemap_write_and_wait_range(mapping, pos, end); > - if (!error) > + if (error2) > error = error2; > if (need_i_mutex) > mutex_lock(&inode->i_mutex); > @@ -777,7 +777,7 @@ write_retry: > > error2 = -xfs_file_fsync(file, > (file->f_flags & __O_SYNC) ? 0 : 1); > - if (!error) > + if (error2 && error >= 0) > error = error2; Shouldn't the filemap_write_and_wait_range clause use a similar check as this one? From BATV+73387e9b29d2b39967e5+2671+infradead.org+hch@bombadil.srs.infradead.org Thu Dec 16 06:04:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBGC4aql048720 for ; Thu, 16 Dec 2010 06:04:36 -0600 X-ASG-Debug-ID: 1292501189-0ad300d90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 62838152E123 for ; Thu, 16 Dec 2010 04:06:29 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id EzDKflbXa60iOMMV for ; Thu, 16 Dec 2010 04:06:29 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PTCbN-0006yh-6G; Thu, 16 Dec 2010 12:06:29 +0000 Date: Thu, 16 Dec 2010 07:06:29 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/7] xfs: split direct IO write path from xfs_file_aio_write Subject: Re: [PATCH 4/7] xfs: split direct IO write path from xfs_file_aio_write Message-ID: <20101216120629.GC20445@infradead.org> References: <1292376208-16282-1-git-send-email-david@fromorbit.com> <1292376208-16282-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292376208-16282-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1292501190 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean > +STATIC ssize_t > +xfs_file_dio_aio_write( > + struct kiocb *iocb, > + const struct iovec *iovp, > + unsigned long nr_segs, > + loff_t pos, > + size_t ocount, > + int *need_i_mutex, > + int *iolock) need_i_mutex == 1 is equivalent to iolock == XFS_IOLOCK_EXCL, I think it's a good idea to throw in a patch to remove the need_i_mutex variable before this patch. Maybe that patch can even add xfs_rw_lock or similar helpers to manipulate the i_mutex, the iolock, and the iolock variable together? Speaking of that, shouldn't xfs_file_aio_read also take the iolock exclusive during the page invalidation and then demote it, just like the write case? The above helpers would enforce that nicely. > + if ((pos & target->bt_smask) || (count & target->bt_smask)) > + return XFS_ERROR(-EINVAL); For the error traps to work this needs to be -XFS_ERROR(EINVAL); From BATV+73387e9b29d2b39967e5+2671+infradead.org+hch@bombadil.srs.infradead.org Thu Dec 16 09:34:43 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBGFYgoq077331 for ; Thu, 16 Dec 2010 09:34:43 -0600 X-ASG-Debug-ID: 1292513797-179c009f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 64A911CD2E57 for ; Thu, 16 Dec 2010 07:36:37 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id rWYTO5RYBaTEMrnF for ; Thu, 16 Dec 2010 07:36:37 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PTFsg-00070u-DK; Thu, 16 Dec 2010 15:36:34 +0000 Date: Thu, 16 Dec 2010 10:36:34 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com, linux-kernel@vger.kernel.org, a.p.zijlstra@chello.nl X-ASG-Orig-Subj: Re: [PATCH 2/3] xfs: use generic per-cpu counter infrastructure Subject: Re: [PATCH 2/3] xfs: use generic per-cpu counter infrastructure Message-ID: <20101216153634.GA24185@infradead.org> References: <1292203313-15570-1-git-send-email-david@fromorbit.com> <1292203313-15570-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292203313-15570-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[18.85.46.34] X-Barracuda-Start-Time: 1292513797 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 13, 2010 at 12:21:52PM +1100, Dave Chinner wrote: > From: Dave Chinner > > XFS has a per-cpu counter implementation for in-core superblock > counters that pre-dated the generic implementation. It is complex > and baroque as it is tailored directly to the needs of ENOSPC > detection. > > Now that the generic percpu counter infrastructure has the > percpu_counter_add_unless_lt() function that implements the > necessary threshold checks for us, switch the XFS per-cpu > superblock counters to use the generic percpu counter > infrastructure. > > Signed-off-by: Dave Chinner Looks good to me, Reviewed-by: Christoph Hellwig A little nipick: > -#ifdef HAVE_PERCPU_SB > ASSERT(field < XFS_SBS_ICOUNT || field > XFS_SBS_FDBLOCKS); > -#endif No need to keep this assert - xfs_mod_incore_sb_unlocked already has one for unknown fields. From BATV+73387e9b29d2b39967e5+2671+infradead.org+hch@bombadil.srs.infradead.org Thu Dec 16 09:36:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBGFaWDe077748 for ; Thu, 16 Dec 2010 09:36:32 -0600 X-ASG-Debug-ID: 1292513906-128d01070000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0FDC51CD111B for ; Thu, 16 Dec 2010 07:38:26 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id gop7wBNQRkBUXeJT for ; Thu, 16 Dec 2010 07:38:26 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PTFuU-00074k-K3; Thu, 16 Dec 2010 15:38:26 +0000 Date: Thu, 16 Dec 2010 10:38:26 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com, linux-kernel@vger.kernel.org, a.p.zijlstra@chello.nl X-ASG-Orig-Subj: Re: [PATCH 3/3] xfs: demultiplex xfs_icsb_modify_counters() Subject: Re: [PATCH 3/3] xfs: demultiplex xfs_icsb_modify_counters() Message-ID: <20101216153826.GB24185@infradead.org> References: <1292203313-15570-1-git-send-email-david@fromorbit.com> <1292203313-15570-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292203313-15570-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1292513907 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 13, 2010 at 12:21:53PM +1100, Dave Chinner wrote: > From: Dave Chinner > > With the conversion to percpu counters, xfs_icsb_modify_counters() really does > not need to exist. Convert the inode counter modifications to use a common > helper function for the one place that calls them, and add another function for > the free block modification and convert all the callers to use that. Looks good, Reviewed-by: Christoph Hellwig From BATV+73387e9b29d2b39967e5+2671+infradead.org+hch@bombadil.srs.infradead.org Thu Dec 16 09:36:54 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBGFasdU077829 for ; Thu, 16 Dec 2010 09:36:54 -0600 X-ASG-Debug-ID: 1292513927-425f01730000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4DF4F152F06B for ; Thu, 16 Dec 2010 07:38:47 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id vaVlam5tVUIJmFZZ for ; Thu, 16 Dec 2010 07:38:47 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PTFup-0007R9-0i; Thu, 16 Dec 2010 15:38:47 +0000 Date: Thu, 16 Dec 2010 10:38:47 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 5/9] xfs: reduce the number of AIL push wakeups Subject: Re: [PATCH 5/9] xfs: reduce the number of AIL push wakeups Message-ID: <20101216153846.GC24185@infradead.org> References: <1292214743-18073-1-git-send-email-david@fromorbit.com> <1292214743-18073-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292214743-18073-6-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1292513928 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 13, 2010 at 03:32:19PM +1100, Dave Chinner wrote: > From: Dave Chinner > > The xfaild often tries to rest to wait for congestion to pass of for > IO to complete, but is regularly woken in tail-pushing situations. > In severe cases, the xfsaild is getting woken tens of thousands of > times a second. Reduce the number needless wakeups by only waking > the xfsaild if the new target is larger than the old one. Further > make short sleeps uninterruptible as they occur when the xfsaild has > decided it needs to back off to allow some IO to complete and being > woken early is counter-productive. This patch causes softlockup warnings in xfsaild for various testcases on my 32-bit x86 VM, but the testcases continue otherwise normally. Example below: [ 361.692515] INFO: task xfsaild/vdb5:8705 blocked for more than 120 seconds. [ 361.697272] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 361.703929] xfsaild/vdb5 D 00000000 0 8705 2 0x00000000 [ 361.708148] f4933f10 00000046 f4b37464 00000000 00000000 f4b37100 f4b37100 00000046 [ 361.711501] f4933eb4 00000046 f4b37100 c0936092 f4b37264 f4b37268 00000000 c0d52d00 [ 361.714786] c0d52d08 c0e96c00 f5735d38 f4933ec0 f4b37100 f6946c00 f4933eec c0160553 [ 361.718120] Call Trace: [ 361.721856] [] ? _raw_spin_unlock_irq+0x22/0x30 [ 361.723439] [] ? finish_task_switch+0x73/0x100 [ 361.725056] [] ? finish_task_switch+0x37/0x100 [ 361.726592] [] ? schedule+0x263/0x9d0 [ 361.727932] [] ? trace_hardirqs_off+0xb/0x10 [ 361.729548] [] schedule_timeout+0x185/0x250 [ 361.731258] [] ? _raw_spin_unlock_irqrestore+0x35/0x60 [ 361.733037] [] ? trace_hardirqs_on+0xb/0x10 [ 361.734513] [] xfsaild+0x54/0xc0 [ 361.735786] [] ? xfsaild+0x0/0xc0 [ 361.737171] [] kthread+0x74/0x80 [ 361.738446] [] ? kthread+0x0/0x80 [ 361.739987] [] kernel_thread_helper+0x6/0x1c [ 361.741589] no locks held by xfsaild/vdb5/8705. From BATV+73387e9b29d2b39967e5+2671+infradead.org+hch@bombadil.srs.infradead.org Thu Dec 16 09:44:56 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBGFitws078673 for ; Thu, 16 Dec 2010 09:44:56 -0600 X-ASG-Debug-ID: 1292514410-2dc100350000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 36A971EEAFE for ; Thu, 16 Dec 2010 07:46:50 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id ML0MEFsqFlyLfEQy for ; Thu, 16 Dec 2010 07:46:50 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PTG2b-00019b-Nj; Thu, 16 Dec 2010 15:46:49 +0000 Date: Thu, 16 Dec 2010 10:46:49 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: don't truncate prealloc from frequently accessed inodes Subject: Re: [PATCH 2/2] xfs: don't truncate prealloc from frequently accessed inodes Message-ID: <20101216154649.GA1388@infradead.org> References: <1292203511-15685-1-git-send-email-david@fromorbit.com> <1292203511-15685-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292203511-15685-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[18.85.46.34] X-Barracuda-Start-Time: 1292514410 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 13, 2010 at 12:25:11PM +1100, Dave Chinner wrote: > The new counter in the struct xfs_inode fits into a hole in the > structure on 64 bit machines, so does not grow the size of the inode > at all. The count actually is gone now. But this patch totally changes xfstests 203 output for me. Given that the test doesn't care about the allocation pattern it's probably fine, but we'll a fix for the testcase. From helpdesk@tvnet.hu Thu Dec 16 12:07:56 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=4.0 required=5.0 tests=BAYES_50,J_CHICKENPOX_53, TVD_PH_SUBJ_ACCOUNTS_POST autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBGI7t8r100758 for ; Thu, 16 Dec 2010 12:07:56 -0600 X-ASG-Debug-ID: 1292522987-6df702e90000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx.emlidc0004.whservidor.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 60F454F328C for ; Thu, 16 Dec 2010 10:09:48 -0800 (PST) Received: from mx.emlidc0004.whservidor.com (smtp1.emlidc0004.whservidor.com [200.192.142.172]) by cuda.sgi.com with ESMTP id dlv7DZKV5Enzbavk for ; Thu, 16 Dec 2010 10:09:48 -0800 (PST) Received: from webmail.oabrs.org.br (localhost.localdomain [127.0.0.1]) by mx.emlidc0004.whservidor.com (Postfix) with ESMTP id 34C6C8C860E; Thu, 16 Dec 2010 16:09:46 -0200 (BRST) Received: from 127.0.0.1 (proxying for unknown) (SquirrelMail authenticated user edsonschmitz@oabrs.org.br) by webmail.oabrs.org.br with HTTP; Thu, 16 Dec 2010 16:09:46 -0200 (BRST) Message-ID: <7fe011395a368e4221d6dc6b6c67d7a7.squirrel@webmail.oabrs.org.br> Date: Thu, 16 Dec 2010 16:09:46 -0200 (BRST) X-ASG-Orig-Subj: Verify Your Account!!! Subject: Verify Your Account!!! From: "TVnet HelpDesk" Reply-To: helpdesk.account@thondaman.org User-Agent: SquirrelMail/1.4.17 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: smtp1.emlidc0004.whservidor.com[200.192.142.172] X-Barracuda-Start-Time: 1292522989 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4952 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.46 X-Barracuda-Spam-Status: No, SCORE=1.46 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=PLING_PLING, TVD_PH_SUBJ_ACCOUNTS_POST X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49615 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.00 TVD_PH_SUBJ_ACCOUNTS_POST TVD_PH_SUBJ_ACCOUNTS_POST 0.46 PLING_PLING Subject has lots of exclamation marks X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dear Tvnet User, Your email account has been confirmed to have been infected with a strong internet virus and the way your account is used to send numerous spam mails recently from a foreign IP. As a result, the Tvnet Help Desk has come to an understanding that one or more of our subscribers are Introducing a very strong virus into our system and it is affecting our network. We are trying to find out the specific person. However, you might not be the one promoting this Spam or strong virus, as your email account might have been compromised. To protect your account from sending spam mails and also the virus,you are to confirm your true ownership of this account by providing your original User ID(*******) and Password (*******) as a reply to this message. On receipt of the requested information, the "Tvnet.hu" web email technology team shall block your account from Spam and virus. Failure to do this will violate the Tvnet.hu email terms & conditions.This will render your account inactive. NOTE: You will be sent a password reset message in 24hours after undergoing this process for security reasons. Be informed that this is a recent virus and its strong and also slow down Tvnet Network. Thanks for your understanding and co-operation. Tvnet Technical Support Team From aelder@sgi.com Thu Dec 16 14:49:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBGKnpfL122842 for ; Thu, 16 Dec 2010 14:49:51 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay2.corp.sgi.com (Postfix) with ESMTP id F1C3E304064; Thu, 16 Dec 2010 12:51:42 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 16 Dec 2010 14:50:51 -0600 Subject: Re: [PATCH 1/7] xfs: ensure sync write errors are returned From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1292376208-16282-2-git-send-email-david@fromorbit.com> References: <1292376208-16282-1-git-send-email-david@fromorbit.com> <1292376208-16282-2-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Thu, 16 Dec 2010 14:50:49 -0600 Message-ID: <1292532649.2457.54.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 16 Dec 2010 20:50:51.0237 (UTC) FILETIME=[EC9EB150:01CB9D62] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 2010-12-15 at 12:23 +1100, Dave Chinner wrote: > From: Dave Chinner > > xfs_file_aio_write() only returns the error from synchronous > flushing of the data and inode if error == 0. At the point where > error is being checked, it is guaranteed to be > 0. Therefore any Actually, we have this above the affected code: ... error = -ret; if (ret <= 0) goto out_unlock_internal; So ret must be positive, therefore error is negative (the negative of the number of bytes written). In other words, we enter this block without having seen an error. The return at the end of the function is: return -error; And by the convoluted logic here, that means that the value of error should be a negative byte count if successful, or a positive errno otherwise. And since filemap_write_and_wait_range() returns a negative errno, your fix doesn't look right to me. The existing code is wrong and should be fixed, but a better fix might make the meaning of the variable "error" a little less weird. -Alex > errors returned by the data or fsync flush will never be returned. > Fix the checks so we overwrite the current error once and only if an > error really occurred. > > Signed-off-by: Dave Chinner > --- > fs/xfs/linux-2.6/xfs_file.c | 4 ++-- > 1 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c > index ba8ad42..e1eaec2 100644 > --- a/fs/xfs/linux-2.6/xfs_file.c > +++ b/fs/xfs/linux-2.6/xfs_file.c > @@ -769,7 +769,7 @@ write_retry: > mutex_unlock(&inode->i_mutex); > > error2 = filemap_write_and_wait_range(mapping, pos, end); > - if (!error) > + if (error2) > error = error2; > if (need_i_mutex) > mutex_lock(&inode->i_mutex); > @@ -777,7 +777,7 @@ write_retry: > > error2 = -xfs_file_fsync(file, > (file->f_flags & __O_SYNC) ? 0 : 1); > - if (!error) > + if (error2 && error >= 0) > error = error2; > } > From aelder@sgi.com Thu Dec 16 15:14:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBGLE7Ih126503 for ; Thu, 16 Dec 2010 15:14:07 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4767AAC00B; Thu, 16 Dec 2010 13:15:59 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 16 Dec 2010 15:15:00 -0600 Subject: Re: [PATCH 0/4] log recovery cleanups From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20101201220620.340188389@bombadil.infradead.org> References: <20101201220620.340188389@bombadil.infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Thu, 16 Dec 2010 15:14:58 -0600 Message-ID: <1292534098.2457.55.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 16 Dec 2010 21:15:00.0153 (UTC) FILETIME=[4C3DBA90:01CB9D66] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 2010-12-01 at 17:06 -0500, Christoph Hellwig wrote: > A couple of cleanups for the log recovery code that I stumbled upon when > researching some improvements for the CRC cleanup. > I've reviewed this series and it all looks good. Reviewed-by: Alex Elder From aelder@sgi.com Thu Dec 16 15:17:11 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBGLHB93126769 for ; Thu, 16 Dec 2010 15:17:11 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id BF32DAC00C; Thu, 16 Dec 2010 13:19:05 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 16 Dec 2010 15:18:16 -0600 Subject: Re: [PATCH 3/4] xfs: refactor xlog_recover_commit_trans From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20101201220710.454838485@bombadil.infradead.org> References: <20101201220620.340188389@bombadil.infradead.org> <20101201220710.454838485@bombadil.infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Thu, 16 Dec 2010 15:18:15 -0600 Message-ID: <1292534295.2457.58.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 16 Dec 2010 21:18:16.0732 (UTC) FILETIME=[C1694DC0:01CB9D66] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 2010-12-01 at 17:06 -0500, Christoph Hellwig wrote: > > Merge the call to xlog_recover_reorder_trans and the loop over the > recovery items from xlog_recover_do_trans into xlog_recover_commit_trans, > and keep the switch statement over the log item types as a separate helper. > > Signed-off-by: Christoph Hellwig > I'm making a small change to this one patch though... . . . > @@ -2757,17 +2699,65 @@ xlog_recover_free_trans( > } > > STATIC int > +xlog_recover_commit_item( > + struct log *log, > + struct xlog_recover *trans, > + xlog_recover_item_t *item, > + int pass) > +{ > + trace_xfs_log_recover_item_recover(log, trans, item, pass); > + > + switch (ITEM_TYPE(item)) { > + case XFS_LI_BUF: > + return xlog_recover_do_buffer_trans(log, item, pass); > + break; I have deleted this "break" statement. > + case XFS_LI_INODE: > + return xlog_recover_do_inode_trans(log, item, pass); > + case XFS_LI_EFI: > + return xlog_recover_do_efi_trans(log, item, trans->r_lsn, pass); > + case XFS_LI_EFD: > + xlog_recover_do_efd_trans(log, item, pass); > + return 0; . . . From SRS0+Vhv0+19+fromorbit.com=david@internode.on.net Thu Dec 16 15:49:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBGLn1nr131882 for ; Thu, 16 Dec 2010 15:49:01 -0600 X-ASG-Debug-ID: 1292536252-02a303b90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CE39F1CD5D30 for ; Thu, 16 Dec 2010 13:50:53 -0800 (PST) Received: from mail.internode.on.net (bld-mail20.adl6.internode.on.net [150.101.137.105]) by cuda.sgi.com with ESMTP id 3dVbPyUwcaCwIiBd for ; Thu, 16 Dec 2010 13:50:53 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 4921099-1927428 for multiple; Fri, 17 Dec 2010 08:20:51 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PTLis-0001MX-39; Fri, 17 Dec 2010 08:50:50 +1100 Date: Fri, 17 Dec 2010 08:50:50 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 5/9] xfs: reduce the number of AIL push wakeups Subject: Re: [PATCH 5/9] xfs: reduce the number of AIL push wakeups Message-ID: <20101216215050.GA5193@dastard> References: <1292214743-18073-1-git-send-email-david@fromorbit.com> <1292214743-18073-6-git-send-email-david@fromorbit.com> <20101216153846.GC24185@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101216153846.GC24185@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail20.adl6.internode.on.net[150.101.137.105] X-Barracuda-Start-Time: 1292536254 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49631 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 16, 2010 at 10:38:47AM -0500, Christoph Hellwig wrote: > On Mon, Dec 13, 2010 at 03:32:19PM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > The xfaild often tries to rest to wait for congestion to pass of for > > IO to complete, but is regularly woken in tail-pushing situations. > > In severe cases, the xfsaild is getting woken tens of thousands of > > times a second. Reduce the number needless wakeups by only waking > > the xfsaild if the new target is larger than the old one. Further > > make short sleeps uninterruptible as they occur when the xfsaild has > > decided it needs to back off to allow some IO to complete and being > > woken early is counter-productive. > > This patch causes softlockup warnings in xfsaild for various testcases > on my 32-bit x86 VM, but the testcases continue otherwise normally. What tests? > Example below: > > [ 361.692515] INFO: task xfsaild/vdb5:8705 blocked for more than 120 seconds. > [ 361.697272] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > [ 361.703929] xfsaild/vdb5 D 00000000 0 8705 2 0x00000000 > [ 361.708148] f4933f10 00000046 f4b37464 00000000 00000000 f4b37100 f4b37100 00000046 > [ 361.711501] f4933eb4 00000046 f4b37100 c0936092 f4b37264 f4b37268 00000000 c0d52d00 > [ 361.714786] c0d52d08 c0e96c00 f5735d38 f4933ec0 f4b37100 f6946c00 f4933eec c0160553 > [ 361.718120] Call Trace: > [ 361.721856] [] ? _raw_spin_unlock_irq+0x22/0x30 > [ 361.723439] [] ? finish_task_switch+0x73/0x100 > [ 361.725056] [] ? finish_task_switch+0x37/0x100 > [ 361.726592] [] ? schedule+0x263/0x9d0 > [ 361.727932] [] ? trace_hardirqs_off+0xb/0x10 > [ 361.729548] [] schedule_timeout+0x185/0x250 > [ 361.731258] [] ? _raw_spin_unlock_irqrestore+0x35/0x60 > [ 361.733037] [] ? trace_hardirqs_on+0xb/0x10 > [ 361.734513] [] xfsaild+0x54/0xc0 > [ 361.735786] [] ? xfsaild+0x0/0xc0 > [ 361.737171] [] kthread+0x74/0x80 > [ 361.738446] [] ? kthread+0x0/0x80 > [ 361.739987] [] kernel_thread_helper+0x6/0x1c > [ 361.741589] no locks held by xfsaild/vdb5/8705. So this is saying is that a 20ms uninterruptible sleep lasting for more than 120s? Doesn't that imply some kind of scheduler starvation, not an actual XFS problem? Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+/TMC+19+fromorbit.com=david@internode.on.net Thu Dec 16 15:55:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBGLtMOA132581 for ; Thu, 16 Dec 2010 15:55:22 -0600 X-ASG-Debug-ID: 1292536634-425901550000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C90B8145CA98 for ; Thu, 16 Dec 2010 13:57:15 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id CU85eOdy1Pkhli1n for ; Thu, 16 Dec 2010 13:57:15 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50373539-1927428 for multiple; Fri, 17 Dec 2010 08:27:14 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PTLp2-0001NA-EO; Fri, 17 Dec 2010 08:57:12 +1100 Date: Fri, 17 Dec 2010 08:57:12 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/7] xfs: ensure sync write errors are returned Subject: Re: [PATCH 1/7] xfs: ensure sync write errors are returned Message-ID: <20101216215712.GB5193@dastard> References: <1292376208-16282-1-git-send-email-david@fromorbit.com> <1292376208-16282-2-git-send-email-david@fromorbit.com> <20101216115738.GB20445@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101216115738.GB20445@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1292536636 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49630 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 16, 2010 at 06:57:38AM -0500, Christoph Hellwig wrote: > > error2 = filemap_write_and_wait_range(mapping, pos, end); > > - if (!error) > > + if (error2) > > error = error2; > > if (need_i_mutex) > > mutex_lock(&inode->i_mutex); > > @@ -777,7 +777,7 @@ write_retry: > > > > error2 = -xfs_file_fsync(file, > > (file->f_flags & __O_SYNC) ? 0 : 1); > > - if (!error) > > + if (error2 && error >= 0) > > error = error2; > > Shouldn't the filemap_write_and_wait_range clause use a similar check as > this one? No need, because when we enter the branch, error is guaranteed to be greater than zero as the code jumps over this branch if it is <= 0. Hence we only need to overwrite error with error2 from filemap_write_and_wait_range() if error2 actually contains an error (i.e. < 0). The second hunk then has to deal with the fact that error can have any value, and we only want to overwrite error if it doesn't already contain an error value and error2 does. Hence the check for error >= 0 to ensure we don't overwrite an error from filemap_write_and_wait_range(). Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+a54cfc6daf38c44dd5c4+2672+infradead.org+hch@bombadil.srs.infradead.org Thu Dec 16 18:21:17 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBH0LFan156422 for ; Thu, 16 Dec 2010 18:21:17 -0600 X-ASG-Debug-ID: 1292545389-6e9703830000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id ECAB21CD2D19 for ; Thu, 16 Dec 2010 16:23:09 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id NBXFhIGr6bN3d1Yf for ; Thu, 16 Dec 2010 16:23:09 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PTO6F-0006PC-CJ; Fri, 17 Dec 2010 00:23:07 +0000 Date: Thu, 16 Dec 2010 19:23:07 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 5/9] xfs: reduce the number of AIL push wakeups Subject: Re: [PATCH 5/9] xfs: reduce the number of AIL push wakeups Message-ID: <20101217002307.GA24135@infradead.org> References: <1292214743-18073-1-git-send-email-david@fromorbit.com> <1292214743-18073-6-git-send-email-david@fromorbit.com> <20101216153846.GC24185@infradead.org> <20101216215050.GA5193@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101216215050.GA5193@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[18.85.46.34] X-Barracuda-Start-Time: 1292545389 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, Dec 17, 2010 at 08:50:50AM +1100, Dave Chinner wrote: > What tests? I couldn't really see a pattern yet - it's different ones and different amount of warnings during each run. > So this is saying is that a 20ms uninterruptible sleep lasting for more > than 120s? Doesn't that imply some kind of scheduler starvation, not > an actual XFS problem? It does for sure look odd to me. I'll do a sub-commit bisect between the two hunk in the patch tomorrow to drill a bit deeper into what's going on. From SRS0+YY2r+20+fromorbit.com=david@internode.on.net Fri Dec 17 00:41:40 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBH6fesb199017 for ; Fri, 17 Dec 2010 00:41:40 -0600 X-ASG-Debug-ID: 1292568212-6e93014b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 67E591CD7543 for ; Thu, 16 Dec 2010 22:43:33 -0800 (PST) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id AjGk72BgwcNlfDFa for ; Thu, 16 Dec 2010 22:43:33 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50304038-1927428 for multiple; Fri, 17 Dec 2010 17:13:31 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PTU2L-00026Q-UF; Fri, 17 Dec 2010 17:43:29 +1100 Date: Fri, 17 Dec 2010 17:43:29 +1100 From: Dave Chinner To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/7] xfs: ensure sync write errors are returned Subject: Re: [PATCH 1/7] xfs: ensure sync write errors are returned Message-ID: <20101217064329.GD5193@dastard> References: <1292376208-16282-1-git-send-email-david@fromorbit.com> <1292376208-16282-2-git-send-email-david@fromorbit.com> <1292532649.2457.54.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292532649.2457.54.camel@doink> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1292568214 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49665 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 16, 2010 at 02:50:49PM -0600, Alex Elder wrote: > On Wed, 2010-12-15 at 12:23 +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > xfs_file_aio_write() only returns the error from synchronous > > flushing of the data and inode if error == 0. At the point where > > error is being checked, it is guaranteed to be > 0. Therefore any > > Actually, we have this above the affected code: > ... > error = -ret; > if (ret <= 0) > goto out_unlock_internal; > > So ret must be positive, therefore error is negative > (the negative of the number of bytes written). In > other words, we enter this block without having seen > an error. > > The return at the end of the function is: > return -error; > > And by the convoluted logic here, that means that the > value of error should be a negative byte count if > successful, or a positive errno otherwise. Oh, right, yeah, I screwed that up, didn't I? > And since filemap_write_and_wait_range() returns a > negative errno, your fix doesn't look right to me. I will fix it up. > The existing code is wrong and should be fixed, but a > better fix might make the meaning of the variable "error" > a little less weird. The real problem is that xfs functions return positive errors, and the linux functions return negative errors. It would be much less of a hassle if we fixed that problem... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+X4no+20+fromorbit.com=david@internode.on.net Fri Dec 17 01:29:37 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBH7TaPJ203236 for ; Fri, 17 Dec 2010 01:29:37 -0600 X-ASG-Debug-ID: 1292571088-55b803dd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0A973145E523 for ; Thu, 16 Dec 2010 23:31:28 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id KxCbuwBlqW4n9JrY for ; Thu, 16 Dec 2010 23:31:28 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50698586-1927428 for multiple; Fri, 17 Dec 2010 18:01:27 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PTUmk-0002AD-10; Fri, 17 Dec 2010 18:31:26 +1100 Date: Fri, 17 Dec 2010 18:31:25 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/7] xfs: split direct IO write path from xfs_file_aio_write Subject: Re: [PATCH 4/7] xfs: split direct IO write path from xfs_file_aio_write Message-ID: <20101217073125.GE5193@dastard> References: <1292376208-16282-1-git-send-email-david@fromorbit.com> <1292376208-16282-5-git-send-email-david@fromorbit.com> <20101216120629.GC20445@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101216120629.GC20445@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1292571091 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49668 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 16, 2010 at 07:06:29AM -0500, Christoph Hellwig wrote: > > +STATIC ssize_t > > +xfs_file_dio_aio_write( > > + struct kiocb *iocb, > > + const struct iovec *iovp, > > + unsigned long nr_segs, > > + loff_t pos, > > + size_t ocount, > > + int *need_i_mutex, > > + int *iolock) > > need_i_mutex == 1 is equivalent to iolock == XFS_IOLOCK_EXCL, I think > it's a good idea to throw in a patch to remove the need_i_mutex variable > before this patch. > > Maybe that patch can even add xfs_rw_lock or similar helpers to > manipulate the i_mutex, the iolock, and the iolock variable together? That sounds like a fine idea. > Speaking of that, shouldn't xfs_file_aio_read also take the iolock > exclusive during the page invalidation and then demote it, just like > the write case? The above helpers would enforce that nicely. Probably, though it might be best to leave that to another cleanup series. I'll see how much perturbation of the read path it makes.... > > + if ((pos & target->bt_smask) || (count & target->bt_smask)) > > + return XFS_ERROR(-EINVAL); > > For the error traps to work this needs to be > > -XFS_ERROR(EINVAL); Ok, will fix. I just copied the existing code. Cheers, Dave. -- Dave Chinner david@fromorbit.com From lczerner@redhat.com Fri Dec 17 03:30:47 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.4 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_44,J_CHICKENPOX_64,J_CHICKENPOX_66,J_CHICKENPOX_73 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBH9UlfF215809 for ; Fri, 17 Dec 2010 03:30:47 -0600 X-ASG-Debug-ID: 1292578361-712a01b00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4C4481CD7DAB for ; Fri, 17 Dec 2010 01:32:41 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id S9i2sXVqLTT5MBzS for ; Fri, 17 Dec 2010 01:32:41 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation 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.13.8/8.13.8) with ESMTP id oBH9WXBu015333 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 17 Dec 2010 04:32:33 -0500 Received: from dhcp-lab-213.englab.brq.redhat.com (dhcp-27-109.brq.redhat.com [10.34.27.109]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id oBH9WUpI011030 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 17 Dec 2010 04:32:32 -0500 Date: Fri, 17 Dec 2010 10:32:30 +0100 (CET) From: Lukas Czerner X-X-Sender: lukas@dhcp-lab-213.englab.brq.redhat.com To: Lukas Czerner cc: xfs@oss.sgi.com, esandeen@redhat.com, hch@infradead.org X-ASG-Orig-Subj: Re: [PATCH] Add test 248: Check filesystem FITRIM implementation Subject: Re: [PATCH] Add test 248: Check filesystem FITRIM implementation In-Reply-To: <1291996407-26251-1-git-send-email-lczerner@redhat.com> Message-ID: References: <1291996407-26251-1-git-send-email-lczerner@redhat.com> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1292578362 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, 10 Dec 2010, Lukas Czerner wrote: > FITRIM ioctl is used on a mounted filesystem to discard (or "trim") > blocks which are not in use by the filesystem. This is useful for > solid-state drives (SSDs) and thinly-provi-sioned storage. This test > helps to verify filesystem FITRIM implementation to assure that it > does not corrupts data. > > This test creates checksums of all files in /usr/share/doc directory and > run several processes which clear its working directory on SCRATCH_MNT, > then copy everything from /usr/share/doc into its working directory, create > list of files in working directory and its checksums and compare it with the > original list of checksums. Every process works in the loop so it repeat > remove->copy->check, while fstrim tool is running simultaneously. > > Fstrim is just a helper tool which uses FITRIM ioctl to actually do the > filesystem discard. > > I found this very useful because when the FITRIM is really buggy (thus > data-destroying) the 248 test will notice, because checksums will most > likely change. Common guys, how many times I need to repost this ? :) Or do anyone have objections ? -Lukas > > Signed-off-by: Lukas Czerner > --- > 248 | 184 +++++++++++++++++++++++++++++++++++++++++ > 248.out | 3 + > group | 1 + > src/Makefile | 2 +- > src/fstrim.c | 257 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 5 files changed, 446 insertions(+), 1 deletions(-) > create mode 100755 248 > create mode 100644 248.out > create mode 100644 src/fstrim.c > > diff --git a/248 b/248 > new file mode 100755 > index 0000000..a6cfce2 > --- /dev/null > +++ b/248 > @@ -0,0 +1,184 @@ > +#!/bin/bash > +# FS QA Test No. 248 > +# > +# This test was created in order to verify filesystem FITRIM implementation. > +# By many concurrent copy and remove operations and checking that files > +# does not change after copied into SCRATCH_MNT test if FITRIM implementation > +# corrupts the filesystem (data/metadata). > +# > +#----------------------------------------------------------------------- > +# Copyright 2010 (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 > +#----------------------------------------------------------------------- > + > +owner=lczerner@redhat.com > + > +seq=`basename $0` > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=`mktemp -d` > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 3 > +trap "_destroy; exit \$status" 2 15 > +chpid=0 > +mypid=$$ > + > +# get standard environment, filters and checks > +. ./common.rc > +. ./common.filter > + > +# real QA test starts here > +_supported_fs generic > +_supported_os Linux > +_require_scratch > +_scratch_mkfs >/dev/null 2>&1 > +_scratch_mount > + > +_cleanup() > +{ > + rm -rf $tmp > +} > + > +_destroy() > +{ > + kill $pids $fstrim_pid > + wait $pids $fstrim_pid > + rm -rf $tmp > +} > + > +_destroy_fstrim() > +{ > + kill $fpid > + wait $fpid > +} > + > +_fail() > +{ > + echo "$1" > + kill $mypid > +} > + > +## > +# Background FSTRIM loop. We are trimming the device in the loop and for > +# better test coverage, we are doing whole device trim followed by several > +# smaller trims. > +## > +fstrim_loop() > +{ > + trap "_destroy_fstrim; exit \$status" 2 15 > + fsize=$(df | grep $SCRATCH_MNT | grep $SCRATCH_DEV | awk '{print $2}') > + > + while true ; do > + step=1048576 > + start=0 > + $here/src/fstrim $SCRATCH_MNT & > + fpid=$! > + wait $fpid > + while [ $start -lt $fsize ] ; do > + $here/src/fstrim -s ${start}k -l ${step}k $SCRATCH_MNT & > + fpid=$! > + > + ## > + # All the waiting is done because Bash is incredibly > + # stupid. As you know, fstrim_loop is run at background > + # and when the test is over, or when it is killed (with > + # ^C), because of trap, it tries to kill fstrim_loop. > + # However, it does not kill currently running commands, > + # so fstrim might be still running making it impossible > + # to umount the SCRATCH_MNT and hence resulting in > + # error. > + ## > + wait $fpid > + start=$(( $start + $step )) > + done > + done > +} > + > +function check_sums() { > + dir=$1 > + > + ( > + cd $SCRATCH_MNT/$p > + find -P . -xdev -type f -print0 | xargs -0 md5sum | sort -o $tmp/stress.$$.$p > + ) > + > + diff $tmp/content.sums $tmp/stress.$$.$p > + if [ $? -ne 0 ]; then > + _fail "!!!Checksums has changed - Filesystem possibly corrupted!!!\n" > + fi > + rm -f $tmp/stress.$$.$p > +} > + > +function run_process() { > + local p=$1 > + repeat=10 > + trap "kill $chpid; wait $chpid" 2 15 > + > + sleep $((10*$p))s & > + export chpid=$! && wait $chpid &> /dev/null > + chpid=0 > + > + while [ $repeat -gt 0 ]; do > + > + # Remove old directories. > + rm -rf $SCRATCH_MNT/$p > + export chpid=$! && wait $chpid &> /dev/null > + > + # Copy content -> partition. > + mkdir $SCRATCH_MNT/$p > + cp -ax $content/* $SCRATCH_MNT/$p > + export chpid=$! && wait $chpid &> /dev/null > + > + check_sums > + repeat=$(( $repeat - 1 )) > + done > +} > + > +nproc=20 > +content=/usr/share/doc > + > +# Check for FITRIM support > +echo -n "Checking FITRIM support: " > +$here/src/fstrim -l 10M $SCRATCH_MNT > +[ $? -ne 0 ] && exit > +echo "done." > + > +mkdir -p $tmp > + > +( > +cd $content > +find -P . -xdev -type f -print0 | xargs -0 md5sum | sort -o $tmp/content.sums > +) > + > +echo -n "Running the test: " > +pids="" > +fstrim_loop & > +fstrim_pid=$! > +p=1 > +while [ $p -le $nproc ]; do > + run_process $p & > + pids="$pids $!" > + p=$(($p+1)) > +done > +echo "done." > + > +wait $pids > +kill $fstrim_pid > +wait $fstrim_pid > + > +status=0 > + > +exit > diff --git a/248.out b/248.out > new file mode 100644 > index 0000000..880d9c7 > --- /dev/null > +++ b/248.out > @@ -0,0 +1,3 @@ > +QA output created by 248 > +Checking FITRIM support: done. > +Running the test: done. > diff --git a/group b/group > index 0f94dd9..19eec07 100644 > --- a/group > +++ b/group > @@ -361,3 +361,4 @@ deprecated > 245 auto quick dir > 246 auto quick rw > 247 auto quick rw > +248 ioctl trim > diff --git a/src/Makefile b/src/Makefile > index b827bd0..885fd65 100644 > --- a/src/Makefile > +++ b/src/Makefile > @@ -17,7 +17,7 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ > preallo_rw_pattern_writer ftrunc trunc fs_perms testx looptest \ > locktest unwritten_mmap bulkstat_unlink_test t_stripealign \ > bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable \ > - stale_handle > + stale_handle fstrim > > SUBDIRS = > > diff --git a/src/fstrim.c b/src/fstrim.c > new file mode 100644 > index 0000000..45ad841 > --- /dev/null > +++ b/src/fstrim.c > @@ -0,0 +1,257 @@ > +/* > + * fstrim.c -- discard the part (or whole) of mounted filesystem. > + * > + * Copyright (C) 2009 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, either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program. If not, see . > + * > + * This program uses FITRIM ioctl to discard parts or the whole filesystem > + * online (mounted). You can specify range (start and lenght) to be > + * discarded, or simply discard while filesystem. > + * > + * Usage: fstrim [options] > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include > +#include > + > +#ifndef FITRIM > +struct fstrim_range { > + uint64_t start; > + uint64_t len; > + uint64_t minlen; > +}; > +#define FITRIM _IOWR('X', 121, struct fstrim_range) > +#endif > + > +const char *program_name = "fstrim"; > + > +struct options { > + struct fstrim_range *range; > + char mpoint[PATH_MAX]; > + char verbose; > +}; > + > +static void usage(void) > +{ > + fprintf(stderr, > + "Usage: %s [-s start] [-l length] [-m minimum-extent]" > + " [-v] {mountpoint}\n\t" > + "-s Starting Byte to discard from\n\t" > + "-l Number of Bytes to discard from the start\n\t" > + "-m Minimum extent length to discard\n\t" > + "-v Verbose - number of discarded bytes\n", > + program_name); > +} > + > +static void err_exit(const char *fmt, ...) > +{ > + va_list pvar; > + va_start(pvar, fmt); > + vfprintf(stderr, fmt, pvar); > + va_end(pvar); > + usage(); > + exit(EXIT_FAILURE); > +} > + > +/** > + * Get the number from argument. It can be number followed by > + * units: k|K, m|M, g|G, t|T > + */ > +static unsigned long long get_number(char **optarg) > +{ > + char *opt, *end; > + unsigned long long number, max; > + > + /* get the max to avoid overflow */ > + max = ULLONG_MAX / 1024; > + number = 0; > + opt = *optarg; > + > + if (*opt == '-') { > + err_exit("%s: %s (%s)\n", program_name, > + strerror(ERANGE), *optarg); > + } > + > + errno = 0; > + number = strtoul(opt, &end , 0); > + if (errno) > + err_exit("%s: %s (%s)\n", program_name, > + strerror(errno), *optarg); > + > + /* > + * Convert units to numbers. Fall-through stack is used for units > + * so absence of breaks is intentional. > + */ > + switch (*end) { > + case 'T': /* terabytes */ > + case 't': > + if (number > max) > + err_exit("%s: %s (%s)\n", program_name, > + strerror(ERANGE), *optarg); > + number *= 1024; > + case 'G': /* gigabytes */ > + case 'g': > + if (number > max) > + err_exit("%s: %s (%s)\n", program_name, > + strerror(ERANGE), *optarg); > + number *= 1024; > + case 'M': /* megabytes */ > + case 'm': > + if (number > max) > + err_exit("%s: %s (%s)\n", program_name, > + strerror(ERANGE), *optarg); > + number *= 1024; > + case 'K': /* kilobytes */ > + case 'k': > + if (number > max) > + err_exit("%s: %s (%s)\n", program_name, > + strerror(ERANGE), *optarg); > + number *= 1024; > + end++; > + case '\0': /* end of the string */ > + break; > + default: > + err_exit("%s: %s (%s)\n", program_name, > + strerror(EINVAL), *optarg); > + return 0; > + } > + > + if (*end != '\0') { > + err_exit("%s: %s (%s)\n", program_name, > + strerror(EINVAL), *optarg); > + } > + > + return number; > +} > + > +static int parse_opts(int argc, char **argv, struct options *opts) > +{ > + int c; > + > + while ((c = getopt(argc, argv, "s:l:m:v")) != EOF) { > + switch (c) { > + case 's': /* starting point */ > + opts->range->start = get_number(&optarg); > + break; > + case 'l': /* length */ > + opts->range->len = get_number(&optarg); > + break; > + case 'm': /* minlen */ > + opts->range->minlen = get_number(&optarg); > + break; > + case 'v': /* verbose */ > + opts->verbose = 1; > + break; > + default: > + return EXIT_FAILURE; > + } > + } > + > + return 0; > +} > + > +int main(int argc, char **argv) > +{ > + struct options *opts; > + struct stat sb; > + int fd, err = 0, ret = EXIT_FAILURE; > + > + opts = malloc(sizeof(struct options)); > + if (!opts) > + err_exit("%s: malloc(): %s\n", program_name, strerror(errno)); > + > + opts->range = NULL; > + opts->verbose = 0; > + > + if (argc > 1) > + strncpy(opts->mpoint, argv[argc - 1], sizeof(opts->mpoint)); > + > + opts->range = calloc(1, sizeof(struct fstrim_range)); > + if (!opts->range) { > + fprintf(stderr, "%s: calloc(): %s\n", program_name, > + strerror(errno)); > + goto free_opts; > + } > + > + opts->range->len = ULLONG_MAX; > + > + if (argc > 2) > + err = parse_opts(argc, argv, opts); > + > + if (err) { > + usage(); > + goto free_opts; > + } > + > + if (strnlen(opts->mpoint, 1) < 1) { > + fprintf(stderr, "%s: You have to specify mount point.\n", > + program_name); > + usage(); > + goto free_opts; > + } > + > + if (stat(opts->mpoint, &sb) == -1) { > + fprintf(stderr, "%s: %s: %s\n", program_name, > + opts->mpoint, strerror(errno)); > + usage(); > + goto free_opts; > + } > + > + if (!S_ISDIR(sb.st_mode)) { > + fprintf(stderr, "%s: %s: (%s)\n", program_name, > + opts->mpoint, strerror(ENOTDIR)); > + usage(); > + goto free_opts; > + } > + > + fd = open(opts->mpoint, O_RDONLY); > + if (fd < 0) { > + fprintf(stderr, "%s: open(%s): %s\n", program_name, > + opts->mpoint, strerror(errno)); > + goto free_opts; > + } > + > + if (ioctl(fd, FITRIM, opts->range)) { > + fprintf(stderr, "%s: FSTRIM: %s\n", program_name, > + strerror(errno)); > + goto free_opts; > + } > + > + if ((opts->verbose) && (opts->range)) > + fprintf(stdout, "%lu Bytes were trimmed\n", opts->range->len); > + > + ret = EXIT_SUCCESS; > + > +free_opts: > + if (opts) { > + if (opts->range) > + free(opts->range); > + free(opts); > + } > + > + return ret; > +} > -- From BATV+a54cfc6daf38c44dd5c4+2672+infradead.org+hch@bombadil.srs.infradead.org Fri Dec 17 05:16:52 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBHBGnOh222141 for ; Fri, 17 Dec 2010 05:16:52 -0600 X-ASG-Debug-ID: 1292584724-5a6d01530000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id ECE001CD6FDB for ; Fri, 17 Dec 2010 03:18:44 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id uNbzOhc1KYVmBSZW for ; Fri, 17 Dec 2010 03:18:44 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PTYKh-0004Ey-8p; Fri, 17 Dec 2010 11:18:43 +0000 Date: Fri, 17 Dec 2010 06:18:43 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/9] xfs: fix EFI transaction cancellation. Subject: Re: [PATCH 1/9] xfs: fix EFI transaction cancellation. Message-ID: <20101217111843.GA12965@infradead.org> References: <1292214743-18073-1-git-send-email-david@fromorbit.com> <1292214743-18073-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292214743-18073-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[18.85.46.34] X-Barracuda-Start-Time: 1292584724 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Looks good, Reviewed-by: Christoph Hellwig From BATV+a54cfc6daf38c44dd5c4+2672+infradead.org+hch@bombadil.srs.infradead.org Fri Dec 17 05:21:00 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_21 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBHBL0Y6222425 for ; Fri, 17 Dec 2010 05:21:00 -0600 X-ASG-Debug-ID: 1292584974-5bf502e70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0E4011FB940 for ; Fri, 17 Dec 2010 03:22:54 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 2MQofLxmi8sNL2q0 for ; Fri, 17 Dec 2010 03:22:54 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PTYOk-00050A-Fy; Fri, 17 Dec 2010 11:22:54 +0000 Date: Fri, 17 Dec 2010 06:22:54 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/9] xfs: Pull EFI/EFD handling out from under the AIL lock Subject: Re: [PATCH 2/9] xfs: Pull EFI/EFD handling out from under the AIL lock Message-ID: <20101217112254.GB12965@infradead.org> References: <1292214743-18073-1-git-send-email-david@fromorbit.com> <1292214743-18073-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292214743-18073-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[18.85.46.34] X-Barracuda-Start-Time: 1292584975 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Looks good, Reviewed-by: Christoph Hellwig Some minor comments below: > +STATIC void > +__xfs_efi_release( > + struct xfs_efi_log_item *efip) > +{ > + struct xfs_ail *ailp = efip->efi_item.li_ailp; > + > + if (!test_and_clear_bit(XFS_EFI_COMMITTED, &efip->efi_flags)) { > + spin_lock(&ailp->xa_lock); > + /* xfs_trans_ail_delete() drops the AIL lock. */ > + xfs_trans_ail_delete(ailp, (xfs_log_item_t *)efip); The second argument should be &efip->efi_item to preserve ty;e safety. > void > xfs_efi_release(xfs_efi_log_item_t *efip, > uint nextents) > { > + ASSERT(atomic_read(&efip->efi_next_extent) >= nextents); > + if (!atomic_sub_and_test(nextents, &efip->efi_next_extent)) > + return; > > + __xfs_efi_release(efip); Why not just: if (atomic_sub_and_test(nextents, &efip->efi_next_extent)) __xfs_efi_release(efip); ? From BATV+a54cfc6daf38c44dd5c4+2672+infradead.org+hch@bombadil.srs.infradead.org Fri Dec 17 05:23:09 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBHBN9G9222564 for ; Fri, 17 Dec 2010 05:23:09 -0600 X-ASG-Debug-ID: 1292585103-1b22037d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6AA59145EDFD for ; Fri, 17 Dec 2010 03:25:03 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id r1q6OZCPUJtsvk5M for ; Fri, 17 Dec 2010 03:25:03 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PTYQo-0005i5-MH; Fri, 17 Dec 2010 11:25:02 +0000 Date: Fri, 17 Dec 2010 06:25:02 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/9] xfs: bulk AIL insertion during transaction commit Subject: Re: [PATCH 4/9] xfs: bulk AIL insertion during transaction commit Message-ID: <20101217112502.GC12965@infradead.org> References: <1292214743-18073-1-git-send-email-david@fromorbit.com> <1292214743-18073-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292214743-18073-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1292585104 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Looks good, Reviewed-by: Christoph Hellwig Minor style nipicks below: > + /* > + * Not a bulk update option due to unusual item_lsn. > + * Push into AIL immediately, rechecking the lsn once > + * we have the ail lock. Then unpin the item. > + */ > + spin_lock(&ailp->xa_lock); > + if (XFS_LSN_CMP(item_lsn, lip->li_lsn) > 0) { > + xfs_trans_ail_update(ailp, lip, item_lsn); > + } else { > + spin_unlock(&ailp->xa_lock); > + } No need for the curly braces. > + ASSERT((&next_lip->li_ail == &ailp->xa_ail) || > + (XFS_LSN_CMP(next_lip->li_lsn, lsn) <= 0)); No need for the inner braces. From BATV+a54cfc6daf38c44dd5c4+2672+infradead.org+hch@bombadil.srs.infradead.org Fri Dec 17 05:23:44 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBHBNiTB222602 for ; Fri, 17 Dec 2010 05:23:44 -0600 X-ASG-Debug-ID: 1292585139-6dad01910000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id AFFCE1FB94F for ; Fri, 17 Dec 2010 03:25:39 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 9A72kaX0XK6kfsgr for ; Fri, 17 Dec 2010 03:25:39 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PTYRP-0005iy-Aq; Fri, 17 Dec 2010 11:25:39 +0000 Date: Fri, 17 Dec 2010 06:25:39 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 7/9] xfs: remove all the inodes on a buffer from the AIL in bulk Subject: Re: [PATCH 7/9] xfs: remove all the inodes on a buffer from the AIL in bulk Message-ID: <20101217112539.GD12965@infradead.org> References: <1292214743-18073-1-git-send-email-david@fromorbit.com> <1292214743-18073-8-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292214743-18073-8-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1292585139 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Looks good for now, Reviewed-by: Christoph Hellwig From BATV+a54cfc6daf38c44dd5c4+2672+infradead.org+hch@bombadil.srs.infradead.org Fri Dec 17 08:14:04 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBHEE3P0233142 for ; Fri, 17 Dec 2010 08:14:04 -0600 X-ASG-Debug-ID: 1292595358-0daa03670000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5D7381DB9DC8 for ; Fri, 17 Dec 2010 06:15:58 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id XiFnAFNNqFnBMiox for ; Fri, 17 Dec 2010 06:15:58 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PTb6C-0000H0-M8; Fri, 17 Dec 2010 14:15:56 +0000 Date: Fri, 17 Dec 2010 09:15:56 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 8/9] xfs: use AIL bulk update function to implement single updates Subject: Re: [PATCH 8/9] xfs: use AIL bulk update function to implement single updates Message-ID: <20101217141556.GA30830@infradead.org> References: <1292214743-18073-1-git-send-email-david@fromorbit.com> <1292214743-18073-9-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292214743-18073-9-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1292595358 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 13, 2010 at 03:32:22PM +1100, Dave Chinner wrote: > From: Dave Chinner > > We now have two copies of AIL insert operations that are mostly > duplicate functionality. The single log item updates can be > implemented via the bulk updates by turning xfs_trans_ail_update() > into a simple wrapper. This removes all the duplicate insert > functionality and associated helpers. Looks good, Reviewed-by: Christoph Hellwig > + struct xfs_ail *ailp, > +static inline void > +xfs_trans_ail_update( > + xfs_log_item_t *lip, > + xfs_lsn_t lsn) __releases(ailp->xa_lock) > +{ > + struct xfs_log_item *log_items[1] = { lip, }; > + > + xfs_trans_ail_update_bulk(ailp, log_items, 1, lsn); This could be simplified down to: xfs_trans_ail_update_bulk(ailp, &lip, 1, lsn); at which point it could even become a macro. From BATV+a54cfc6daf38c44dd5c4+2672+infradead.org+hch@bombadil.srs.infradead.org Fri Dec 17 08:14:39 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBHEEdKh233175 for ; Fri, 17 Dec 2010 08:14:39 -0600 X-ASG-Debug-ID: 1292595393-1bee036c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 39A64145BDC3 for ; Fri, 17 Dec 2010 06:16:34 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id IoYtw6bBFdCVduuU for ; Fri, 17 Dec 2010 06:16:34 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PTb6n-0000HT-It; Fri, 17 Dec 2010 14:16:33 +0000 Date: Fri, 17 Dec 2010 09:16:33 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 9/9] xfs: use AIL bulk delete function to implement single delete Subject: Re: [PATCH 9/9] xfs: use AIL bulk delete function to implement single delete Message-ID: <20101217141633.GB30830@infradead.org> References: <1292214743-18073-1-git-send-email-david@fromorbit.com> <1292214743-18073-10-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292214743-18073-10-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1292595394 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 13, 2010 at 03:32:23PM +1100, Dave Chinner wrote: > From: Dave Chinner > > We now have two copies of AIL delete operations that are mostly > duplicate functionality. The single log item deletes can be > implemented via the bulk updates by turning xfs_trans_ail_delete() > into a simple wrapper. This removes all the duplicate delete > functionality and associated helpers. Looks good, Reviewed-by: Christoph Hellwig The same comment about just taking the address as for the previous patch applies. From aelder@oss.sgi.com Fri Dec 17 09:59:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBHFxKGp241280 for ; Fri, 17 Dec 2010 09:59:20 -0600 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id oBHFxKBD241172; Fri, 17 Dec 2010 09:59:20 -0600 Date: Fri, 17 Dec 2010 09:59:20 -0600 Message-Id: <201012171559.oBHFxKBD241172@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v2.6.37-rc4-23-g489a150 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 05340d4ab2ec2b6b4962c1c41c6ea8fb550f947b X-Git-Newrev: 489a150f6454e2cd93d9e0ee6d7c5a361844f62a This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, master has been updated 489a150 xfs: factor duplicate code in xfs_alloc_ag_vextent_near into a helper 9f9baab xfs: clean up xfs_alloc_ag_vextent_exact ecff71e xfs: simplify xfs_map_at_offset aeea1b1 xfs: refactor xfs_vm_writepage 2fa24f9 xfs: remove the all_bh flag from xfs_convert_page ed1e7b7 xfs: remove xfs_probe_cluster 8ff2957 xfs: simplify xfs_map_blocks a206c81 xfs: kill xfs_iomap 405f804 xfs: cleanup the xfs_iomap_write_* helpers 6ac7248 xfs: a few small tweaks for overwrites in xfs_vm_writepage 221cb25 xfs: remove some dead bio handling code 85da94c xfs: improve mapping type check in xfs_vm_writepage c9f71f5 xfs: untangle phase1 vs phase2 recovery helpers d045094 xfs: refactor xlog_recover_commit_trans d5689ea xfs: use struct list_head for the buf cancel table e2714bf xfs: remove leftovers of old buffer log items in recovery code 576ecb8 xfs: fix exporting with left over 64-bit inodes from 05340d4ab2ec2b6b4962c1c41c6ea8fb550f947b (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 489a150f6454e2cd93d9e0ee6d7c5a361844f62a Author: Christoph Hellwig Date: Fri Dec 10 15:04:11 2010 +0000 xfs: factor duplicate code in xfs_alloc_ag_vextent_near into a helper Add a new xfs_alloc_find_best_extent that does a forward/backward search in the allocation btree. That code previously was existed two times in xfs_alloc_ag_vextent_near, once for each search direction. Based on an earlier patch from Dave Chinner. Signed-off-by: Christoph Hellwig Signed-off-by: Alex Elder commit 9f9baab38dacd11fe6095a1e59f3783a305f7020 Author: Christoph Hellwig Date: Fri Dec 10 15:03:57 2010 +0000 xfs: clean up xfs_alloc_ag_vextent_exact Use a goto label to consolidate all block not found cases, and add a tracepoint for them. Also clean up a few whitespace issues. Based on an earlier patch from Dave Chinner. Signed-off-by: Christoph Hellwig Signed-off-by: Alex Elder commit ecff71e677c6d469f525dcf31ada709d5858307c Author: Christoph Hellwig Date: Fri Dec 10 08:42:25 2010 +0000 xfs: simplify xfs_map_at_offset Move the buffer locking into the callers as they need to do it wether they call xfs_map_at_offset or not. Remove the b_bdev assignment, which is already done by get_blocks. Remove the duplicate extent type asserts in xfs_convert_page just before calling xfs_map_at_offset. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit aeea1b1f81800e362a3aca86d769d02e137a8fa7 Author: Christoph Hellwig Date: Fri Dec 10 08:42:24 2010 +0000 xfs: refactor xfs_vm_writepage After the last patches the code for overwrites is the same as for delayed and unwritten extents except that it doesn't need to call xfs_map_at_offset. Take care of that fact to simplify xfs_vm_writepage. The buffer loop now first checks the type of buffer and checks/sets the ioend type, or continues to the next buffer if it's not interesting to us. Only after that we validate the iomap and perform the block mapping if needed, all in common code for the cases where we have to do work. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit 2fa24f92530edaf86c3b5f662464e0d2e3b3e517 Author: Christoph Hellwig Date: Fri Dec 10 08:42:23 2010 +0000 xfs: remove the all_bh flag from xfs_convert_page The all_bh flag is always set when entering the page clustering machinery with a regular written extent, which means the check for it is superflous. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit ed1e7b7e484dfb64168755613d499f32a97409bd Author: Christoph Hellwig Date: Fri Dec 10 08:42:22 2010 +0000 xfs: remove xfs_probe_cluster xfs_map_blocks always calls xfs_bmapi with the XFS_BMAPI_ENTIRE entire flag, which tells it to not cap the extent at the passed in size, but just treat the size as an minimum to map. This means xfs_probe_cluster is entirely useless as we'll always get the whole extent back anyway. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit 8ff2957d581582890693affc09920108a67cb05d Author: Christoph Hellwig Date: Fri Dec 10 08:42:21 2010 +0000 xfs: simplify xfs_map_blocks No need to lock the extent map exclusive when performing an overwrite, we know the extent map must already have been loaded by get_blocks. Apply the non-blocking inode semantics to all mapping types instead of just delayed allocations. Remove the handling of not yet allocated blocks for the IO_UNWRITTEN case - if an extent is marked as unwritten allocated in the buffer it must already have an extent on disk. Add asserts to verify all the assumptions above in debug builds. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit a206c817c864583c44e2f418db8e6c7a000fbc38 Author: Christoph Hellwig Date: Fri Dec 10 08:42:20 2010 +0000 xfs: kill xfs_iomap Opencode the xfs_iomap code in it's two callers. The overlap of passed flags already was minimal and will be further reduced in the next patch. As a side effect the BMAPI_* flags for xfs_bmapi and the IO_* flags for I/O end processing are merged into a single set of flags, which should be a bit more descriptive of the operation we perform. Also improve the tracing by giving each caller it's own type set of tracepoints. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit 405f80429436d38ab4e6b4c0d99861a1f00648fd Author: Christoph Hellwig Date: Fri Dec 10 08:42:19 2010 +0000 xfs: cleanup the xfs_iomap_write_* helpers Remove passing the BMAPI_* flags to these helpers, in xfs_iomap_write_direct the check BMAPI_DIRECT was always true, and in the xfs_iomap_write_delay path is was never checked at all. Remove the nmap return value as we never make use of it. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit 6ac7248ec5f20cb44a063d7c7191b8e0068b5a28 Author: Christoph Hellwig Date: Fri Dec 10 08:42:18 2010 +0000 xfs: a few small tweaks for overwrites in xfs_vm_writepage Don't trylock the buffer. We are the only one ever locking it for a regular file address space, and trylock was only copied from the generic code which did it due to the old buffer based writeout in jbd. Also make sure to only write out the buffer if the iomap actually is valid, because we wouldn't have a proper mapping otherwise. In practice we will never get an invalid mapping here as the page lock guarantees truncate doesn't race with us, but better be safe than sorry. Also make sure we allocate a new ioend when crossing boundaries between mappings, just like we do for delalloc and unwritten extents. Again this currently doesn't matter as the I/O end handler only cares for the boundaries for unwritten extents, but this makes the code fully correct and the same as for delalloc/unwritten extents. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit 221cb2517e8fc9a1d67c7a8a9c19fc5a916b583f Author: Christoph Hellwig Date: Fri Dec 10 08:42:17 2010 +0000 xfs: remove some dead bio handling code We'll never have BIO_EOPNOTSUPP set after calling submit_bio as this can only happen for discards, and used to happen for barriers, none of which is every submitted by xfs_submit_ioend_bio. Also remove the loop around bio_alloc as it will never fail due to it's mempool backing. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit 85da94c6b4666582c38579ccdcd90a5d9b5697ef Author: Christoph Hellwig Date: Fri Dec 10 08:42:16 2010 +0000 xfs: improve mapping type check in xfs_vm_writepage Currently we only refuse a "read-only" mapping for writing out unwritten and delayed buffers, and refuse any other for overwrites. Improve the checks to require delalloc mappings for delayed buffers, and unwritten extent mappings for unwritten extents. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Alex Elder commit c9f71f5fc4390ea3a8087c00d53a799e7e0f0f8e Author: Christoph Hellwig Date: Wed Dec 1 22:06:24 2010 +0000 xfs: untangle phase1 vs phase2 recovery helpers Dispatch to a different helper for phase1 vs phase2 in xlog_recover_commit_trans instead of doing it in all the low-level functions. Signed-off-by: Christoph Hellwig Signed-off-by: Alex Elder commit d0450948641b2090b5d467ba638bbebd40b20b21 Author: Christoph Hellwig Date: Wed Dec 1 22:06:23 2010 +0000 xfs: refactor xlog_recover_commit_trans Merge the call to xlog_recover_reorder_trans and the loop over the recovery items from xlog_recover_do_trans into xlog_recover_commit_trans, and keep the switch statement over the log item types as a separate helper. Signed-off-by: Christoph Hellwig Signed-off-by: Alex Elder commit d5689eaa0ac5588cf459ee32f86d5700dd7d6403 Author: Christoph Hellwig Date: Wed Dec 1 22:06:22 2010 +0000 xfs: use struct list_head for the buf cancel table Signed-off-by: Christoph Hellwig Signed-off-by: Alex Elder commit e2714bf8d5c8e131a6df6b0ea2269433e9a03a9b Author: Christoph Hellwig Date: Wed Dec 1 22:06:21 2010 +0000 xfs: remove leftovers of old buffer log items in recovery code XFS used to support different types of buffer log items long time ago. Remove the switch statements checking the log item type in various buffer recovery helpers that were left over from those days and the rather useless xlog_recover_do_buffer_pass2 wrapper. Signed-off-by: Christoph Hellwig Signed-off-by: Alex Elder commit 576ecb8e2b725726471cc62b12c01e28d33127ba Author: Samuel Kvasnica Date: Fri Nov 19 13:38:49 2010 +0000 xfs: fix exporting with left over 64-bit inodes We now support mounting and using filesystems with 64-bit inodes even when not mounted with the inode64 option (which now only controls if we allocate new inodes in that space or not). Make sure we always use large NFS file handles when exporting a filesystem that may contain 64-bit inodes. Note that this only affects newly generated file handles, any outstanding 32-bit file handle is still accepted. [hch: the comment and commit log are mine, the rest is from a patch snipplet from Samuel] Signed-off-by: Christoph Hellwig Signed-off-by: Alex Elder ----------------------------------------------------------------------- Summary of changes: fs/xfs/linux-2.6/xfs_aops.c | 425 ++++++++++++------------------ fs/xfs/linux-2.6/xfs_aops.h | 16 ++ fs/xfs/linux-2.6/xfs_export.c | 12 +- fs/xfs/linux-2.6/xfs_trace.h | 29 ++- fs/xfs/xfs_alloc.c | 351 ++++++++++--------------- fs/xfs/xfs_buf_item.h | 11 - fs/xfs/xfs_iomap.c | 149 +---------- fs/xfs/xfs_iomap.h | 27 +-- fs/xfs/xfs_log_priv.h | 6 +- fs/xfs/xfs_log_recover.c | 585 ++++++++++++++++------------------------- 10 files changed, 606 insertions(+), 1005 deletions(-) hooks/post-receive -- XFS development tree From npiggin@gmail.com Fri Dec 17 11:38:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBHHcUBm248408 for ; Fri, 17 Dec 2010 11:38:30 -0600 X-ASG-Debug-ID: 1292607624-774d000b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-wy0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DC8881CD949A for ; Fri, 17 Dec 2010 09:40:24 -0800 (PST) Received: from mail-wy0-f181.google.com (mail-wy0-f181.google.com [74.125.82.181]) by cuda.sgi.com with ESMTP id iNl6zYSZKKANI6aN for ; Fri, 17 Dec 2010 09:40:24 -0800 (PST) Received: by wyf22 with SMTP id 22so901160wyf.26 for ; Fri, 17 Dec 2010 09:40:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:date:message-id :subject:from:to:content-type; bh=Xf8HaQO76VA2q+Qsirn/wBu28Dva9RcBKOVkiC6KoS0=; b=PwU976w2owUoGx7hoJbMxWoYz4yjiG82hN8q9K23tB33hpke+nIPtr1i/VQe9bfNw6 /64X2dO8cvW3M5a34QxGl4S2Uze2lN41q0NA263qKo+CmuEWzNFqwrhq06Daq/VF1/1T uKwf6OYDiqGjgxFZcKeReuIBjUIjlX0zQuJ2Y= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=kQgB1v0JqPghZygMj/d/ozbVSsYi458U6ypllbEjeWKOlyOf/W1Io4UhqTr61xrTr8 ulLKyrQjK1O42s4PwQRGaigtxs2e+EjgDQqRCclJ15BEEJ5hWs7fG+Y3tyg1Y7KIyRjk v10o5CThGdfC3hxybeDq3ydzUgw06X0w2SuUk= MIME-Version: 1.0 Received: by 10.216.220.219 with SMTP id o69mr1426252wep.57.1292607623580; Fri, 17 Dec 2010 09:40:23 -0800 (PST) Received: by 10.216.21.84 with HTTP; Fri, 17 Dec 2010 09:40:23 -0800 (PST) Date: Sat, 18 Dec 2010 04:40:23 +1100 Message-ID: X-ASG-Orig-Subj: Another questionable lock order bug Subject: Another questionable lock order bug From: Nick Piggin To: xfs@oss.sgi.com, Dave Chinner Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-wy0-f181.google.com[74.125.82.181] X-Barracuda-Start-Time: 1292607624 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49709 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean With the iprune_sem and iolock lock order warnings taken care of, lockdep soon after chokes on i_lock [ 716.364005] inconsistent {RECLAIM_FS-ON-R} -> {IN-RECLAIM_FS-W} usage. [ 716.364005] cp/8370 [HC0[0]:SC0[0]:HE1:SE1] takes: [ 716.364005] (&(&ip->i_lock)->mr_lock){++++-?}, at: [] xfs_ilock+0x8c/0x150 [xfs] [ 716.364005] {RECLAIM_FS-ON-R} state was registered at: [ 716.364005] [] mark_held_locks+0x6b/0xa0 [ 716.364005] [] lockdep_trace_alloc+0x91/0xd0 [ 716.364005] [] __kmalloc+0x5a/0x220 [ 716.364005] [] kmem_alloc+0x87/0xd0 [xfs] [ 716.364005] [] xfs_attr_shortform_list+0xfb/0x480 [xfs] [ 716.364005] [] xfs_attr_list_int+0xd8/0xe0 [xfs] [ 716.364005] [] xfs_vn_listxattr+0x7f/0x160 [xfs] [ 716.364005] [] vfs_listxattr+0x1f/0x30 [ 716.364005] [] listxattr+0x3f/0xf0 [ 716.364005] [] sys_flistxattr+0x44/0x70 [ 716.364005] [] system_call_fastpath+0x16/0x1b[ 716.364005] irq event stamp: 322521151 [ 716.364005] hardirqs last enabled at (322521151): [] mutex_trylock+0x11d/0x190 [ 716.364005] hardirqs last disabled at (322521150): [] mutex_trylock+0x3e/0x190 [ 716.364005] softirqs last enabled at (322518910): [] __do_softirq+0x16e/0x360 [ 716.364005] softirqs last disabled at (322518881): [] call_softirq+0x1c/0x50 [ 716.364005] [ 716.364005] other info that might help us debug this: [ 716.364005] 3 locks held by cp/8370: [ 716.364005] #0: (xfs_iolock_active){++++++}, at: [] xfs_ilock+0xa5/0x150 [xfs] [ 716.364005] #1: (shrinker_rwsem){++++..}, at: [] shrink_slab+0x38/0x190 [ 716.364005] #2: (&pag->pag_ici_reclaim_lock){+.+...}, at: [] xfs_reclaim_inodes_ag+ 0xa4/0x360 [xfs] [ 716.364005] [ 716.364005] stack backtrace: [ 716.364005] Pid: 8370, comm: cp Not tainted 2.6.37-rc6+ #116 [ 716.364005] Call Trace: [ 716.364005] [] print_usage_bug+0x170/0x180 [ 716.364005] [] mark_lock+0x211/0x400 [ 716.364005] [] __lock_acquire+0x40e/0x1490 [ 716.364005] [] lock_acquire+0x95/0x1b0 [ 716.364005] [] ? xfs_ilock+0x8c/0x150 [xfs] [ 716.364005] [] ? rcu_read_lock_held+0x2c/0x30 [ 716.364005] [] down_write_nested+0x4a/0x70 [ 716.364005] [] ? xfs_ilock+0x8c/0x150 [xfs] [ 716.364005] [] xfs_ilock+0x8c/0x150 [xfs] [ 716.364005] [] xfs_reclaim_inode+0x36/0x270 [xfs] [ 716.364005] [] xfs_reclaim_inodes_ag+0x20f/0x360 [xfs] [ 716.364005] [] xfs_reclaim_inode_shrink+0x78/0x80 [xfs] [ 716.364005] [] shrink_slab+0x127/0x190 [ 716.364005] [] zone_reclaim+0x349/0x420 I assume this should be a false positive too, for the same reason, and could be handled the same way as iolock. Thanks, Nick From npiggin@gmail.com Fri Dec 17 12:02:48 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBHI2lhO250102 for ; Fri, 17 Dec 2010 12:02:48 -0600 X-ASG-Debug-ID: 1292609080-145b02b30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-wy0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A0DA614611B7 for ; Fri, 17 Dec 2010 10:04:41 -0800 (PST) Received: from mail-wy0-f181.google.com (mail-wy0-f181.google.com [74.125.82.181]) by cuda.sgi.com with ESMTP id 7OHA2bcU8zE2CoMT for ; Fri, 17 Dec 2010 10:04:41 -0800 (PST) Received: by wyf22 with SMTP id 22so924888wyf.26 for ; Fri, 17 Dec 2010 10:04:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:date:message-id :subject:from:to:content-type; bh=vnhVuyxXyFl3S2tM8wiz0NQBoRs6iHU+sNfK8loVwGM=; b=fbGRmdAUm2NbZS6lK0lKbbr3MtVKdn7mMvl7i+lWQ4/UF0lMifrDtdGsKy8fai8O1i hryVY+Xd8XQxb0y0HvRWnjIXnOvviTU79mxTsXmf1g6q99YUoZPbodFQr7Hj5VepuU5V aGcwpieDdygIelxVxoDhOMlKY4UW7DV4B12Ek= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=YOToVi27zu6/4o/nIb2Ak/zpK2IwqP1Qx5GbbSxLZ1zLfPnZNwzA6Z3G6Z54e50qFQ YNt3Q7njMCoIWca2FAJ80utNY08rx2FANx/J3Y46ouvJxO5tfSd62jS6XIp4VKOTLcb4 BjWoT8VI/wTjfRDodSGTSukEvvRgHocgHqu4w= MIME-Version: 1.0 Received: by 10.216.155.75 with SMTP id i53mr1044987wek.27.1292609080577; Fri, 17 Dec 2010 10:04:40 -0800 (PST) Received: by 10.216.21.84 with HTTP; Fri, 17 Dec 2010 10:04:40 -0800 (PST) Date: Sat, 18 Dec 2010 05:04:40 +1100 Message-ID: X-ASG-Orig-Subj: xfs_efi_item slab leak Subject: xfs_efi_item slab leak From: Nick Piggin To: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-wy0-f181.google.com[74.125.82.181] X-Barracuda-Start-Time: 1292609082 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49710 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean After running xfstests and then unmounting and rmmodding xfs, I get this bug [ 3473.194517] ============================================================================= [ 3473.194697] BUG xfs_efi_item: Objects remaining on kmem_cache_close() [ 3473.194793] ----------------------------------------------------------------------------- [ 3473.194794] [ 3473.195056] INFO: Slab 0xffffea0006ad5e00 objects=35 used=2 fp=0xffff8801e8640e80 flags=0xc000000000004080 [ 3473.195201] Pid: 22011, comm: rmmod Not tainted 2.6.37-rc6+ #116 [ 3473.195201] Call Trace: [ 3473.195201] [] slab_err+0x91/0xa0 [ 3473.195201] [] ? __slab_alloc+0x138/0x480 [ 3473.195201] [] ? trace_hardirqs_off+0xd/0x10 [ 3473.195201] [] ? kmem_cache_destroy+0x154/0x3e0 [ 3473.195201] [] ? trace_hardirqs_off+0xd/0x10 [ 3473.195201] [] ? __kmalloc+0x104/0x220 [ 3473.195201] [] kmem_cache_destroy+0x177/0x3e0 [ 3473.195201] [] xfs_destroy_zones+0x37/0x100 [xfs] [ 3473.195201] [] exit_xfs_fs+0x33/0x3d [xfs] [ 3473.195201] [] sys_delete_module+0x17a/0x270 [ 3473.195201] [] ? lockdep_sys_exit_thunk+0x35/0x67 [ 3473.195201] [] system_call_fastpath+0x16/0x1b [ 3473.195201] INFO: Object 0xffff8801e8640910 @offset=2320 [ 3473.195201] INFO: Allocated in kmem_zone_alloc+0x8c/0xd0 [xfs] age=2263917 cpu=15 pid=4514 [ 3473.195201] INFO: Freed in xfs_efi_item_free+0x19/0x30 [xfs] age=2263918 cpu=15 pid=4514 [ 3473.195201] INFO: Object 0xffff8801e86427e0 @offset=10208 [ 3473.195201] INFO: Allocated in kmem_zone_alloc+0x8c/0xd0 [xfs] age=2103034 cpu=15 pid=22329 [ 3473.195201] INFO: Freed in xfs_efi_item_free+0x19/0x30 [xfs] age=2103034 cpu=15 pid=22329 [ 3473.197616] SLUB xfs_efi_item: kmem_cache_destroy called for cache that still has objects. [ 3473.197794] Pid: 22011, comm: rmmod Not tainted 2.6.37-rc6+ #116 [ 3473.197892] Call Trace: [ 3473.197980] [] kmem_cache_destroy+0x357/0x3e0 [ 3473.198120] [] xfs_destroy_zones+0x37/0x100 [xfs] [ 3473.198240] [] exit_xfs_fs+0x33/0x3d [xfs] [ 3473.198337] [] sys_delete_module+0x17a/0x270 [ 3473.198435] [] ? lockdep_sys_exit_thunk+0x35/0x67 [ 3473.198534] [] system_call_fastpath+0x16/0x1b From anpmmsskh@sohu.com Fri Dec 17 12:05:38 2010 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBHI5bbd250266 for ; Fri, 17 Dec 2010 12:05:38 -0600 X-ASG-Debug-ID: 1292609244-4fe200f20000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from relay.mail.sohu.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3E3991FD509 for ; Fri, 17 Dec 2010 10:07:25 -0800 (PST) Received: from relay.mail.sohu.com (websmtp.sohu.com [61.135.132.132]) by cuda.sgi.com with ESMTP id x4GT6r83mMkTZ8Qk for ; Fri, 17 Dec 2010 10:07:25 -0800 (PST) Received: from rxuizuphd (unknown [183.38.87.196]) by relay.mail.sohu.com (Postfix) with ESMTPA id 77B0C6F8F35; Sat, 18 Dec 2010 02:06:46 +0800 (CST) Reply-To: Sender: anpmmsskh@sohu.com Message-ID: <3702138C9A111E243A5907D66F3CD432@rxuizuphd> From: "CHUN BAO" To: X-ASG-Orig-Subj: Supply dry porcini, dry shiitake, and dry champignons Subject: Supply dry porcini, dry shiitake, and dry champignons Date: Sat, 18 Dec 2010 02:02:52 +0800 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_044F_0116071A.196A1590" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5512 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5512 X-SOHU-Antispam-Bayes: 0 X-Barracuda-Connect: websmtp.sohu.com[61.135.132.132] X-Barracuda-Start-Time: 1292609252 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1001.00 X-Barracuda-Spam-Status: No, SCORE=-1001.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is a multi-part message in MIME format. ------=_NextPart_000_044F_0116071A.196A1590 Content-Type: multipart/alternative; boundary="----=_NextPart_001_04E6_0116071A.196A1590" ------=_NextPart_001_04E6_0116071A.196A1590 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 RGVhciBTaXIvTGFkeSwNClRoaXMgaXMgRmVuZyBMaW4gd3JpdGluZyBmcm9tIENodW4gQmFvIEZv b2RzdHVmZnMgKFNoZW56aGVuKSBDby5MdGQgdG8gYXNrIHdoZXRoZXIgeW91IG5lZWQgZHJ5IGJv bGV0dXMgZWR1bGlzIGFuZCBvdGhlciBkcnkgbXVzaHJvb21zLg0KT3VyIGNvbXBhbnksIENodW5i YW8gRm9vZHN0dWZmcyAoU2hlbnpoZW4pIENvLkx0ZCwgaGFzIG91ciBvd24gZmFjdG9yaWVzIGFj cm9zcyB0aGUgbWFpbmxhbmQgb2YgQ2hpbmEuIEZyb20gaXRzIGZvdW5kYXRpb24gbW9yZSB0aGFu IDMwIHllYXJzIGFnbywgd2UgYXJlIHNwZWNpYWxpemVkIGluIHByb3ZpZGluZyBzZXJpZXMgb2Yg cXVhbGl0eSBkcmllZCBtdXNocm9vbSBwcm9kdWN0cywgd2hpY2ggYXJlIG1haW5seSBzb2xkIHRv IGNvdW50cmllcyBvZiBFdXJvcGUgYW5kIEphcGFuLiBOb3cgd2UgY2FuIHN1cHBseSBhIHNlcmll cyBvZiBkcmllZCBCb2xldHVzIGVkdWxpcyBzbGljZSBhbmQgZHJpZWQgbXVzaHJvb20gcHJvZHVj dHMsIHdpdGggZGlmZmVyZW50IHNwZWNpZmljYXRpb25zLiBQYXJ0IG9mIGN1cnJlbnQgYXZhaWxh YmxlIHByb2R1Y3RzIGxpc3QgYXMgZm9sbG93czoNCg0KUy5OLiBDYXRlZ29yeSBDbGFzcyBTcGVj aWZpY2F0aW9uIE9yaWdpbiAgICANCjEgRHJ5IFNsaWNlZCBCb2xldHVzIEVkdWxpcyAocG9yY2lu aSkgQSAgIE4vQSBZdW5uYW4sIENoaW5hICAgIA0KMiBEcnkgU2xpY2VkIEJvbGV0dXMgRWR1bGlz IChQb3JjaW5pKSBBMSAgIE4vQSBZdW5uYW4sIENoaW5hICAgIA0KMyBEcnkgU2xpY2VkIEJvbGV0 dXMgRWR1bGlzIChwb3JjaW5pKSBCICAgTi9BIFl1bm5hbiwgQ2hpbmEgICAgDQo0IERyeSBTbGlj ZWQgQm9sZXR1cyBFZHVsaXMgKHBvcmNpbmkpIEMgICBOL0EgWXVubmFuLCBDaGluYSAgICANCjUg RHJ5IFNsaWNlZCBCb2xldHVzIEVkdWxpcyAocG9yY2luaSkgQTIgIFNtYWxsIFNsaWNlcyBZdW5u YW4sIENoaW5hICAgIA0KNiBEcnkgU2xpY2VkIEJvbGV0dXMgRWR1bGlzIChwb3JjaW5pKSBUICAg U21hbGwgSGF0cyBZdW5uYW4sIENoaW5hICAgIA0KNyBEcnkgU2xpY2VkIFNoaWl0YWtlIE11c2hy b29tIEEgICA0LjAgVVAgRnVqaWFuLCBDaGluYSAgICANCjggRHJ5IFNsaWNlZCBDaGFtcGlnbm9u cyBXYXNoZWQgMSAgIDEuMCBVUCBGdWppYW4sIENoaW5hICANCldlIGFsc28gc2VsbCBkcnkgc2hp aXRha2Ugd2hvbGUsIHNhd2R1c3Qgb3IgbG9nIGN1bHRpdmF0ZWQuIE91ciBwcm9kdWN0IHNwZWNp ZmljYXRpb24gaXMgbW9yZSB0aGFuIDEwMC4gSWYgeW91IG5lZWQgYSBjb21wbGV0ZSBwcm9kdWN0 IGxpc3QsIHdlIHdlbGNvbWUgeW91ciBlbnF1aXJ5Lg0KQmFzZWQgaW4gUHJvdmluY2UgWXVubmFu LCBTaGFueGksIEhlbmFuLCBGdWppYW4sIGFuZCBaaGVqaWFuZyBvZiBDaGluYSwgb3VyIGNvbXBh bnkgd291bGQgc2luY2VyZWx5IGxpa2UgdG8gYnVpbGQgYSBjb3Jwb3JhdGlvbiByZWxhdGlvbnNo aXAgd2l0aCB5b3VyIGJ1c2luZXNzLCBhbmQgc3VwcGx5IHlvdSB3aXRoIHRoZSB2ZXJ5IHByb2R1 Y3RzIGFuZCBwcmljZXMgeW91IGp1c3QgbmVlZC4NCklmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiB1 cywgcGxlYXNlIGZlZWwgZnJlZSB0byBjb250YWN0IGVpdGhlciB0aHJvdWdoIEUtbWFpbCBvciB0 ZWxlcGhvbmUgb3IgZmF4IHdlIHByb3ZpZGUgYmVsb3cuIFdlIGNhbiBzZW5kIHlvdXIgZnVydGhl ciBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybXMgb2YgYnJvY2h1cmUgYW5kIENEIGRpc2Mgb2YgcHJv ZHVjdCBwaG90b3MuIElmIHlvdSB3YW50IHRvIGtub3cgbW9yZSBhYm91dCBvdXIgcHJvZHVjdHMs IHRoZXJlIGFyZSB0aHJlZSB3YXlzIHdlIGNhbiBvZmZlcjogMS4gcG9zdGluZyBDRCBkaXNjIG9m IHByb2R1Y3QgcGhvdG9zIHRvIHlvdXIgcGh5c2ljYWwgYWRkcmVzcyAyLiBwb3N0aW5nIHNhbXBs ZSBwcm9kdWN0cyB0byB5b3VyIHBoeXNpY2FsIGFkZHJlc3MgMy4geW91IGFyZSBhbHNvIHZlcnkg d2VsY29tZSB0byBvdXIgZmFjdG9yeSBpbiBTaGVuemhlbiwgd2hpY2ggaXMgbG9jYXRlZCBpbiBT b3V0aGVybiBDaGluYSwgdG8gaGF2ZSBhIGZpZWxkIGxvb2ssIHdpdGggdGhlIGludHJvZHVjdGlv biBvZiBvdXIgc3BlY2lhbGlzdHMuIA0KT3VyIGNvbnRhY3Qgd2F5Og0KVGVsZXBob25lDQpVSzog RmVuZyBMaW4gICArNDQtNzg2NzYwMjA0MCBvciArODYtMTM0MTA4ODIwMDQgKGN1cnJlbnRseSBp biBDaGluYSBhbmQgdGh1cyBhdmFpbGFibGUpDQpDaGluYTogWmlrdW4gTGluICAgMDAtODYtNzU1 LTI1NTM1MTM5DQpKYXBhbjogWWFuIExpbiAgIDAwLTgxLTkwLTM2MjEtMTAyNg0KRS1tYWlsDQpj aHVuYmFvZm9vZHN0dWZmc0BnbWFpbC5jb20NCkZheA0KQ2hpbmE6IDAwLTg2LTc1NTI1NjI1MjE5 DQpGYWN0b3J5IGFkZHJlc3MNCldlc3QsIEZsb29yIDcsIEJ1aWxkaW5nIDINClNodWliZWkgU2hp aHVhIEluZHVzdHJpYWwgWm9uZQ0KQ3Vpemh1IE5vcnRoIFJvYWQsIEx1b2h1IERpc3RyaWN0DQpT aGVuemhlbiwgR3Vhbmdkb25nIFByb3ZpbmNlDQpQLlIuIENoaW5hDQo1MTgwMDANCkJlc3QgcmVn YXJkcyENClNpbmNlcmVseSB5b3VycywNCkZlbmcgTGlu ------=_NextPart_001_04E6_0116071A.196A1590 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVu dD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCjxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAw LjYwMDAuMjA4MTUiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4NCjxCT0RZPg0KPFA+RGVhciBTaXIv TGFkeSw8L1A+DQo8UD5UaGlzIGlzIEZlbmcgTGluIHdyaXRpbmcgZnJvbSBDaHVuIEJhbyBGb29k c3R1ZmZzIChTaGVuemhlbikgQ28uTHRkIHRvIGFzayANCndoZXRoZXIgeW91IG5lZWQgZHJ5IGJv bGV0dXMgZWR1bGlzIGFuZCBvdGhlciBkcnkgbXVzaHJvb21zLjwvUD4NCjxQPk91ciBjb21wYW55 LCBDaHVuYmFvIEZvb2RzdHVmZnMgKFNoZW56aGVuKSBDby5MdGQsIGhhcyBvdXIgb3duIGZhY3Rv cmllcyANCmFjcm9zcyB0aGUgbWFpbmxhbmQgb2YgQ2hpbmEuIEZyb20gaXRzIGZvdW5kYXRpb24g bW9yZSB0aGFuIDMwIHllYXJzIGFnbywgd2UgYXJlIA0Kc3BlY2lhbGl6ZWQgaW4gcHJvdmlkaW5n IHNlcmllcyBvZiBxdWFsaXR5IGRyaWVkIG11c2hyb29tIHByb2R1Y3RzLCB3aGljaCBhcmUgDQpt YWlubHkgc29sZCB0byBjb3VudHJpZXMgb2YgRXVyb3BlIGFuZCBKYXBhbi4gTm93IHdlIGNhbiBz dXBwbHkgYSBzZXJpZXMgb2YgDQpkcmllZCBCb2xldHVzIGVkdWxpcyBzbGljZSBhbmQgZHJpZWQg bXVzaHJvb20gcHJvZHVjdHMsIHdpdGggZGlmZmVyZW50IA0Kc3BlY2lmaWNhdGlvbnMuIFBhcnQg b2YgY3VycmVudCBhdmFpbGFibGUgcHJvZHVjdHMgbGlzdCBhcyBmb2xsb3dzOjwvUD4NCjxQPjxC Uj5TLk4uJm5ic3A7Q2F0ZWdvcnkmbmJzcDtDbGFzcyZuYnNwO1NwZWNpZmljYXRpb24mbmJzcDtP cmlnaW4mbmJzcDsmbmJzcDsmbmJzcDsgDQo8QlI+MSZuYnNwO0RyeSBTbGljZWQgQm9sZXR1cyBF ZHVsaXMgKHBvcmNpbmkpJm5ic3A7QSZuYnNwOyZuYnNwOyANCk4vQSZuYnNwO1l1bm5hbiwgQ2hp bmEmbmJzcDsmbmJzcDsmbmJzcDsgPEJSPjImbmJzcDtEcnkgU2xpY2VkIEJvbGV0dXMgRWR1bGlz IA0KKFBvcmNpbmkpJm5ic3A7QTEmbmJzcDsmbmJzcDsgTi9BJm5ic3A7WXVubmFuLCBDaGluYSZu YnNwOyZuYnNwOyZuYnNwOyANCjxCUj4zJm5ic3A7RHJ5IFNsaWNlZCBCb2xldHVzIEVkdWxpcyAo cG9yY2luaSkmbmJzcDtCJm5ic3A7Jm5ic3A7IA0KTi9BJm5ic3A7WXVubmFuLCBDaGluYSZuYnNw OyZuYnNwOyZuYnNwOyA8QlI+NCZuYnNwO0RyeSBTbGljZWQgQm9sZXR1cyBFZHVsaXMgDQoocG9y Y2luaSkmbmJzcDtDJm5ic3A7Jm5ic3A7IE4vQSZuYnNwO1l1bm5hbiwgQ2hpbmEmbmJzcDsmbmJz cDsmbmJzcDsgDQo8QlI+NSZuYnNwO0RyeSBTbGljZWQgQm9sZXR1cyBFZHVsaXMgKHBvcmNpbmkp Jm5ic3A7QTImbmJzcDsgU21hbGwgDQpTbGljZXMmbmJzcDtZdW5uYW4sIENoaW5hJm5ic3A7Jm5i c3A7Jm5ic3A7IDxCUj42Jm5ic3A7RHJ5IFNsaWNlZCBCb2xldHVzIEVkdWxpcyANCihwb3JjaW5p KSZuYnNwO1QmbmJzcDsmbmJzcDsgU21hbGwgSGF0cyZuYnNwO1l1bm5hbiwgQ2hpbmEmbmJzcDsm bmJzcDsmbmJzcDsgDQo8QlI+NyZuYnNwO0RyeSBTbGljZWQgU2hpaXRha2UgTXVzaHJvb20mbmJz cDtBJm5ic3A7Jm5ic3A7IDQuMCBVUCZuYnNwO0Z1amlhbiwgDQpDaGluYSZuYnNwOyZuYnNwOyZu YnNwOyA8QlI+OCZuYnNwO0RyeSBTbGljZWQgQ2hhbXBpZ25vbnMgDQpXYXNoZWQmbmJzcDsxJm5i c3A7Jm5ic3A7IDEuMCBVUCZuYnNwO0Z1amlhbiwgQ2hpbmEmbmJzcDsgPC9QPg0KPFA+V2UgYWxz byBzZWxsIGRyeSBzaGlpdGFrZSB3aG9sZSwgc2F3ZHVzdCBvciBsb2cgY3VsdGl2YXRlZC4gT3Vy IHByb2R1Y3QgDQpzcGVjaWZpY2F0aW9uIGlzIG1vcmUgdGhhbiAxMDAuIElmIHlvdSBuZWVkIGEg Y29tcGxldGUgcHJvZHVjdCBsaXN0LCB3ZSB3ZWxjb21lIA0KeW91ciBlbnF1aXJ5LjwvUD4NCjxQ PkJhc2VkIGluIFByb3ZpbmNlIFl1bm5hbiwgU2hhbnhpLCBIZW5hbiwgRnVqaWFuLCBhbmQgWmhl amlhbmcgb2YgQ2hpbmEsIG91ciANCmNvbXBhbnkgd291bGQgc2luY2VyZWx5IGxpa2UgdG8gYnVp bGQgYSBjb3Jwb3JhdGlvbiByZWxhdGlvbnNoaXAgd2l0aCB5b3VyIA0KYnVzaW5lc3MsIGFuZCBz dXBwbHkgeW91IHdpdGggdGhlIHZlcnkgcHJvZHVjdHMgYW5kIHByaWNlcyB5b3UganVzdCBuZWVk LjwvUD4NCjxQPklmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiB1cywgcGxlYXNlIGZlZWwgZnJlZSB0 byBjb250YWN0IGVpdGhlciB0aHJvdWdoIA0KRS1tYWlsIG9yIHRlbGVwaG9uZSBvciBmYXggd2Ug cHJvdmlkZSBiZWxvdy4gV2UgY2FuIHNlbmQgeW91ciBmdXJ0aGVyIA0KaW5mb3JtYXRpb24gaW4g dGhlIGZvcm1zIG9mIGJyb2NodXJlIGFuZCBDRCBkaXNjIG9mIHByb2R1Y3QgcGhvdG9zLiBJZiB5 b3Ugd2FudCANCnRvIGtub3cgbW9yZSBhYm91dCBvdXIgcHJvZHVjdHMsIHRoZXJlIGFyZSB0aHJl ZSB3YXlzIHdlIGNhbiBvZmZlcjogMS4gcG9zdGluZyANCkNEIGRpc2Mgb2YgcHJvZHVjdCBwaG90 b3MgdG8geW91ciBwaHlzaWNhbCBhZGRyZXNzIDIuIHBvc3Rpbmcgc2FtcGxlIHByb2R1Y3RzIHRv IA0KeW91ciBwaHlzaWNhbCBhZGRyZXNzIDMuIHlvdSBhcmUgYWxzbyB2ZXJ5IHdlbGNvbWUgdG8g b3VyIGZhY3RvcnkgaW4gU2hlbnpoZW4sIA0Kd2hpY2ggaXMgbG9jYXRlZCBpbiBTb3V0aGVybiBD aGluYSwgdG8gaGF2ZSBhIGZpZWxkIGxvb2ssIHdpdGggdGhlIGludHJvZHVjdGlvbiANCm9mIG91 ciBzcGVjaWFsaXN0cy4gPC9QPg0KPFA+T3VyIGNvbnRhY3Qgd2F5OjxCUj5UZWxlcGhvbmU8QlI+ VUs6IEZlbmcgTGluJm5ic3A7Jm5ic3A7ICs0NC03ODY3NjAyMDQwIG9yIA0KKzg2LTEzNDEwODgy MDA0IChjdXJyZW50bHkgaW4gQ2hpbmEgYW5kIHRodXMgYXZhaWxhYmxlKTxCUj5DaGluYTogWmlr dW4gDQpMaW4mbmJzcDsmbmJzcDsgMDAtODYtNzU1LTI1NTM1MTM5PEJSPkphcGFuOiBZYW4gTGlu Jm5ic3A7Jm5ic3A7IA0KMDAtODEtOTAtMzYyMS0xMDI2PEJSPkUtbWFpbDxCUj48QSANCmhyZWY9 Im1haWx0bzpjaHVuYmFvZm9vZHN0dWZmc0BnbWFpbC5jb20iPmNodW5iYW9mb29kc3R1ZmZzQGdt YWlsLmNvbTwvQT48QlI+RmF4PEJSPkNoaW5hOiANCjAwLTg2LTc1NTI1NjI1MjE5PEJSPkZhY3Rv cnkgYWRkcmVzczxCUj5XZXN0LCBGbG9vciA3LCBCdWlsZGluZyAyPEJSPlNodWliZWkgDQpTaGlo dWEgSW5kdXN0cmlhbCBab25lPEJSPkN1aXpodSBOb3J0aCBSb2FkLCBMdW9odSBEaXN0cmljdDxC Uj5TaGVuemhlbiwgDQpHdWFuZ2RvbmcgUHJvdmluY2U8QlI+UC5SLiBDaGluYTxCUj41MTgwMDA8 QlI+QmVzdCByZWdhcmRzITwvUD4NCjxQPlNpbmNlcmVseSB5b3Vycyw8L1A+DQo8UD5GZW5nIExp bjwvUD48L0JPRFk+PC9IVE1MPg0K ------=_NextPart_001_04E6_0116071A.196A1590-- ------=_NextPart_000_044F_0116071A.196A1590 Content-Type: image/jpeg; name="DRY BOLETUS EDULIS 2010 GRADE A2.JPG" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="DRY BOLETUS EDULIS 2010 GRADE A2.JPG" /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDABQODxIPDRQSEBIXFRQYHjIhHhwcHj0sLiQySUBMS0dA RkVQWnNiUFVtVkVGZIhlbXd7gYKBTmCNl4x9lnN+gXz/2wBDARUXFx4aHjshITt8U0ZTfHx8fHx8 fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHz/wAARCAMABAADASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDD3EUo JPWkApazKFBp46U2gmgBaUU0U4daAH9qKQUUAKKU0CikAU4dKaBSk0AOzge9MpCcmlFADhRQKcBz QAgFO20uKKQxNoo20tLQAAYpc0lFACilFJQDQA7NKTTaQnHWgBxNNLUhNIKQC5pRSUUwHUnNGaM0 AGKMYoyaUUALmnDgUg4oY0ABOaBSDkU7oKACigU/GKAEApetAGafgDrQAgWnZ2imF/SkBoAcTuNK FpgJzTgaAH8UE+lJRQAc0YopaAExS4pRilwKAGgUhFOyB3ppdR3oATbTtlN85R0FIZz2FAEgjpdo 71CZGPtSbieppBYnygo80DoKgzS7j2oCxN5rfSk3k9TUWWo3NTAkzRupmT60DmkA/NJz602lzQAt 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 nIp78ioujUAOFRMOtTLUcnWgCOilIpKAP//Z ------=_NextPart_000_044F_0116071A.196A1590 Content-Type: image/jpeg; name="DRY BOLETUS EDULIS 2010 GRADE T.JPG" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="DRY BOLETUS EDULIS 2010 GRADE T.JPG" /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDABQODxIPDRQSEBIXFRQYHjIhHhwcHj0sLiQySUBMS0dA RkVQWnNiUFVtVkVGZIhlbXd7gYKBTmCNl4x9lnN+gXz/2wBDARUXFx4aHjshITt8U0ZTfHx8fHx8 fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHz/wAARCAMABAADASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwChmlB9 aZzS5rIokB5p7DiogafuNAABTh70gNOoAQqDTMEVJSigBgb1p3UUFBSBSKADHFBpTxRkEUAMpaUi kpDHLIy1Mkqt1qvSYoCxbKAjIphXFRo7Lx2qUSA9aYhmKWnEZpMUhiZpaMGjpQA4UE03NFADs8UZ pKXFACGilxRigBKSnYpMUAJRmlxS4FAADmjFLRQAgFLS0UAGaKKXHFACUUtGKAEopTQKBigCgjml zikzQISlxRRnigYUlLmkNIBKUUlKOKACiikoAXNLmm5pQaAHCnA4qOlBoAeKWmZpwNABSZopKBDh S9KbS0AKDk01vvU4Uw9aACnjG2mU4dKBik02lNFAgoNHakJoAQiigmm0ALS0gooGLRRRQAZopCaT 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 ------=_NextPart_000_044F_0116071A.196A1590 Content-Type: image/jpeg; name="DRY BOLETUS EDULIS GRADE A.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="DRY BOLETUS EDULIS GRADE A.jpg" /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDABQODxIPDRQSEBIXFRQYHjIhHhwcHj0sLiQySUBMS0dA RkVQWnNiUFVtVkVGZIhlbXd7gYKBTmCNl4x9lnN+gXz/2wBDARUXFx4aHjshITt8U0ZTfHx8fHx8 fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHz/wAARCAMABAADASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDDFPDE U3pRmsiiVZM8d6carU5XYUWAsdaWmBwetOBBpALmlBo4pKQDuKKbnHSgNQA/NKOlNDDFKDQA4Uop tGTQA+jNIKRjzQAop4pgpxOKAHdKUGmYoAoAfRTRSigBaM0maKAHUmaTNFIBc0uabmigY6lpoNLQ AUtFGaAEIopaKAGlQaaVxUmKKYEVJipCtJtoAjoJp+2grQBHSU/bQVoAZikIyak20m2gBmKM4p+O KNtMYgNL1pNtKAaBCEYNJTyOKYaQBTTk0Zz7Um6gYYOaXHFJuolyiKxHB70AIWppaoy4ppemFyXf SBiajDU7fRYCQNzTwc1Bvp8ZdvurmlYCalHNKkcrRs23G2q7z7DhhSGT5xQDUCzq3Q1KDmgCQUtN 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 QB//2Q== ------=_NextPart_000_044F_0116071A.196A1590 Content-Type: image/jpeg; name="DRY BOLETUS EDULIS GRADE A1.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="DRY BOLETUS EDULIS GRADE A1.jpg" /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDABQODxIPDRQSEBIXFRQYHjIhHhwcHj0sLiQySUBMS0dA RkVQWnNiUFVtVkVGZIhlbXd7gYKBTmCNl4x9lnN+gXz/2wBDARUXFx4aHjshITt8U0ZTfHx8fHx8 fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHz/wAARCAMABAADASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDLBNGa kKZ6U0oawKFEhHepFm9RUOPWlBxQBaEqt3p4IPQ1ToDEHg0XCxexRVVZ2HWpFnHcUBYmpRkVGJlP tT1ZT0IoELS0UtAAtSHlqauKM80wFIHSk2ZOBR1NOBxSAYUwaaVxTwadkGgCBhim1OV3GmmMA0DG bqMil203HNIY7PFGaaT2pQfUUAGaWk3e1G4UAPXJpGFKDxwaPxpANoApSOaOlAxPwpCKdRQBHjml qTGaTZQBHSinFaMUAIaSnEU2kAUlLjigDNAw7UmcUGjFAC0UUlAC5oBpDQKAHBqNx9aSkoAXNGaS lFADwaXOaYTik3UASUuaj3GjdQBLmkJpganBqBC5o3GkyKSgB4cd6XPcGo6MelAyTcaUMaiDke9P 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 ------=_NextPart_000_044F_0116071A.196A1590 Content-Type: image/jpeg; name="DRY BOLETUS EDULIS GRADE B.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="DRY BOLETUS EDULIS GRADE B.jpg" /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDABQODxIPDRQSEBIXFRQYHjIhHhwcHj0sLiQySUBMS0dA RkVQWnNiUFVtVkVGZIhlbXd7gYKBTmCNl4x9lnN+gXz/2wBDARUXFx4aHjshITt8U0ZTfHx8fHx8 fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHz/wAARCAMABAADASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCqDinh qZigHFc5RKG5p9Q0qtjrQBNRTQ1OyKAHYzRSA0ZpALS9KbQT70DHA0pNR7vSjdmgB2aXNMBFOBFA C5peaSikAtFN3enNGT3oAdkUnWjIHWk3r60AOxS03eo70eYvrTAkWlqMSegpfMoAfSgmmb6UPQFh 9Apm6jf7UXESUuaj8z2pd9FwH5pwPFQl6N5pXHYnOKKh35ozmi4WJc0m6mUvFAD93pS5yKZml4oA WlptGaAHZpwNMzRQA/BpaaDS5oAWim5ozTAeTTc5opM0gHUUzNGaAH0U3NKDQMdSZpC1JkUAOzRn JpuRRketIB9FM3D1o3j1oAkzQDUe8UbvSi4Eu6kLVHmmk0ASl8Um4moyaQtQBKGxQXNRFvek3e9A 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 2psUmKAP/9k= ------=_NextPart_000_044F_0116071A.196A1590 Content-Type: image/jpeg; name="DRY BOLETUS EDULIS GRADE C.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="DRY BOLETUS EDULIS GRADE C.jpg" /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDABQODxIPDRQSEBIXFRQYHjIhHhwcHj0sLiQySUBMS0dA RkVQWnNiUFVtVkVGZIhlbXd7gYKBTmCNl4x9lnN+gXz/2wBDARUXFx4aHjshITt8U0ZTfHx8fHx8 fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHz/wAARCAMABAADASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCcN6U8 N61lpO8Z65qyl2pHzcGsyrFvg0hXPSmK6t0NOBoENK800ipsg0hFIZFimlalxSYoAj20c08igLSG ND+tO600rigcUhDgMdKQ4NOBoK0AMIxSBsU7mjg0DEzmkJ5xStkDiot3PNICTPvRuIpBgimmkBJv FKGBqHPvTkXd0oAlyKSoW+U4zSeaQeooAnPWk6GoDchfvUq3cTfxCgCc00mkEit0INBNADgcU9Wz UJNRlzQBYPBpM1EswzhqeTQApPNGeKaabmgLjy2aUHvUfSkLUDJGNNz6Gm7sikzRYCQSuPepFuR0 PFVjTT70WA0Ulz3qQNWYjFTwamWcj73SlYC/kUdarrMp71IHx3pASGim7qXNO4BSikyKKAJnACio iaXJIxSGmwCikpaQBQDSUUASA0h9qbSg0AGaKXrSYxQACkpaKAEooooAM0UZpKACkxRRSAKOlFFA Bk0oY03oaWgB4YU8NUGaUNQBZDmnh/WqytTw9AFjcKXNQBqUvQA8kU3eV6GmbqQmgZYE/qKerK3Q 1UBFLu9KBFyjFV1nI681MJ0amIQ9aSncHpSEUDCjNJTgPWiwChttSBgw96gNICRSAsEYpKasnGDT sgjrTENIoA9adjFIeaADNIOTSHigZHNADwOaVmwDj1pE+akbpigBu6jNHSkJoAXcadu4plLQAuaU U3NG6gB2KSk3cUvUCgBytSmTJplGRzQA8HJFPdugFQ59KMmmA4sc0E5oFOOAPegQi9Mmlxk5o96V eaYAOKfScCgsKBEgNBfFRFqYz07gTGXIpmQaiBpc0rhYlUjFKai3UFjTuFiQGkGc0zJpc07isKz5 OKTdTRSgUrhYXdSgk0mBSFwOKLhYceO9JnJ9qYTnvTsimFjjsZHvTCMU8HFOK5GaZQxGZTwcVYW5 ZRzzUAHNK1AF6O5RuM4NTBvQ5rKHWpkdgeCaBGgcGlAqusrd+akEg9aAHlcUHpSbsikLcUDBhkZq OnbqQj0oAKcpyMUzrS0gHEVGRg04Png04gEUCG5yvNQtinu3aoSc0DBn2gYpBOOhFNYZ5qBxzxTS ESPJg8VPaTPIoKDG0nJPes85zitK3mjtocN97rWdRNLQuI+eYhwzqu3vVCeVfNPlqSp6Ut1dCVe3 HQVDEfNI4xjrUxTW5VkI/wAyg/MAajRF8zB59KsxsCzJnjPFNljwMgdKd+gWK7K6ufLJBBqxFduv EoP1pVXKbh1NNkCquWNJS6CsTm6U/dNMNxmqTOjHap5FNk+TBBPNaohou+aTThMy96zhK46HNOE5 x8wNVYRqLcBhyaf5gPQ1j+eD0JBpy3bIOeRS5QubAINRySBDzVOK68w4XOfSrS2FzdtuCkDtU2tu UN88AZpyXKNxnmoYEwk0bDMi5GKrtbSKM9KV1exVnY0t4NNYis0NKnQmnmd1AZ+hqrEalsvtNPjl zWe90GGBUtuHI3YOPWiwF/cKcJcd6rMxFQtL71Nrjuaa3FSCdT1rJWUY4NSLN60nFhc1hIp707Po ayhL708XTL3pWY7mkCfWnB/Ws0XzdhmpDdsqgshApDsaAYGncdqzkv4j1p63sefv4pisXsUYqvHd I3Rgam81e9FwFxRQHB704YoEHSg8ilOMcU00wCim5ozSGLSGig0AJRmikoAM0UlANAC0hzRmkoAM 8UZpKQ0gHUZpvWjmgB+cUu+oznFJzQBKJKd5oqvzS7aAJzKMUnm5qIU7FAyTfkcU3cabnBpeKBDg xpwamCloAlWVl71MlwG4aquaOtAF8Mp6UpOaoK7L0NTJcdmp3AnpDQrK3Q06gBnNOXI5pMUoOKAJ gcikpoOOlBNAh2KQg4pA9ODA0AEYxyaa2c0/IIxTe9ADM880ZpxWmkYoAM06m4pwGBQAhpKU9aKA Ep64xTcUZoAcaSlU5FITTAAO9Ln0pvalFAD1pGOTTSewpueaAJc/KBQG4qMtTulArDiaTNMLZpN3 FFwsSE0nFR5zSjigCTilAFRigybRQBISBTS4qAvmkBJouBOHzTg1RDpSg07gS5pR0qPdimPLngUA Pd8nAplC8ilxSAKdTaKAOae3degzTRleCK0QQRSNCrdRWgjPKc8UoiJq39nIzimbCp5oAhEIp4QC lZgo5NVJ76OFeDk+lAy1nFRyzxoPmYA1ky6jLJ90barnfIcuxNMC8b+QOShOBU0erY4kU1nIKeEG aQ7G3DewTfdYZ9DVgEdjkVzxUA8Lg1PDLKg4k49DSuFjZIpDVFbuVUJZd2OuKUarCxCtlfwp7itY tmlR8cGoo7iOb7jA05xtODxQIdJjqOlQk4p+7jBpjCgCNzxUDNirDDiq8gA7800II18xiQcY5qO6 kYJu9etJCWDOAcAjBBpWQPCylsHqKiT1LitCkrsvOatxSq4yOCetRLbPnnAprxlG4P5VTcWCuicq A2VJFaVusdym0nDelY/mFeeo96swShmVomw/pWbVzQs3cL2oO3n0rMeR5GJf8q6GX/SYlyPm7isl 0G4h4+R3FEdNyWVRgc4pQVapDDhsL096Z5DA9OavQWpftdHkuovMQYHrUd/ay2S7HAYMMgiug0Z2 XSlwu4ZI4qjqERkfPJ9jUSk0xHOoBuBZTipLhlcDyxj2q/JEVBymB9KpzIGGV+Uiq5rvULWEsJDF cKWUY967O0lUxjscVwqyvHkEVq6fqjq6Lk9e9KauCC/R4b6U5w+c8d81Akvn5Rztcdq3tRs0uWjl jxljtaue1K2NveNGD06GpSTNEyV4GjwetMuN7xJEVHyHOaSG5dSsc/IPQ1dBR+vOehp6rcTaZliO JowGJSQMByOCK6mztIYLNQpDqRknqDWDc2+07l5Wn2+oSQweUpBTBAB7VTd0KxJczWjs/kPgj+Ej g/Ssx9zMew9Kt2Qjjl3SDcMdKdMEkYsqbRnpmlew+W5RwT0OKdibAwQasNChHynB96jOUJHcU+Yl xIDLMOKEkcuNx4JqVsY+brUlvCG+ZhxVcysKxfKxRKAh5I6mn/aA5RCMr3qsIwDyfp7UrEouR1rB mli3LbRRuVKqT61A8MQIOwA0lw8krRyKcMV+YfjTyvyBnOfUUARoIw3ykj2Bq7LGJIwyORxWZDbr Eckkk+pqVbhrZmGcpnkHtTt2C4y9luLdUaJzjnOarR6vdqem6tOZI7u3JjIIccVlxRmCbDKOKqNr WZLWpoQarO/DQMfpV6C5MudylSPWoIZhGmcD61N9qRucAg1m2+xXKifeOuaUSL6ioQEfBHFRT2Qm yYpCrelCd9xWLgYHvSnpXOTtfWb/AHyy+tEetTqcOua05WQdFSMc9KzItWRuHBU1cju4pPumkMlo pN6noaQtQAuaQtTc0madgHZpc1EXxR5lOwrkuaN1QFie9JuOeTRYLlgkUm4ZqAvg+1HmLiiwXJiw pvmCoDKtN80DvRyhctB6duJ71Qe4xUf21l96XKwuag5707NZi35J5U5q/a7ZEYyvsz0zUvQY/fRu z0NZ000sTdQyk8GmLf4IDqRTWozU3GnBqpJdqw4apROKLCLW6jcO9VxKPWlEq+tICwCR901Ks5H3 qqCT0NPD+tAF5JVbvT+tZwI7HFSCVlHXNAF2gcjmqy3BHUVKJ0K9aYEmaM0wOp70uaAHZpc+tMzS 5oAeTg0ZqItk0u+gCTtSZNReZTg1AhxNGaTdRmgBcmkzRuoBBoAcppc802igBxNGcCm5ppJoAcG5 ppOTxSdaXIFADgcdaY0meKazZpAOaAH9acB600UuaAHdKCcVGzgVGz5oAlaT0qMtTMkmnqtACrzU g4poGKUUwHUZxSE4puCetAAWLUoGKXFFADs+lGaTPFJmgB4NGcU0mmnmkBjgkVIr1DmjNakFtWBq C/lSGBmJAOOKjaXy0LE8Cuf1G+e6kx0Udqa1AZJdzSk/NgVFjJ5OaYufQ1IsZNVsMBjtUkeCaTye KXYy9Km6GP284p4GKiDsOCKmXLL0qWUgDfMCeasMVaQZGBjirFppL3EXmZAFXP7JCAb3GR0qW0Mz XcqnyDGetZzcsSwrauLRY+rcnoKr/ZAwyO1JTSBq4mnKkex2x15qfUnSW4DxOQSeVHYU6BVTKkfL mor2IZEsfT2pXuwKsrSqPkc1ELi5/vD8alL4FQgb8gHrVpktDPtdwT1qzHI0sXI+cHNUiCshzVxS 0W11HGKcgSEKH7zZ5qZcrzxio5J2cAEAYo3cDNQ7s0ViTecnmmOQBTC/zcUMMJk9RSsO5HKVxTra DI3jqOlFsnnPtboauHEOEH/66pu2hG5PZ3EhuFjk5B71LNb5kYq4DdQD3qgkpN1GE9eTWncQu8Ss vVSKkZVWWJmKyDawpxEbKSGFWYdNVSGlbdmll0lHOYWA+tMVxLG7ks2IjYNG3VTWncXtjIMFlDH8 K5ybT5opNuT+BpkaSAt5hLY7Ghq6CxbnuhE+xmDAGqk0iNk7RjOcComjXPTB9KR8huM0lFARgpIS CMGiRTCwAHGM5rSt4IniBIxnnNMucbCkQyTxV7MQtjqjxqFlyyevpVm5szfTiZXUoR19BVaK2EcL bkySOKbCJYE8yFu+CvtU3V9B2sVrmJllAzwDgEURCZwdvVc5PrVkpuGfWprcCPgjg0cwWuUkkeVM 59qEsZm5Qcd/atHT7JYlVpDk5GBS6pOYGEMeBxliO9HNroFiolpKw4IGKUWkuceYuKSyDSTgbyK2 DbhlwrD6ihuwGLGm5zsBbb1btUM8T+azoPlNasBWCO4t24lXJB9QagC8YI+lLmsOxTt7cy4L8VZ2 7ePSnBgBjpjimg5PsKltsaHIpZgO5qS/g+zQCV+hGAPU1a06NZCxPUVbkRLpgJBujjyFHqahPUb2 MHT7hWk2ysBu6E9qtzxMx2L1P8qfe6VGA0sQ5HOBVa2uXDZVSF6Zb9a0aT1Qk+hYittqBpTxnGTV KeFriZo4x94liR6VryRTXNoFjAKZqbSrP7MWMy/OeKlPW4uhl2VrLbEh1/dj9Kbcxq8gPY1taiyR AnpxmsBrnzFORjaePpVPe6GtdyK4iaMjY2VIqOAvKrbGOR2q46iSJl9Rx7GoLO0dbkLuGMHNUnpq S1qLHLMhwc1ZM7EDnBFXDCgXnGarTwDHynBqLplDHk81QH59eKozWinLR4zV1A6r9wEVG8W5+Pk5 61UXbYTRmM0qvggcdjU0Fw0cgbyh17Vd+wkvgtuzyTUNyojZI1A98DrVuSehKTRchZJ0LIzLnt6V AZLiPOG3EdjUVusyuQgJyRkVbfDqTj/9dZu6K3IV1F1/1kR/CpVv426gj6iqzZUkUyUqvWqTFYv/ AGqJv4qXzEPRhWOz9gKkHyqQ5xkZFUTY0y4PQ0bqxi5Xkk/nT1kb+8efemKxrFutRs1Z/mPk4Y0i u3PzGi47MtsaYpaRwq9TUJkOOtWNM3mR5SPuDj3NDelwtqWIrCSbrwf51ah0oKjPL2GRV2EhkSQc MoK/j3ptxdmBlkGGQ/LisHNl2RZg022C52DdgGsvX4hG6CIYAXca1ra4ygyeTWdrsscYRDy8uR+F KLbYWsZBkPlkOPoaWFVlTBGecCopFKRkE/JzRZybEZieBz+VXbS6HcSaKSHkA7ag+0Op4Y1t2ciX LrG+CsilM+melZdzaSW0zJKvQ4zVwlfRkSVtiWzeWfdg8KpJ/CmC9J4pI9/lsiHAYdqjis3ckA4A p6dRWZML517VZjv2xl42FJDYhJUBIJ64rTkRFTcyYX6Vm5LoUkUhfx8ZyKnS4R+jU4QW8ioxwNx4 zV2DR7RhuwDmhNMGrFUSAjqKUSLWi+lWxgaNMqxHBz0rmb2C4sXO7cVz1qkriuaplGeGoNwV/irC N2+0fKSadDI8h+bIo5BXNoXfvThegVnDpTgwHWjlC5ofbVPtTxOrDg81mb07kUhuIov46OULmuJl HWnrMrdDXPtfK7Y304XYUZBNFmgOhDA0uaw4r6VgfLRmxTl1fb98FfrSA2qcDistNSRu4qQXymgZ fJzShqpLep3p322P1oEXAR3pjHJ4qJZlbkGlMgoAfnFJmmeZmlyTQMd1pwxUeKXOKBD81G8uOBTX Ykdah+tDAfuJNKBk0gp60DFUU8U0GlzTEPzS5pmaUUAKPelpM0FgKAHE0zdTS2TQBxSAeDThimYp wFAC0UUUwMKgnAyaXFUtQmKLtB5NWIg1C7DjYh471nrCGiZz1U07aSSxpVYjP909aaHYiDbT04q1 EBIOCM1XZOQBzW7ZaUIog7jLEZqZtIaMwKQeakSEyNtA61pLpxL7pOAavpbRQoCPTrWfMM502jCd ozgFetKMI5QHOO9O1FHjuGaJ8q/eq8cTxLubv3q90LqdNZkmFApwAMVbaLcMsecVU01PMtUbODVm 9nFvblyRmsmxmXqMirMiDkjk1HFGZX+WptPs2v2aZujGtlLKGMfKMFepo5bg3YxVtn34AzU4sHxy vymrUl3HFJgLu9cU5dTg3APlfY0corlC/wBIK2bSKMbRmqFlYC5gMi5Up1NdLd3UTWEgDAgqQB71 Q0FwtmFdehIPvVN2Qk7mZGloAfMQmQe1SakYJLHbCVBHYVs3Nvayk7l2n1rHutOX78bgrnpU86uX Ywl3Z5BqzE6uNkgxWkLOLyshhu9Kpy2uWOBz2xVqakFrEkcEapjrnvUPlM0mzFPh8yLCyDK+tWAO Cy8k0PQAht0t+e9U7nhTz0BxU+HkYA5x6Uk9nMqlyDzSW92BQhdlzt6mtvTy4UlyTu659ayo4ijK WU9eeK2LMZDL+VOckgSuWZZSIxt61REkjNjeQTU0iMp2HgCoJLZxJ8vPcVK1B6D5IZHXa53DOQc9 KSK0fbuXkb8VJEsq5BH51ZWVY4BHjqc027CRXutLeJfMT5yx59qoKWzgr3xWk9/IIyikAYwTVITA MQ3ekpFWY8IOPccipFVV7AVGJUI4PNMaUMdpON3Gad7itYS4vkKFYgS+SPaoI7oopBGQeop72flY GflOeahWLywd4JPYDvTVhl22Cyx5U5IqC7cxDI61BZtLHNuAPuKtajGWUEDg80WsxFq2mSa1GOtU biJg5LEnnvVeDdDJuyQc1pSvHPHnpRazGVLdW3Bl4wa0o5CqhGYl2HWorWL7mOVJ61LdRiOTKDpz WcpXZRVd2GohsfdA/GpJG3ksen8qZvw25h8xFNaVSCBQ3diIJCd21amRcLz1706KL5d561J5ZZwM dTirCwkV15AwpC7/AJcnt71aF/bpGqrIOKtTaPC9oSB+8AyKwri3XMZi4GMH60JJktm5DcRyjKsD mql+I/JIfoenqKpWv7p8lsYqS/c3UJ8s9BTSswNTR7yP7LHEDyB37+9aysGye9cxpybtO8znKttG KsxX0sL/ALw7lNZy0eg1qi/qFm12UUHGM81QfTEhtpvMOXBBBrUiuRKo2kUy5iMiHrSUgtY56JWV 9jdOtSXEXlshU4JGatLbs5BHbg1FqO9GT5CQASW9KvcCNJJCQPvZ45qZk3nPII65pbREdA4bOKuI 0DW0hbBkHGM81KetguUUR2BXpzzVwQxeWu/lqqSxyBN5BCEdRUXzoOHYr9abGXzbAtmPgEYxVe7s FZRJyrj2qNZ3BDI/4GtizuFnyrgZpXa1FYwUh+2O+3KSDr2BFVpI57VmjbOM85711z2qdlAPYiqd 3apcKxVlYoOR3FPnYJI5kuzAsRUUjZb8MVqz2jux8hQVSMZ+uTWVICT8yFTitI9yWNIGKmjKzReW /UdDUcUTSyLGp5JwKd5Zjcr1wap6iSZJPEggCsQSPSoo7OSRC0ILgegqV1OASDg1Pp7PbmSRTtBG DmknZDtcfb6W0iBpGCk9qmXSRk7nwKg81uCxIPbmlkuZCMbzis3zDHyadGpwDntT7a1MOFRsAc89 6qmVzgkmpxM4HJ7daTUu49C2obJVTjNU5GdRsk5AH60R3Rjly3StOOa2uBtZRk96SfcChaXci/fI 2hMr60+4tZ9RkjfYQNnf1qO/snhYPGdy4wuO1SWOtTApbyJliQNyirVt0IpTWjttAyT1IqP7HLbn ABKEZOa2riFo52lQ8N0/KnKj3CeW3f2o5gMuzk8iRFkwqD5s/Spp1F9dvK7YjC8e/vT5rN03BhjA qm7MpGR93tQgYwugnCAEIp596vxtEYx5S5Ycmsy4u1eQMQXkIxgCnReeRkHygeD6kU3ELm1a3drD LvlPzEdDVy4voZgqgDYeaw47Yggt3HU1YjKlvaov2HYkuwm5hCeAeKZFO8YCq5X6VZWSEAHIyOtH mQ5zgYzmpsMfYSSx3AaR3ZW7U7VpRdRCJE75JIoF2gxg8Cm/a4yecHNCbWwrXILCAMoDxAgVNeW0 aAER4z1NWoJ1BG3FTXarLbnsRTUmJo583CRfL5IdRxnd1pwms5Rh43U+tZ4Yx7lP944p8YaQ4VSS e2Ku7CyHS6fDO+LW4JPoeKpTadNE5Dgn3NbmmWDtc4lUquMg+9R6jc+W8sDpvTkBh1q4yZLSMW3R Qw96vQ+WxESnLmqMfyZ38YFTW9s4eOZWJJ5FOSuCdjetZ/srBJVU54yKdqWmwTgPGRlj0rKMMzZJ 3E+prUsITCiyyuTg4AJ6Cs27D3KC6Q4c8ZA9Kpz20luxKuwwec11/mRoMkjFYes3cM0Plxkbt3OK ak+oGMbh1OGanrc+9LBAszbefxpJ7aNCNjZ9qtNCsx63kiHg8VOmqkdRVdbY+WzbTgCqLq4J3DFC SYmmjbXWUB5Wp01Tf0Fc1jnrU0cpUYFVyCudTHd7xyKl8wNXMJeyxjjBqZdWkXqlRysdzfJyaacV i/2w5HCUi6hLKfSjlYXNrdjvSeZ71mq7sMk08E5HJpWC5oLKQeuanVwaz4+anXI5osBczRuqFWzU i0AO3cUnJoxTgMCiwCAU6kpwFMBVHc0uaCeMUgoAKUUU4CgRgsQqkmsW5l82YntVy+uQV2oazwuB k9aBpCYLsFUc1P5EYGHfBFSWiAqXxz60yQZfrmm2PqGIlxsGT3NbNjfIyCOU4wODWIVpSRxUtXGb 97qEEcZCuC+OBWTNqEksezoO/NVmUN/So2UjjoaFFAKQ4bIy1TNJ5ygYwBUKFx97g1NGpdsYpsEb OiysLdlP3VNUNWu2uZfIjOQOtXYsW1ptH3pDismW2K3smD8uQcmoik5XBmnpV3PAEgCAhe1Xr27u ZFIQBR39aztOu4IZ2MrjOMCtN7i1lQlZFDVUiUZ7BoiqnkNyKvnSZW2SM3XqPSodPtWuboSN9xTx U/iW+eDyooJCjclsfpUpJjbY3UrcxWmYxgIMtVeyuRHbKcgA81RuNblnshCR87ZDt6ioQrvEhU/I OKUoaDizUm1DcOMGqck5PHSoFRs4/SnmJpGAUc1Ciimxu4888elRy3BibCGrw06TymaTjaKyJcF8 eh71rFakNl7zt9rlhyelRW7SYYqcgdjUCsxRRnhTU0YLFmUkYxVNDLltOscqvjIHUHrWzHcW85Bb hBXOZMsyjO184rTiiMZJ6444qHpqB0RsbeVMbFOaoT6WYG3wDK91qK31GSLAPIrQXUo5FIPB96V4 yWotUYdyZoifMjOPXFRJdBnChSOOK6JkWeHBKsCOlZN/b+XMpRNg2gUuVIrmuMaN3Axxmq8kEzfc I/GpY7rEhEnGBxT7WdZWfB5Xt60thmHdGdGKyNt+i1I6CO1jyu4sMljWpqSRvbsxHIGaybe5WaEQ S/KyjCk96uLutBNBDafaADHlWPUA1JFYyRykuxYjoCKsQxtCokjbBX0pWv5XO1lX6im5MVhRE5Rk 52gZGadDblly3JFSQM5V3kHybcA+9IlyqKcMKgoiaN9+ESr50/MCF+wqfTmilhD8bz19q0NishqX ILHGXsDxOyjkdjT7X57chuuK3rvTvtEXy8EcistoDCdjDBxVxlfQTRqW0Ua6ZDIByetULyTDn2GK WwuHKvZucAglD71Bctl+RzUNe8NbDJ5oprUEDbKDyMVXQZ5pt0jqolz8rHn60+CRFhwCGbPIrRrq hI07O2Mu0n7taUkUcIQbPmJrMstQ8mMq0ZPpVq31AXEp81dpP3R7Vjrctl/fJ5oHAXisfULJRc+U B93Jz9elbE88UEYLsMgcDuax9SmmuW8yP90QOvWqi7bkso3UXl7QpycYIqOJzD978RVSSaVkBMhL HlqfbS7/AJJTlj901vYm5s6ft+whF67if1pJYmLYZSKz4zNFMohOcnpW3C5kUpMAHHNYzTWpSKEc slvJxkp/KtH+1IliAc5I9BzUNtcRW9wwnQMh4PHStG2Wxu5H8uPaB/ERgGhJSQN2MwavAj8RsP8A gNTrKtzaYmH388/0q9NpETn5AKjaxmC7eCO1XYm5iraSRlhbtlfQ0+GJrd1848yHH41bkmFi5Mw2 +veql5fQ3UHyOBtOV45qWrlIvySRiJVPLYwRWXsId1AyCc49KdBqMa8Ou5+xxVq0HmO0jdWND91a gVZICsLeX99untUlrFcxhWY5Iragt1zllqy0UYA6CpTbDYZbzCWFW/A1lSxBLyYxnbubn3rQgkiW d41PvVC9njS4csQCDSQCyNsjQR8Zzu+tUbiOOc7ivzYA47VMt7HIdoUnNSSwsYy0ajnjrVxdhMo2 trGsg2/eJx9PelvYUgSKGTBmDtuPqM1Yhj8ob2+9nNNEbXV1LLIm8nge1HOFjMnjbdtUkLjOaFkA UKTx1Nay6bNIhQJzjGTVb/hH50OfvAe9UpJoCk7gNu6inLtdCT2GasywRgeWYyrDqc1GtipQ5Zsn 3xRzRQ1FsryOvRTxTklyME8CnHSu4YgfWmiwIbG89KOaL6hZiuD6HHY0vzRKH6VIPPIVZGUKvT5R xVpbTzI/mk3gc46CjQWpLZ3iMqic8VoRadDBL9rA5PIFQ2OlRysGdMIpz9a0LpwSEX7q1ErRV0F7 sq49RkZqumoW8E218KTnFSyyKoJzgAZNY1jatdzmWXIU5IqKavuBt3NwksTLtOSM9KyLhCD/AKo5 Iq1LOPtUSZycYar5WLywzckVa0GcukbNqMbSx7EHH1NW7uZTNsVAcelXtQMBQupGVOa503DPLlOM nJNXZyFsa0k/mxquNpUbePSogp6Bj+FVTLJ1OK07VFk04ysQJOcZ74qLMdyv5JUjknNOER6nOPrV E30mSqquc8GpvNnJAdhtAycU3GS3FcsKQyH2puCDUhQRLznFMNzbL1bOaSbGSBmQZVjmrlrfkgJP znjNU9vz8cjGad5QbocE0OwiHVrUCVXhGQ3P0qezu7e2jAZf3g68VHPG4iKNyv8AKsuSGRZNvJz3 qk7qwHUw6jFOw2tg1Q1eA7xIoyh71mJDIib6kS6fbtaQkehoWgEDwbhyK3dItllso2xkqTWfvicj nFXNMuBasfmzG/JHoaTd0BeuEWKB+MN1FYsl9hNhPatX7VHeu8Y7VjvaFL3Dj5RQvMYk9zNPtADB QMUkNqCS8nTtmrTsvkZQDk4FZtz50jkB+F7CqV2IleVVfbHjI9O1WNKtDdz/ADcgcml0bTftAkZx x6+tblpbJp8Esh4470SfQRS1IRoyW8Y4P3vpWXfpC7CJFO4Dk+lLc3jSySMnJY8N6VHFDIy+Zne2 7JoWgysmmyeaU5Jq1/Z6RHdLTn1gklYYsEnljVO5uZmJ35xV+8ydBzQqQxHHPFVSSGII5rV022Ew DzH5SOKltdOj87zJyMA8CkpWBoyRHJgHYfypGBB9K64vbldgQflVaSxtZMlxt4zVc4rGFBclMBuR V2OeOQdRWVfNHFOywnKg9aLVHnyQcVT2uKxuo69jVlGBHFYB+0Wp4G4VetdQjchXOxj2NSD0NQEd KkXI71CjKOciniVP7w/OgCccU7OeKiDr/eFL5qKMlhQBIBS1Uk1CGMctmq51dM8A4qbjszTpdw9a z1vQ464p3nqerUxF7evrSeYB0qqrqejVIMGgDkfKf5XccHpUxh3ewNXtUg8iOOMAg9qpxxvjLZNI vckRkjg2DrVcrzTpAVNNLYHNIBMGpbWHzrhVx1NNVd3A71r6db/Zx5jgZPT2ouBTvrQ202R/q26e 1U5UwwJrb1LbLFz0rHGJGKMenQ0ISJ4FRkO5c1fjhht4vOfaoI4zVCLKAhCCfeq7xXNywEh+VTwO 1Ta71ZRbkmaecMB8g4FE0ZknEfI+XJNT28ODjHFSlQHJHPGKE7PQRg3MIjlIIOPWrNjaO0qgsSCe KkvwokHqasaYczeaeFUcD3qm20I345E0+BjJ8qDp78Vymp3n2u4eT+8ePYVq3073abf4R0+tYhtm V8EHNEGhNMiiIwynHPc9qt2/mhjEDuUc/jVYLtbkVfspgZDuwpq5aghQdrZPbmmm5ZTuXrU80sDN 0XJ4Jqo2BIFXofWs0ih0mo3LrgtwKp8yTZxyavrEoO0jg061t1F0DjPNNTQmgtdNmlGQu0e9NaLy JZI85xxmukdX+zFokJOOgrnJVcMVcHfnmpu2VEqS/fJFW7e6kgRRgsO+ajltXAV/4TVklXgMYXY2 Mg0O1rASLexs3K4JqZZ0J4NZTxFog3eiBJi2d3y+4qXTXQDaSXaPkYj6GpJJnlQB23Y9azlVx0OR TTcFWCk4qOVoCxJbhjnoTUNpgzgZwVJBqSXUYreBZHXfhsYHesi1vDHK7SL99ixI7ZrSMW0F7G5f 4+zODwNprCKea3yLz7VPe3/nJ5anOe49KjtY3JBUEgmrpwcVqKUriRidQR5mF9Ca6HR7ON4fMdcn OOayJYI4dpPHOa3NNvoY7Rj0Gc4NTN9ho0Gs4jE0YUbTXK3KT288kaRIwU4yCOa05dWdiQpCrVJW VjLMW3buAuetTB66jaZRg1NreU7lKjvg5rdi1WL920cvmIwOfUVhSwmUsGjCk9x2pz2c1tGoZQOc hh1q2oyFqjs4WWWIOvQ81Hc2aXMZBGG7Gs/QbzfGsb5BPGDW3gisrWYM5uKB4L/Y69VIH+NU5FIY 7+oJBrpruASpuHEi9DWNdW7OxO3a3f3p82uo0UJyGhEZHUggUy0t0MxDnk8D61aWxldhnrTLq1a3 ughbaVwwPrVJ32AmktPLTfHkgcEVAMLhueKvC6jxhmHNR5QkkHKipaGMaRZz5hGSentUrOssbKOO Kq3GA++Hj1FRLO3mbSpDE0nFvYaaKl3btE+Qvyt0NVyhJ4+8K3ASECSKHBGRntSCCPG4KoNa+0sR YhtIjJErSAq56H196syPKCgZeemR3p15hfLWPgxDH1PWo1uftEkckeVCnDAjvSvcC1Bai5kZ5AQg xgVpukMduIoSAw5FZrXDHMURGW5NEKl7k9SF4zUXtsN6mxYGRYcTHmrRcDrWM8E810xWYrEoAIB6 GowZ0jYNIZPmIHOKpTa0J5bjNZ09p/NmWQtzkLnpXO+XIuQPXkV0jyy7REWCllyCTWcINtw/mtmQ jK01MaRmwbdzKynfj5cdjWjaSSwH1IHQ1HFAZrljjayccCtNQu1d4Bdl/lRKQ0hiay2CAhyOpqCb VnLBSxy3TFNa1YuTFxnBIqGaFVn2yjgDNRZMbFOow20m4MXc9cVJOhnQTYBJG41UuIQjZVcIe1NN zJbRDa2QTjHrWiS6EjoZC0iKgJ3EAcV1q2yxxBMduayNGUSFHcbEjGduO9XW1iFslQSAcD3pSshX bK1wnkzfOMrnn6UmmuyhxtyqsefakvNQimAG0g1BPfkqY41CAjBxUJ6WKsbdldLMGKYwpwatBsEA jhq5jTbwWlwS+djDBxXQQyb4wQcqeQc1UXYmSKFzbB7qUlcoxH4VHJp7Iu5ORWm5QEhsDPOTUbaj aRyeVLIoP1qOW7K5mjPitJn4K496uR6WpHzHmpzqVmv/AC1XFSxXttIm9JVK9M5q4wSeonNmRfaX sjZlORTobcDyrcdWbn+tTanfo0WyJu+SasWQVmNw46gFT9aNL2QNu2pPcOttBheKyHuPvA9R1qxq s4cLGDyagisT5fnStj1FRL3paCWiKN5JkRR/wyNhj7US3flDbGuEC1LdsjlUUYCHrUACkHdzmlpE tGfFK7O7nrnP0qZ72Ro2UselSmOMK4VcM2MGmCwllYBVzmtVJSJaaKF5LL5Sr0D8k1VQbWGKvSA+ b5MgORx9Kn/sWYxCWIbge1aXSViSLAKVYnnSDSoVxmTzCQPbv/OqksVxath0IPSpYo3uNoYA4B49 Ki1ncrcqxoJbhNgwCc49K0FTzVlUDJYgfhUkFuDgJgGp4ofs1wPNwFYbv8/rQ3fYLWJrmIMqqvUD H6VTeN4kK4XjnmpXvQk+0jjqD6ipLhFurfzgRgUldMHqiu12AQdgYqoB96G+YBwcZ5FUwRjPap4m Z1GOgqZDQ8O6nk7h70pXc2aa8u3h16VG1yMdKkdixnETRsvB71WOls8mUfg9qcs5bpxVq3Yq6tnv zTTaE0NTSNqElzkjj61WTSboyYL4Q+ldCrqeDTtuGyvSq5mKxHaaXDGisvDAYzVLXcwW4LL8277w 9K2Ym44qtq0QmtCp5z0oT1uByKTM5GQQinI9zU0C/aZRH2J5xTGtyh29Dmp7UpACxOG6VcttA3Oh tpra0j8rIDAc1i6vqzXEnkxkiP270szrIykH5mHP51luC7EIucVMQegq8Dg49qeZ3iOFOMioUVy2 GBFWHjGQTVJCbG6bGDeDzOVx3rSFtvLF4+CeKz0BVh7VdW5l8ojdzjipkxosiNUTkhQBURniUZL5 rPEhmO2Vm3Y59DVi2hAPzD5TRawbkj6giruVCTnGKz9Qvp5CvO0dcA9KvmJC+SvSoNS07bNth+Yn tVRaQmmYmOeasw5RCynGDT3s3j/1ilfXNS29pI6kqNy1o2mSkW1uIpYh84yRzVOaHdKMeuaie0ZZ ACCOetaMVvG/qCB3NRtsVuZjNcMTtlIUHHWpY47jIy7N+NaCafGrbmf8KsHyox8oz7ihz7BYowQ3 Ln55CF9Ku+SQuCxpGnC9cKKsWZS6baGHHWobbGtDPkjRAS5qm04JKxLz61015pMUseFOGrC1Cxex O4LlD6U4pdRt6aDUu9q4cZ9xTjcBvu1RWQFgKtIQvQZNaPQzSJkmbPBIq1HcSDo1UPmL5xircfAq bjsTX08V/ErRn517d6itDvHlsuHpsGxGBVcmr7lE2ynG4UrjtYryWYbkiqc1vGkm09fSrkt7weQK zxKWugzHNFgRZgtXX5tg9qeWuHyo+UCrKkmPcR9BUau7MQMCpuMrmJydsjkil+yw8AjNWo4wCBIe ajuQVz5a596EwK6RQQPuPFK10rnCL8oqsY3f72asoiQxjjkjnNU0JFoSDZx97FRu3lxAnsMmoIHM lxgjCjmm6jJ+7KDq3AqUgZlTyvPIx556e1LbmVePMYD09angi4xVqCyLsDg1o5paCsOt5J5NowAP WrsoEGC4DE+lRX7GC3WKNdpz96oYZV4ySx9TWSimVclaCCdc52tWZIhjZgDnBxmtGZlZT2FZZbBP fNXBWJkwiAL8mtlbZDAGZe2axQMHNdHo0b3iIrjCDrTmriWxDDaSTMNi8DvVmK0+zSbmXc/YVuC3 RUCoNv0qN7clcE5NZuLQ7mJcavNbbiqjsMVQubtnuDNsHPXFX9Q0+SR+FGMc/nVVtPNu+x/ukcH1 oTVtRkLyvtyelRCU7+ee1W50WSEqeHGMe9UmgkVlx8pIzzTSTC5ZTZICBjNSRRhsL0AqCwgZ9xHX pVqIMsuSpxSemg1qPdCI8LyRVaO3Yksy7j6VfjjJYt0BpLiQ20DSKcnGKSk0DRzs8Q3HeOh6Z4qO NPMYAdelOkdmPzkk96vWESx/vDyQa3voTYqsiQE+YOlX7e8jiA/dMR2wKq6nGbi4VbdSwJLHH8q2 EsmbYyrt4GQe1S9dQRTlMLy+bcny0xgKetRtO1zKI7ZR5aDGfWtGTSEmYNK+cetTrZW0MP7psH1q HJIrcwbyzWOBWDN5h5bmm2Uh81YyANowT7VYuZWnl8sgcHGfWqcMTPK2BjBprVahsX5nQNhDyalm kaZQZGzjoKoYdX5FO81s4NRyjbLunziC8hLkiME966gXUJXcHBFcYXUr1pjMzthSQMdAapXFoztF uIZGwHX86Jo4mG5iPrXGpMiRKZEcsM/MpOaSK4e4JCSOAP7zGnyXFc7GGOEMSCCRWFer9rupJQcq DtH4Vli8kimKvI31Bq40otCEkJUsMgVLjbQpDTbdqVR5RYMeMcU9ZwcEHPHFQvL5z5IxjrS16lMV P3isSenrQYCSCecetNDYOO1WUbcMHrQ2SWIrNVtEfJJYkY9KpzO0Tbccdq0oM+Ucn6Cobu3Lwl15 xzUX1HbQoyyk27v12jNOhZY9PQYy5OM+lRqQMg9D1FWrKM3Enlk4QnjPpWidkJj9MtnLGXBJHFaU cR2tgAE8mpDd29spWPbheDSwS+cGcqKhtBqNtw2x2Pyhj371i6ndzRSbFIC54raaTe4XsaxNdQAR Ef3iDRHWQ3ojNM8rsCWO4VMskks6ZY7u1V4SC3zVIXMbpIo5BBroaRmmdHZQCOH5uTjkmiK4tmd1 JVsdzWVdasTbhU+VXXLnuPaqKlpkDOCA4yv07VDQ0dQrwyf6raT3xWZqFsbZTM53kn8qoQh4GzCx DH3qzdX0l5HskCrt6471HLqUVZ5nljwuKryJvZQV3ZHHsfWpTLGoG3miOZN6uF5PArRKwXL4byog dxDY5Oaz3nUHCZqTUAY448v8zdVB6CqSrtwT3pqKe5DZaUGVC4I465NG/IyDk1EoOfanxq7vtXgm k4oakyRVYjdg1v6S7C0KvkFW4zWdBOixKrEbs1bW5jC53ioKeoa80kkAaJiojBLEHGa5uFJJ5CAS 3PJJzXRXEqz28iZ5ZSBS2NisSDjk0c/KhKNyKx0dAv70ZLDNN1K0SyhDQrzk5rcELhkPoMEVRv7i PmP73OMetZ3dx2RzVvNJIxUJuGeprrVLR2UcUaliFAB9Kp2mmtNcebKu0YzgVtDbFEAowAOK10Jb M77OI8S3BBI7VUub8SSBekfSk1e6bzNg4XHPNZf3uR2qPQoe8hY0BvfioicU/GU3GpsMXcM81PBc SRuGDHAquEJxgdad90ckLSsMS5Ky3TzbcMf8K2ra4aC2VeCAB+orEjIeZQpBOa3JrfOw/dXbzVkk EiPdZ34Ptilito7YHnOO9WEYJGAPTk1n6vdpBFGo4LHn2o1eiGIjhpcouBnirc9uksDXBbOIsY9C Kr2YWQrtI5ArTtLYojxvyCeRSTdwkYqQCdQigeYvzJnv6ioLYmC5Nu5IjfJUH+VW7iFrabCthl5U iqbyCSVHY5YMCP61otSShchre4kjAJUHg/WnweacDdgdam1FAJ8+vNPt129uvSqewIiMjrNsfkEZ zU0do9wSQvFSCxkubhSvAxXRQWy28G0AZxWba6Duc6bBk65q1BaS+UX67Oa3ljhOAwyTTHCwttAy pHNJhcowsJYgwBBPrT2baOtQWcykFDwQar6vMy+XHGcH75I7U7AaCSnZgcEVXurhsYNVbe4kKFZF 59aJpOhPNKw0Vboc+Z2xWe5YuGzgE1eunygUetQImRyK0TEyxaQtJtP8IBC/jWhDpUCx4diH71Su XeBoBGcCL5vrV+x1FLlGY9c80l3EzJvGFtMQEJ9/WqTXW7qMVtaiYpkx/FWVHBsbJ5q4tEtMiF0A flGc1bgLvywxQI9z4VAPpVpYNveok0WkIqR7sjvUpBAxjFJtC9Bk0jyHYoJAIqG7lbDlXI+tWrrE dwsjY4AP41SEjtwuB9ajafyt7T5bA45p2uS2P1CaJpCZCAG4pttqVrZ2whC7nJ5GKgitmv3M0gwG PA9KW4sVRgoTn1rTQnUn86K9uFhRQF6lqLyL7HGWGSM8VTWF4G3DIJ9KkmkllQI7bgDS0HqQ/bAu C4IFJPqAddluMn1pk0PIB4BPWqwBRyoA9DVKKeomyJzPMwDFjz2rX01zb4OPu9feqsUo8tkxhgc1 ZtCwJZ+h4qpbCW5vw3iSkZbk8AUaiqG0kMgG3H61h3GVCyRnBB5p02ovc2wibg5yfesSzKuIjFIR 3Bqe2lC/fGcVFeMzSKSO2KSL3rdaoh6MuqdzZ7VYSq8VWUqAKZulXhATUM1xKw5JqNRz0p0pDJx1 FXZAQljjJPNS2khMoDHP1qE5JpUU5zVO1hJ2OoQGSNQBxRHbv5w3DC+tYUV1PC25GIxVg6rcSgqW wT0IFY8lh3L17IkdxsRs8ZqLzXKHrVWFDu3yHJPc1a3HgDgetFkg1IvMkZguPqaSMebergkgU97m GLKk5c8DFTWNsY1eeT7qD86HohoktYQecck1fOnW88eCPm9ayTfc4QYXtUkWpsrAgcA1FmNiJpzL dtC3AB61rYt7CDLkfWqFxqMUuXAYSnoajYi7aNJG3Dbkn0NJ+YuhmXc000wDkleq5p6gx8Gp7mIi ES4/1bYqDarJv3jPpVoTIp5SBt7GqyrzV6a1b7GZiDhTVKEgnJrRbC6mzoVos0zPIuUQV0lgqCRx GAFHYVm6MFXTi47k5qWwuPJuiXOFfis+b3h20No0w43j1NPBDDcOaCPzrZq5BTuyUUtjIFUzLBdk DIz6elX7lC+VA4I5rJk0+SCRpIxXNJalohurHyg0gOVHQelUx++GDyKu3TzswiY7Q6nB9cdqzod+ SqckcGmr2GWIZ47WMhuCDzV+K4t2QlOQelZ5026kwTGcEVpaXaobPZIMyK3T0NPlC44K0uCowqnm svUvLS2ZRJlichc960tana0gSOLAeQ8n2rlpAEBY/iaEkF7ixwNPKqoCT346V01rY20MQEvLdaqe HhbvZNI5AkL45/Sr9xbmRht5HtROVtASuOzbI25AoxSPcqR8o/Gq9zZnYQGK4HWsSS8aKQxu+QOl JNvQdi5c3crzsgJA9aqvNOo+VsiiKXf0qdVD8GnawykGMg5BDZzmrlrA7PuI4NSi1AUMoyat28if dYbWBqW+wALULg4BNU9WtwkayxYXH3q34kVh7msrX0CRRRL8xd+QPpRG7EzHU7eJU2tjvTHY7v3a kn2rVktbh7HzXjVtmONvNQx200uNqhEHXitG0KxZjtYrXTjK4BlcdD61lmJY2MkZ2tWv5bzRiF13 AdD3FOFghT05xUOokNROekglnlJUZON1OllkujDCylniXbkd+9bMlvGowB+NR2UUC3LEn58cZqlO 4NWH+WJbEJsCui9qzLdv3RLDOTgVtvHtcsprOEaowJHy5Jx681PMOxHEmeSau28e5MDqKiVQSSOh NWreFlYPWcpFJFq2TcoJ6ZxSykJDID0GaljXy1xjAJyKrX5Dp5YPL1G4zPitzLGW9elWb9RDYQmH O9jgkduDV2CJYolU9AKzL64y/l258z5s7R2NbLVkGYySbed3PNa+j3mVaJjyBUJimdPmXaR1zVWB mtLtXK8dDj0qn7yEtGdGRjBUVj63Ewt1O7OGGcds1pX14ltAGGCWGVFczLcyymUOT8/8weKmEXe4 NkaL81WYl8z5MZzxWeHkDHOTXT+G4kls3kKgyB8c9hWs3ZXJiZP9mtcBoydrKQD9atz27RWCfL80 ZC59qt36i2uvMBO1jlhUjeXMuRIDz09RWLmy7GAl06klh06U2a4BOcdeo9au6jDGmBGM4BrHeR95 4HtW0bS1JehM04Izs4psLMZlccBTkD3qJmduNuB35q9aRhwGxwOlU2khLVgVZ5S0vVuaVUCnpxU7 rubJPSmMwL7fQVnzFWGrjdz0zzVyyhXdNJ1VRgGqqgbhnua0Jw0VpFEowzsCfoKlu+gWGXOnoIVe INuHJ5qJVHQDNXEkYxrGrbXkO0E9BV+ws4g6q3LYyc0NOTHsVLK1kkKnaQSepHQVorJHbMfMIyta Sqq9ABWbrVp59sWQ4I5bHeqdKyuTz3Kd9rixoRCu5ux7U7SYUlj80/NIxyTWbcWkcKKS24nHGa0d EISWTB428Cs3YdtDaYhRWXc3m6UoOCMmrcjAqSOT6Vk3H32bocc0pzvohxRQunLMxPeoQMqp9aVg WJAG40BdmA/4URvYbEdcuMd6lhjDOqE8UiRGaN2QgBOpJquZDFMgV98ucbRVcjZNzUaLacDsKzor U3eZJc7R/Dmrk0N35e7bt/Gp7GERwsrnvilrFajWpBa2qo6lFwQeK1XYyfL/AAimxxiMZHOelTBA oqG2UrFSQ7ByayNYH+hrIw6vjn0rRmkEtwUHQCszX5AYIox0H8+9aU9xSZpadHtETp0xyPpWyH5X IwxPNYejylraFj34P1rdJV0B6FTRLckytekW3VePmdePzqlY2P7j7RcHGeVFaGrQCeRHxu28YqvI cqIsfKnI/LmqvYEV5IfMfJ4HQVbt7Hd95cLUIu4Y1H8b0sl9KQSG2ioY7muq29mvLAVHNfQ9FcHi sMmS46kt71MlioUF260WEaZu1UAjhT0JqvdXbSEqvToce9VXUeUI95IU5BpyRmGUK4zmiwytco1t IHiOadkTosn8RGDV+azV13KSWPaoIrfyOSOB1qugkSIAi4x1omhV0yo+tMF3CHKuwAzwamMqFWEb g5qVcZjSN+9Kjn6UpHAYcYoSAxuX6sTk1a8lZQXQfUelN2GQKrzMzN/F2qWMeTt2ryKXBjOV6015 Dn0FJ3exSsiKVWySaakYK5Jp8lwiqAeT3qEvuGc4p3YnYtRBc471MM4JI4Hes0M2cZxUplk27N3y +lFhNjxc+W7HGT0qvl2be5zzSENmgozYHNOwhZZOODyKhL7yA3PPen7cZpI4zuyBmmrIRfa7EQji t/mkb+EdqALjzVM5HeoYMRyhsAGrVyzJA0rfw9fpT02EStB9oUKnBFRGzEbFWPOKksLuGRljVhuC 9fWrcke6Td1NQ9BmVJbSEMF6YrMMTrlm/irrPKQ8HvWHexbJWyPlHIq4MTRnLCQN2etTwTAzKhPW kOAMdqgdRHKsgHQ5FabiRuxwqVy3IJqCWzVzuTg1LaSedECp98VckQRqrdj1rnvbQtnPSxMN6yDG ORVdBjBre1e2EluJE+8vp6VhDjrW0NiZFuE1ajFUowwxxkdavQ8gU2JEKPaT/OGCnuDxQ9rbsMhw PxrGkGRzTVRmOBn6VXKK5tLbWqg/ODSH7NGOmal0zSJXj3uoUe9aotIfJIZVyo5NZN2e5RhfaYd2 PKOPpTJJLdsY+U0PEPPcLyFY0yWNHcbximrAXLeB3hZlG9eoqrNNK0ix7Si9D61LEZrZRJC+6Mde elSTRNPGZY/vDuO9P1FczbmMphh19a0xcySWQ2tkY2uKz7vcQhIIA7GrUd9GLUwxQncy4JoeqDqK i8cUnCNz60qEhQfWiQbqSY2KxGBikEzI+VphOzFR/NI52CnYVy3LcNKuzGFOCajJQcEUs9tJHBvV gW9KpMz4+YEHFJK42dHp0sM1s0UmMHjFYMkLG8kCrgKcUljIBIcsefetpY97ecwAG3GPWiT5RJEm hyn7LNCxGVbP5inXbBHKd8VSsv3WoPtP3ucVel2C8jMvKt1rN6sovaVfqAsD5A7E1r1mT2MD27CL gsOCD0rFS71OHckk4+XgZWtoyaVmQ1c6iWRF4ZgD7mqdtqVvebgrY2nHPQ1y1+J533vI7uBkgHAA pn2wwwokcW0L3Jo3DY3vEMatprsCPMVgVxXJqZUO6OV0b2NbMdx9oKB2JJ7ZyKty6Zbyw71XEgGT URlZ2Y7dRllrk1tCBODKuODjBqx/wkMQBaK2bcetU/syxHLDcD29KjeJI+g9+KGxpENzdy3twZZO Oyj0FM+z+c2z8aVFycjp2qS3mWOdt/BA4NT1GVZbGSJiyMRzng1oaRqkluywXWWRujnqDUL3Lkn5 CR9KbHC95OkaLtyep9Kau9GPRE+uar8/k2574LVn/ZvOiVwxJ96vataRQzxqmNuOfrTYQFhIXg9q LKK0EtSqlqyAsHIPpip4HZJR5qNs9cU4K5H3+PpU6x5gZQx3AfnQ33GWY541wRkrSTOhOQtZJSZJ A5lKqz7AMfSmz3NwJPLR1bHFS6b6D5jorCUvEQGzgip5reOeZZGGSvasvSLS5/180hVT/CO9bsYD dKVrEscwCWzcA8dKrwwBzt3AkdcVDqzzRxokQJ3nBIqxpkDwW58z77cmna+4XIZN3myLb4yB196y pLiUMVkY7geRTra7eO9ljJywc/zq5NZx3TtJna5qL2dmVbqZU85dTjjHU1Q8xmLMueO9b76PGeGc n29aoXZit0a3iQb84FaJrZEif2hiKPdyzDBpvzbPoeKzxEyyjfnGa19yImCucjiiSsNEEZJxz0ra tgp2BuNozWRBtMiAd+tXJ0aWHCMVbtjvzWckUtixqN2iqI4SGkz0FVYwUYPO2WA4qLyUgTe5+emS StK3TApqKQrlu4vf3WIz8xqpbRmAAAfiajYccU+2uREClxyh+6e4NNCLrJ5sZOTnODVoadEUIHfv UG4I21sY65q+Joooxlx0oTApS6VHKgVmbIGBz0rNk0aRWYhgVFa899EgJzuPoKpf2kpc71kVT32m rUmKxjz2jxtgD61q+G28qWWJjy67gPpSyvDIM7+DSwOkUim1jMkgPJ9sc0NtqwrFzVrbzkSRevIO PSsYI0WR6966WNvMiUlcHHINZV/ZMGLx9OpFZKVtCyg0TOh3HIqtHZtz8oOa17J4bqwbJCPGeR68 VSlulRMg4xVcz2QWTKhs5gc7Dg1Mq+SoXOOafa6vJ5BQx7zu4JHaiVTIc9Miqd9hIgLHnHfpUZO1 +fxq2sKgLuqTyouTimgZDp2JLhZHHyjPFXb6bbKAB0FRINmNgx+FPaMyct1NT1ApiVp33ZwqHjHr V21v5YmMjnoRgY6+tVSAjbQKGYkAAUX1HY6ZtRjVcnrVa61EuhRBweDWLFckNiUbkY4zVtDHKCEY NTuybIquQWAPRTirGnMY7hpFPy42kVFJDiTb2/rUkNtcRZwh65pNX2GaU86xoGzyRgCs6Vt8nJyC OlMldi4IyzHovpToZoIstOcS4qOUdya2t2kbaq7QT3q1d6VB9nx+GfQ1Uj1Le7eWv3RwTxmo579w g8xid3aqWjE9TEu1kgKxiUkEElQeBzVzSrcQyrcMu7uAaha1WSTeW+YgZ+tXoGzIsfpW17omxpXU r+bsUfLjOfU1WdwSqqeaS7uRFCEHLGqcbuCXI+Y8CspalrQ2FlVQNzCie8QRHBBNZexnkO9jgU+O 2D5yeKmyGVba4/eSNJxkHGao6m5YxEn5eR9DWvLYKFyDVC8tGaHpyOlaxaTIaZs6XY+RABnJ/lWi AR1PJqjpF0s+4Dg4Bx/OtEDrntUPcZVdcSlc54zSPEpHTrTpRhlPsRThkgZ9aYjk55GhmljxyGwK 0bW2kdAZTgelRtbebqk5YfKrmtMDI9qp2ARECIFAp5IwQKNrZ4GRSKGJI4FICNoeDzgGpIAGcpI2 eMgmgxnoTmnx2xc7h2FJsZXae4t0LlcpnFD36SRnkA46VZkSR0CsBtPWs28sIw4ZSQ3oKSauIqiE uxOCSeamRF8wLnBxUlrNtnWN8AetWnsY3uBOCQR6d6d7bjIUjwMVLDiKbd2xyPWnuygbR1HU066a OOzhyBvcHmpsVcpO4UHHWqTuXfA5b0qdg0x2qcD1p9tpvlsS7Z9DnrVqyIbIItPkmYbiTnsKuppP Hls3QcGtO3jSNQF6+tNaQJOVPek3dAZ/9jSBcpKCfeq8lhcR9VDD2NbbSgL1xVaa5C8butLcDI8i VW5jYU/LQsJNh+X1FaH2hdnXOKqXN+rRtEqgkjHSqSuFyk0iOc5FHm+USyDIUZNQrEMADrV+KDap yOqnNU0kJO5mo0jS78da2JGMlrtYcMtUYQSc44qV7kgEf3TioerHYRLdFQNHwR1Gake4lgbKSbge oPaq4lYJ8tRBnfOT3qm7isaS3jsOTiop3MgAI5z+dZstw6MQvBqxBc+amHOGFPbUBJzGJTt5QE4q KZNy5Xj0FPeL5cqansk85uRnbRzaDHaNIIrjZKeCOK6GYRTR4Vhz2zWPcqttbyShQZMcCsyKO4kU PHK+7OetTo9WI6mK2ymCfbmuZvI1S5kVRwGIqy99qKJtkIA6bgKqb12ENlnPehK2w/UdCxjXP5Vc tzlRVSIFsbquxDFVYVzF8hy4Tb97pW1Y6O0DiSdRheeam01oryaMYU7TnNXtdu1gs2UHDNwKcpOw titdaxEgKx4z2ArKN/I7Es2B3AqhjJJJ57VXkc529D3pezTC5bW4DXLFeauMiTJ7msiFMOSDggcV o20oOD+YolG2wJj1sHKFEds4y3PBpLO6lgkMDkAA85rXsyuCQc5HNY96qSXMjIe/UUk77gWNSjS6 iWSEhc9qraeIwHMhBPQVBHMybg3ORio/KLlfLJGPSqtpYOpLJeCO5kjYfIvAxUkVwsrqqg7mqI2z jBKFmY8k1PPKAkZEJjkjxhh0NDUWGppx2AMe6ReByxpltaKLhjjC5yBSR6vmEK5GGxmk0qVmun3H PNZtNFI1vLibgoMVBcaZDIpKDBqwRyR3qOW4Awi9R1rK5Vjm57dYQdh5D7cCrTXj28O08qelXZo4 pFwFG7Oc1l3sLK3J4A/StU1LRk2IrKeT7Z5rHk1toHuLkSFDsUelU9Lig8xQ/U9K6gbVgIjQBiMC nKzYtjNN+0BxGd65+76VTnn82UyY68YrdjsIkX5lBPeoptPgPOAMelK9gMckyApHHmRgMmq00Vor 7ZJSh6EH1qWW4xcb7clQKikXz23S/MTTuFiIxQrIGhm4zkc1r2l0JYwpID5xisuCyhubxYs7VHXF WtQsF08xtCxIPQntQ0pBexM+5Qc/Q1QkdvmA71pafG10u1z89RXtlLbEkqCueCO1CHsUI1KAI/Wo 5C0dw7Lyp6Uk28SfLkk01mdTiUYBGQaLWEW4p0ABkXp2HetLSXiWUbiNxHyk9qxY3BjwCOKmtEaW 4Uk8Dkn6UXQMtasY4fODcu54/OkiQrHHnncoNZt3O93dls/LnA+lb9uI3gXOMhAAfelshop36EW5 aNfmzwKyhqckPytGwb6V0kSpK5jcZqvd6Esx3KQCOlJNdRswzNLc8lSAOQPf1q7p9qqHzJhluwNT RW62gCP8z8n6VPEoklXd3PNU5LZCXmaNqTMcdFFXwoUfLSQ2ixLtzn3qQxhVJznHNHI7C5huAwAY AkVFfXSWdq8jHoOB6mnK42l26DmuY1S5N/JGyMdoJ+XPvwaS1ApicreFz95uSa2LO6LOB1B4rnpX xM/HPar1nM0a7gMkcn2onC6KTNvVLk20ELDks2P0rBmuDNcCUrtYdKt3l8LyzRXGJI3yPcVQyAxJ 5NEY2E2aZhF3AHUc/wBarOcL83apdJvBHG8EvyhjlW96hBEilc5wxBPvmlaw1qSQRGR/l7VfYbAo P3uB+tVBIIMFepNWtNminkLzOMo2ADU2uxt2Q64tz9nkkIy5IxnsKpqu5a32lgZSmQTnGKpXNiwV 3hGCB09aqSvsSn3MtsAgGoJ4i2APrVuG1muCSoyU5qMSMrHcOQeRUJNalNk2n6bcXS/O5Cn+KtL+ x40xuYv9TWTDqt5buwQI0eeF9KfLdXd2uDIUz2XiqdrakpM2BaW5xtKgelI/2KL5HdN2K50W20j5 jkH1p62zyFlVSQB/OknEbizeFtbnLDaV9RVKe6gsXXYQN2eKq22lyO6wJO6EjL4bgCtiPRreCF8q ZHK/ec5quS+ouaxHYXsN27CNuQOVq1Mm6Mgday1VIW8yIBHXrjuK0oLyG4izkAgfMPSokr6gcbM0 kEkijK/MaSCM3RDOc47Vq61BHLmSAgnODiqtlD5a4PXvWiknEdnctRQKqgKAKGAU81MIzgU1ox1b tUjIApfoOKmRAhBPSnxOFHTvSTAsC3QUAPjw0rHHHam3MgiYY61Ua82HavL9Kpz3LZBY8+lCi2Da Rb3KCWYioJblSyxxYLHrVQ7pRyx69KI02SqwHTrxWih3J5rl9YwYyjNk9RVFZ5LS4LL0zgj2rYs7 NriAt2zjNZs8RSUq46EilFoDYV1uLcOnUihLm6LsS+dqkbSODWdZXPkuEPCHitKT5SSp4YYNS9GV a5BHkMJO7elPk2h9wUe4q1bWJkiV89uKgureSPJZaTTFoJdIqW3mxgD5ug9KhEQmBz1XvTII5Lic KuSo5xV24hFtOVHRuaVx7FY29vPCrJkN1HOM0QgISFUhsVCWdNqOxGz7vHUVaSRcbiAD3q27ISVy KOzLSpJISSBwDVwpGONvzdqrJfIZmVjtx+tTgh13R8jPNZu/UvQRhEhw3JqHzcbR271Idrn05quV ALKOaaEWDcBxjGKGKOCMcGqi5U1PFzye1NqwDLIC31RcHCuCuK2HnKSsuOwrnLuR0uImXqrBiPpW 7JIpuMjkNiqaJFdyVQEdCeaergMBTbj5Igf9ofyqtuPmAjsaAHOFWR1GMs24mkiUsD6Z4omwZQw+ 9ioGnmUuIlLbRk0CLuCMY5zSKBk5rPTUgCrOSDj7uKkbUUIyoPNOzQFxx8wFSLcRxL8525rJlv2K 8cVFEQ1wHuGLKegPSp0YzXN2si/uhmoHUtlm64p8agdOh6EU1jkYoQmYt6CGIX7xOBWnpr3AhAmG VHQ96ba26XFwZH+6pwK1Z5oYbcg4BxgYq3qIz54ufMU5U1mXk8s8ixRdUXA9q0oJG3YK/u2PFQ3F sbeY3EQzngioWjKbuhltFIlusZ5bqT61bRG8oZJBB/SrGm3sXkhXUdeDWl5UMyfKB+FFr7CuYr3L RDHP1qCSfcQ+ckVsT6YHztPWqL6a6Agrn3FLVBcovK2etREknParbWjZyQajFqzSYwaExlRpTtIA qszhQ3PNak9jJHEzldsY6nvWOIgSGGTmtYu5JoWkWYlc9amnyEwDgnipIIv3YPQAVTuW3zbVPA4q XqxhEw3bB0HWqtyzLPJtHGf6VZiQIcDrU0cStOGkGVzyDSVkxvYZZ3kBhcSxn5R6VVkkjLlkJCE9 K37eC2k3KigEjBHrTZdJhPAUU9L3JOXdC02c5FTSBWYFfvA9u9aUmmhMleKoyRNb9RnHSqcrgkTR JvHWpbBWW5Ko3Xg1RSVyx25FXNMhkF1u3VLVh3Nb+zmcsHYsGHNMh017WUsvKHrWjDOhOO9V9R1B IIWRfvnoKQFS8jcplVBj71jLHyfrVs6jNlkzlcUxEwoz1PNVG6B7DolxVlRUSCp1FNkjbJYrCFHd trY5HpWVql615ccH5V6Vr3hgks3lk4OOnvXMMfmJFOMbu7E2PD4bNQs2ZCfepUXIzjOabtPPsea1 6iJbaEy/MThR3qzsG4eX+NS6ZNDEjRzLkMc1rxx2E0XHykVlKVmUkGhoWLh1OCuKo6lbx293IqnA PNdNp/lEERYIFUNV015naVAOO1Qw6nMmEs4YVrW9siRAqAzE1ROV6cY6ilWV1cbWIz6UPUZuJbxs oyORTrjTlkiPTB5rOt7tw4EhyB1rU+1JHtUnIbt6Cs7WGZN1pICDyx1qpp2ba82uT1611aJHIAVO cDFUbvTowxcYAPP41d2lqIld0WGSY9FUmsaG6MoLt1b9K0Uw8bxnlWGKz2tkt8qvQjIqIpbFCNJt oIE8WT9KhZgyj1xVqyjzBL3yMj60Wsh3K1spQFT1U5FbUF+WAY/ezgisjdgqx/i4NJ5rwSYxwaE2 OSOrWcOu7IrP1C6Mar5fzZ61mi6fACnHFRb2YYJ4odyLEfI496CSEOOtX7Wwa4+YcD1qYaNLuyzD b7VW4GbYQtHmVz8xq3dSme1ZJo/M2/MMdq0DpJ2j95z24qWG0W3tpRIQWZSCfwqtRNnP6Vqq28oM gO3GK6e3mjvrUOpDI3auWXT/ADLkR9A3et2ztBYRbUk4PUGq0ERXunrHl4lz2xVFWjLATJ8o4PFW NV1BjFiFgGQjPvWU1+HX96hEg7r3pIZK1nBcSssJ2E9MdDSbTY2kuXyxUbT6VJbS56L7+9Pvo0uY MBuvepb7jKFrsZMsOTVxCRGNjEYqisbxhQ3YYNX7KNpZSg+7nJqmSWYJW3l+4HPvWrDOsydeaz5I MNheBUDM9tJvY/Kxzx2rG6ZaG3r7r5wP4cCnIxXn0qFzgmdujHg+tNjmLOD2J6UwOqhkDW6uxxkU ya4CwNg5JUlarxKJbEROT8681DPYzPaRhGxIh4+lacz6EWK+oXpSDyUb52XBPpWVGvyjAAxT9Ss5 rSYMpMob86fawvKgBGKnpctWHR28E0recoCkEjFJDbsqkKhxnGMVp29kBjI5ovLo2kgULu75qVJj 0MO5hw5VRscdR2qs0MmOSM55qe8laaUvn53OTihd8i8jAFbLYlk+n+UruLnHlyLj6H1qB4zDcFbd gyGkMWW4zmk8htucmgLFqBQj/aJ1JA/g9KkvSkjh4kCAgdKjtmdgA6kgHBOOtNfMUqq3MZ4FLZhu TWULnZIWLHzOh9q6Fr6Jcq2QfpWQkywBSg4BBFMuL5RKMcgtljWfO+hXLfc1FZYcvEvyt6VBLaRT PnbgsCfxpI23oGRvlPIFV5pZIn3B2yOmT71KkDj2Jm0rEDYHz9QaxJTKrMCSjr2roYNV8xQsuEfp yetZ+reTI4nR03nggGtNLGeqZkpdy7sSJz7VOt9IqsIvlZlxnHSrFmkDHL/eHGPWrcmnQsMqcVPu roaXY3w58rtLLKSzZXk1vzTIincwAxXNta7AAhOAaQi4ZxucsF6A1fPoZ2LkwXLyEYj4A96pXiqI S1u2M85Hp6U95pkGGbOe2KqW42M7MT8zHAI6VL2KWoltAYouSSX6irMKBMhqFbDE46dKQAtx0qdy 9iQy5bA7UxiSeaEj2gk9PWqU108kmYVyvQGqSvsIvqQMZPJ5qKfzZvkVSq96vw2aG3jmIIc4IJrQ EkbJ84AYdRSEzmZdLuTIpiKjPUmoxpskUkjTAlgcgnnNdMJU5wtQGZXJEiAoOtUpOwrGa1rayKmz COQMjNVr9Yo2j8r+FdrD1rd+xWTxiQBQBVC5gj88hTuHFFwSL9nGsNkrdA2GP4isfUQGncge9Wkv TBbMjnJC7VH0rL81pV3k8jgis0nuUNEe5+elaNtJuiUN/DxVeOPeoZPu96r/AGnyr7A/1ZAUn3rR e9oGx0VrKYFKk5TqPaq99fpd25t4WHmPgKfSnRyYjO7oRWPcoYrpXjO0HofQ049iWi7o8U1pqgjm IJYEGtfVYd0JlRcun8qwINQuFvYTLhwD97pXRQ3kF1vRHBYcEVMgMG5TzI2A6jkVTiuQMq3BArXv IfJk9mPFZTRKZTnvTi0xlW8GZQyngqKtWszRKVUkgdqWSACLGOB3qvbfNIwzyD+dVo0GpcS4Ep47 1KoAJYnrWYY2tpg/IDGr6kkYNS1bYpO48nkHtUkJAU5pjAbeKgDkAgHkjFG6AdcqouBIMEMMYPat CGPdbxSj/OKyZM+Xz2NbGksZdMOTnaxB/nTd7Ekt3koqe4NV1O5845qxPkspqPAQk45zSAmjRWJD deCKka3RlZ8bWUc/SokkxKvHXg1bBABB6GovZhYx7KzgV2aTDZYkfTNS6hZR7C8IAOOgqtI5jZSr fIWIFSC6RhkN8wGMU3cDCuN4kAORVq1dtu1+V7Vo3CRyxZYDNUXjMJx27VTd1YS0LdvI0Y2Zynb2 p87nBVep6n2qik42r6GpVJJA3csevtSi7PUbJo5XA2xrwKV2RGD3D4HY028mCqsVuwHHzNVQyH5F 27wmeSavckvNcwkEQuDjpUsc4mXA4bHeslZMsCAAVJzitBXRlBU4faSKloaIoj5cjpjjt9as2l41 qZMk9MqCeKhMy3EOYwA+ckelVbh2GNwIIotqM6vTrsXcAY8OOoq3t9q5G0u3tZBIh7cj1rastchu B8/yNVxa2ZDXY0GhU/wjNVp1jtlMj4UVbW4icZDg1j65Osu2NTwvJNNxiJNkOs6hDJpqxwtuaY7c egrKtbUkhQKS3hE0u/sOlPu7k2sixxEbzyfYVPki0izeOYU8pTg45PoKo28JJJPOaJGaQ5kOWPJN W4VIwAOMVLdkNIUQgDgU4x5GelWo0G3mgpWTkWVV3RyAqSDVoaiFYRzDB7N602WMLgj0qjebZIGB 6jnPpVReomjVjaOfgEVHcWq7cMAR61zcN3NbMACWArVi1F5AuTkehq3GxBYe1igg3BBuJAFQorK2 4DaaTUrpo4IgBzuzUEWpoy4YHd6UmpNAXVJD7iaq6jh3Eg6dKGmeVNyocVUnuQUEeDn+VJJjI4mU OS3AzVwTLNKwUDavA96rLbh0JYU61AVyorVEsupUq9KjUVKtDEZutv5UUMA4+UMazYLYywyP2QVb 1xt1+QP4QBTbWTy4WQEEy8Y9K0WxI1ZFhhiXALbifwqHh5jjoTk1ZurKRNowSVqvgKMd80o23G9h 2CZcAZPapGke327wealtE/eK2Msea0JrBZYS8x2+lTKSQK5d8MTrM0nOCB09a2rxykDsBk44FcZo rvFfAo3Afbmu0cCVR6UpWS0DqcZIr8sw61GDymeuK09RKw3EsYHy1l7g0npULUouLgrkjpTLiRo4 1lxnBwaXcNuOtNnYm3YAbj6UWHc0tJvVz85+Vv0rUvYBPbjYc+mK5KGGWEBlbqu7bV201t7b5Dyo /hPam46WDcuMj2sW9gcVn+ety0rKcheBVu3v5Lyby5CpR859qxJ99vfSiLiLPHvRGOoXJpRsIGat 6bcBZCh7is5JGkHzAZyamCFfm6VUlpZgmTE4dO4zU1wysgph2lQD1pZOCgNc/U26FeKRunWrMSSS Biik7Rk49KrIuJWQetallObfCeUcvwSfStfMxZt6Y0ZsI9uOnP1qysi+orFRzDD5cZ461VS4lEhG aXM76AonQyXMYHDDj3rI1u7V7Vo4iSzYxtNVpgWbg4yOfrUH2dlcHJGPWp5m3qVyjILiRNpdTuj/ AFonvJZ5D5jEL1AFR3c7xDBjzz2qlHIxky/Geg9KtK+omWyoeIqx5HNM8jyXVmGQwyBTWkIk2gZz 0q1eTRkR4OGC8/WnG9xNjhO8hG1FUUjDLH37CqSznI9auWUm29QvypwPpVTQkW7e0Yud/QjHNXLC JIIXPcnjPpS3rLCqs5CqeM1Rk1m1jwisXIPIUVgnKRTSNCUYPNVbkr5ZLYwKmuJV8tHJ4YAj6Gs+ 83OwXBC/zqFF3ArM5kI7qOg9KljQ53CmxoFJBHWrCEAY7VcmNF63uwpHmHaBVyXUoiP3bBj2rGYd DRt3RFyMYoVrBYlnm89lL8qGqyrhDxgL0NZ9pCLtxHE/I5NW3s3jcrISR6ihqyDqXkuF2khh71i6 xeoSsasGYtk4PtTLi35wJnCHg4rPewXdlXJ96qEVe7YMesg35HLHgCr0AURhe9UktWTG08/SrEUb IdzOCM4rVtEj3xy2cYra0nT1aLzZ15bkA1jWhU3MbkZw3Q1073CRwNKxwq0cyQncsiKMDhR+VUrr ToLjcmMFhn6UQapBNGGDY+tTxSxkk7xnOfwp88ZE2aOYuo57XMU4IUnAcdKrPC5AYEE9jXZzQw3M ZSRQ6mqEmlWjK0aHY3bmp5UtiuZnO22qNakRSAj1rZiEVxECCDkcGso228zBk3mPI/KooJJoDiEf KexNZyhfYtS7l64ZWk8sj5Rn86zZrN0bK9KfdSXEa7GgIYHOadZ6gZMpOnIoUZR1HoysHeB9jjmt qxv1bEU+B6NWfcxrO2RmqwDrJtPIqtJK5NrHSkQy8K4z14NRPbSD5l5rIFw0Lo/8KjGa1LDUw4ZL gADblT/SosDRDO21irD5+1QhcZ3U24maa5aRhtXotSIu47mPegpaCAYGO9TRJkgnpTWaNOc1n316 +zy4Thm6GmkJsbq1/wA/Z7c8fxsP5VPZxfuVGORVG3txJCEfqOd3rWsnykY7CtlZKxLLZvZFsvIC A8YBNJbSOVjMww3qajgj8+4jTPDHJqzqsqCRIoh8yD5uO1Q1cNh0xIYMOnSmldq56g9ay31RrRx5 y7lY4wBVxNZtfKDBwB6GlysdwJADDHTpUAfa3PQ5FOlvYJhvRgCeRVeSTdynOT19KTVykyaUBoi6 ruGcZqjJII8hzg5xyK0tJZVEkEp+WQZGfWqFzADfTo3PzHbmmtNGS3catwqAbScY5qxead/oyyxc sfmI9aZa2gkOGHI4NbCLiFVP8IxUTnyv3QSb3KNkJBZxPL909DRei3eJYdwSUHcCafJFNOjW8Y2x jnj609NMRmfzzufAGarnW4rGKQ8Z2SqcZ4btTvMMcySRE71IOR3rcuYU+zlCBgDArGFqQ7lT3ppp gbQuUuUImGw1lXUQSQ/N34q1hLvHlupf+JR2NMu7FthdSSQOanZlaFUszqQaZaRFbg0kTFsqeDU1 vlZcntV7FMs6lGkkjRjGRGW/KqyNuCk9SKfK3zyT9lQj9Ko6cfMWQd1OQPahLQi5eYkpxxUKYXPN SoeCPWmRRjLbuo6U9h7jJSSCFHPvV7w+5K3MDcchsVSmVmQ7euKn0l9lyjtwSNje/oaN0S0a84Cq p9SKjk5xjuafdZNupHVTmqylgyE/dqQJXBCEr1AyKgj1aEjDHaR1zVgPlxt6Dg1zl9HvvvJQc7tp oUU9x3sa90iXChoB8x5rJO9HO7IPfArpI7VY7VAnBQCsOYvc3hKRHb/OmtBNjtLgNwJ5JGYqi+ve rDBBCDPwDwGqbTbeeDTLgSxlXMmcH04qpq0hVY7ZV3YwxotdiTIJYjCVOMoehFPI/dj0PSnW0ont /srYD/wk0x4pkBSQbcZqWrlJkJYsxA6UhIGKljZJNu3gkcj3qQWmRuz0ouluOxAqbjkcGpmt50QO R8p7ipokjD7WIFaH9nXM6YVgIivy+tF23oLYwN0kEqsn3vT1rXhWO6hLMMcciobjTGtlG9sv1Bqj cPcBSgJQHuKqyYiGSYbiqNnPAqPDROWBPFR+W0J5AJ4OamEUkqqwU4zzir0QaluHUV4BOTUzBrps nO3HAq3Hp0a26HZhu9TqI7eLLYBrNvsBWEItk8zPAHNYbsbgySswBLE8/wAqt3941w5VD8g/Wqhh xES3FXBW1YmaOnoGgBk61or5ePl6Cs6DiJMelWo8kAYrGS1NFsWXdccGmK4Xq1RkDIzUiRq3WpGS r5cgOW5qOWFPLOMHNRNDhiVPFPjGXVRzzzTSE2U73TvKwycbqht7MuV3v+Qrd1CEyRoF/vdqdbWI jxnmtnJWMjPj0sSXPmSMWjThQazURReuSMYJwK6a7Yw27+WvOOK5r7QLiJ9ybHXnNSrsotJOqjaB 3oECTTqRwOuKoxMZMFanR3Q5GcinsMtyRpGShwM4xWeieXdMAcjdUVzNLIcu3INOiJLAk5NVFEs0 hT1FMTlQalWhiObvHMt47nuasWUZadAEJIOc0hg5y3erVmPKJI9KHNWsNRNqGJZRuY5FU77T4SrN jB6gipba5VYyG4qve6iioffoPWs1e+g2ijAzQzKCtW9YuCltgHrVGGeSdxuAGOgFP1VSyRKDnJ5+ tU1doRW0/fG6vn5c813qcoCh4YZBriFXyyq4GK67SZBPYKAclOKuWpJS1ixYjzgMnvWAyGOTJFdw wDqVYZFc1q1mI3ynRuntWV7FJlAMoHv2pYz8/NR4XHzHmnA5IxVbDLGEEhbJPGBWPKreeTIucmtX dnjH409ER1w6g5ojKwmjOginhJeMcZptykgAJPOM4rRjiCzAAkr3FRXiHzCcfL2quZ3Glcp2iNgk CrjLlcH0qCGXy2C8YNWHbJOKUm7gtBJBhIznnvUqkOOnQVDcIwt0b1FPtj8gBHJrJ9zVDobdhcLM AWUHmrrXHmMMDA/lWjpkSiAxScP1HvUGo2XkozqPcGm9dzK+pYSAKqkDORVM2481j6Vow5EcbN/c qvcFYyWHpU21C5jy3ojuiCMhTVsanbyrjbgimjTvOsHkYZfOaw4oZUn5yVDYbjtWqinoFzUd45WO ORnApJbDO04zmoZYJYmzAwI64qSHVntyFuFB7YNS4NbFKS6kE9rKgDIpO2qLzSZO9c11cOqWc6Ag r9DVa+022vFMkRCt6iiM3H4kJq5hQsMo5GFqyGGUccc5pBYvBlHIINTQ227CH7oqpST1ElY1p1TU pYbcN8qjexqlrGjCFfNgBxjmr9iFg+6MevrWrhLq3ZfUYqYyvohM5WGYSRRqTkgYI9KucuPmPOfy qGe0W1mLFcMaYZWGMelZy12LQ+VSuWpuR5YbPfFSLKCo3DtTZFR029KXqA7cGTjtVC8vlEEkIf5z xxU4fYdick9KV1Ct8iru7krmrgle7BhpaiOHfHlHx94dasrrjA+Vcxbh/fWooQI7aSUt97msyOVZ HbcDitWk9yTfljjubQvAepyDVVbZTjnBNRW9xIqBIcbDzzU2XbA/iNZcrRVyXYhBA6g1WkQp05BP SplgeMnPIPU0fKySZOCvT3oUQuUclHGOxrTnZpbFIFzuchmPoBWbJnbnvU97cyxsQoGHTGCO1aSW xCI1UKR5bEr3q6smIsg5OKz4A9vjfypHWrkfltz0I6ispFEtpqMm8oCRipWupTcRyMcEcHHeoooU D7gMZ61Myhjiov2GPggh+1ySRuf3gO5D6mpLnTEnjBgO2QVQMEkd9FJEThiA3tVhL4i4lSJwQjGq UmJoltRJs8q9hDKBgPj+dZV9ZQxkS27EnsBzW/Be7iFkUY9asG2hcEqi5IrVPmWhOxyqSFGG9SMj pUr2omWWSI/cUHHqa2m02OX7y4NVrizaxy0Z+QjJqHfexopJ6GBI5K7WXANLaHasinseK1W0/wA+ ISLgr0piWiwxzRyACU4KntxVJpqwnuS2sMMxCykBAOazG8xbiRImOwEjmtbSbB5ljuZGyhz8vbIN aF1bRRr5nlg5PPFCTSJb1OVfeGyMuagEMzuXY8nrXTz26SxAQqAT7VSNhdbGZIM7ffrTTfQH5mdb Jvb2QAMPxrRWL9KoW0h+1vGylcjkHr1rTD84HJqgIxuV9ynDLyKeC1xK0khBLdSPpTSxL/hT4Bhh 9f6UCM+6KvdsNoIU4BqAxKxJZVPPcU5uJD7k05QNwJ5HeqArzQr1VQD3q5psREDoRgbvl55ziosD k546VK1xjY6IF2sGJ9qmWw0OxlyOh7VdZfKuLSW4A+Y7GP8AI1CVUXwU9GPH9KTU4prllijywzlj 6Vne47GjJbmJndRlW5yKYjMx5HFVYLi4t2WGV96HgbuorQikiTO4c1lKFmNPQWIgOF6cUghcrvqd AJeVxkHFNlZowsfUE/lTsFzNnlLKY+4NQ2sJlicHglSM+lXTaK05I6AmktB5IKz4GSefWriJhpmi iIeecqSvC0CcJcm2k4bp9a245UYHBHFc5O6Tao4ByQwFayStciLYl/p5R/MQfWoUtmSNnfjcMCtP Uo3URxifaHHcVlyXrrGInQsV4yKhXvqXfQp3Mi+UY+SB1A7ntVOF2t5A6cE8EGlYMoLycDPP1pN6 XB/dIV288nrW/QknjuXjlfzR8pHGOxq6ro+1lYYZefaopFErb8cMAf0qCS3JYBXKg1m7MtGhJGFJ C8jFIApU7ABIPums/wA+5tdwCh171dtGmuyqiAqxGc8YNKzQXL7XYezyR8zYGPelRw0QDDoKqywP GdjDlecH1qeKVcYcYA4zSYixAQ2feo/skf2vzQuWIx+NLG8aORkdKetygmj2MNwb86EJi6k81vAi quA3VqvWNikG0kZYqM/WpLkR3Vq6nHT8jVdb1kUBhkgAZpvli7snVmhtBBBHBrmtZsmjuWdEJV+c +la0epLkbxgGrC3MEoxuBp88ZILNHMx2OwLPK23bzms/UdQaWY7Wwvr611Wo6cLuPET7R6djXKza TN9rdZ12KoyPcU4JdR3Gw7sb0BwatRSSzusaHaT60iRiKLahyqninQks6qmAwyc1Ljcu5HIPs06m Rssr8n2rrrFs2wBPQ4rk2thIWEhyT1rTS+NtaCIHLYwDRexLVyHXL4SXgijP+rHJqg90pi2ynmmN Dli5fLMcmovJy6k8kGmkmBMZIzuLL94DH0qewctdRR5yC3A9qgktZmR2zhFHHFTaddR2kiNKhHoc Zo5NA5joJWIGB0FYGozGZtqngcYqa+1jerCAZY1jrKx2bjknqaIxe4XJpmSJcfxDoQOtFvby3iNI 52opHHrSP0zjmtC1VjCpPAPai9gtcmijVVAxjFWEXJG31pYMOpVh0qeK3AbcDwKwky0RSwhTubvU LEp0qzckluvWqcnQ5PNCGL5xwfSpLR1DsepxxVJwQmQeav6NAHDzN2OBWlrENmhAC4G/qKtKyqcE j0xUDMIiT69Kb99wzj8qLk2JmRbiNkPSuU1SyaC4fAIUjORXVKdv3aiuIknBEig5ppgcXaSbJdp7 9K1o0EoA6E9DTrrR4Y3MiybSOxqK2bg85wetKbvqikVr2yl5JQjHcVBBkcGuriKS2pLgEY5rnJwo unCdAcCrhLoJly2OVqygqra/ex7VcAwabJMaTiRh6HFallbhoAWXrWa6brjPvzW7C4jgAHpWXQsp 3sKRRkqKw7pkE6qc5AroLoB4jk+5rnb1d0xkA4PFXDcTJYmMTB1HIqJXZiHkJPOQtSwcx4PbpSi3 MsowflxVkkRl/eEt1re0G8xciPICMP1rFntQo3dj3pLcy25Eqduhp6Bud5M3BA61nXcBukIHBHSu cm1W7m/5alfpVnStRkhuQLiYsh7ntWbg3qGxXuYDFKwYYIPNV5JNvSumvrEXqrPBg5H51z17Zywy gFDmiPmFxkU3ygE1Z3HaSO9Vo7RyN2Dn0rRtNPuJRjYcZpuPYakSWVq1ywABwOpqXUEjjRogOg5N b1nbLbW6oAM45rn9djaN3bs4wKlqzQJmEke85q5ECflxSBQoGKt2QWR8DtzQ5DCZVa28tuqDFQxR uXCoMMKsIPNcj1ck1r29qHAc43EVMV1KbsRxTgqBL8sijtTZb03KGEqThh83rTbuWO3uMFdz44A9 KfAwkxJs2gdqogsSv8gA42jBrLvZiuB1Jq288b5UNzWfPCzx+f8A3Rgj2pIZs2hUxqP4WFY95a+T cuf4c/lVy1uFRHVmwAMrmql7exyyhky2Vww9apEtEAyDkCob6ATwCRV+ZOvvThMQMYprXOOh49Kq 7HYzPLKEEqRVqC4kt8YcmNu2elWhKH4IBFIjw5IMa8+1D13C9h1veRSSjzW4JwQatwwTLIRGm5B0 I9Ky2tomkDpwM9K6G2vFiEaMRsPGR2rOUUO7Y0BkXJBFT29z5LbieO9X9qOnYg1QltQc5bArCzT0 HuWpoob6Eg43jpWHc2cigFVyB19RUxvEhlCiT5hV+KUXC7hyT1FW23rYErGDvCDntQZQQCTjirt5 Y5L+XgH0NQppLSKC0gIPUA000xlDefO3dhwKn38bs9uaLi3a3k2PyOx9qjkUKhA5wOK0tpoK5Hew Xlu6RkgwkArjuKvfYIPs+Xk2huTVvT761aGNLsAlflUkfpT9W06O4h820bgDoDxQ2LYzo0VdoT7u OKsIh6g81Vgk3wqM/vE4NXYcMoNTICZJCUOOo61WuR5jpIuBGV5+tTj5WB6DvVW6kVcovZqI7gyr O4UjHY5FSFnuQkzAAJhT9KryOEnX5dynjFW3mj2iONMZwXB6Y9K0nYmJOBHKhTI5GKX7NsAYHOet QRCME8AfSnQrNcOyRPhTxzzWPL2LuWIPuFSenSn71CklgCKguYksrcM7MewAPU1kSSN1YnP1pqm2 HMbwu4FdU3Auegp93HZ2kReIJ5+fXqT61zQlPVVAOeDTSZJnIJJ7mto01EhyuakWoSxHa21yO6mr kOtyKfugj0rnI3KnjpUgaVn/AHanPtS9mk9Cr3Outtbikx5g25OAatPeW9zG0YbIYEVzFnbEKGuC FHpUjXbhyLcfKOlPXYVkadvuitvsu75QT83tVW8vYhEVjO92BQH0HrVeae4kTDkKp9Kh+zhSrE5J Gai1tWO9zf8AD8v+giI9QxxWk8YZSp6Guas5mtZUYE7e4ro451kwfUVUZJ6Mlp7opO3kMFqQ6lHG AG4rL18yQzI8Z4fhvaq1pYyXDrLLK2wdf/rVMfd6l2TVxddQLcx3sABXHzY9aW2kSZRLHyuencGr zwRCMoAWBrEihmhusxEhMnIPenuC0NQrlw4HalQZkGPQ0yGZZFBHfr9alH7shxzg0k+gNFe6skCe bAQyE9PSqARlkIIxU86SR3ciq52M24DPBzUzyAoCyZIocraCsVGjyAPWobkeX8inPy1pie3NoAVx KW4rLvJB5nyjnoKIu+42PW7aX7Of4lYA10tiFe2MpHLEn8K5Cx4uwp6ZrtdPVGs1QEZHBpuOuhN9 DIkQNcqTyd1W5IiUGOoGabcKLeYBh/EKtxfOR3BrKW5aG2WQ5/uk8+1W5o1ILHrjFVkPlXD4HBq2 671x+Iqo7NEve5TwqNg/WszU0dL2B1GVxwPxrcMKKoZuveq91AroCpB2nIpWcQvcfAEWJnXgsOlc u8U8WqySpyPMya3FuQdyr07VUn457ng1SdkFh17cG4MbJE52jk4pi2TzhSQFrV05o2tAONw61Tml miBwO/X2pWuO/Qy7q3URSwFD5gII9xVf7Cka4hyXA5PY1rRXXmSlSoJI9O1SBAIuMZBzRz8ug7XM qKJ41G8Y6ildctkjitBlDLh+/SqjRNuwOeeKOa49hjxqRgCrvh65VbhonxyML9RVVTsBVwc1UYtF MHQ7TnIqo3Bq502qQBwZFGGA5rnZ3kWNhEeSehrettQ+324XbgkYY1nSWqxzuWIPoBSlvcmPYhki 24b+NlHPpVNkZGHJ3Z65rSky56Y5pothJlWBz2NCkU0Tx3JKHaT82M0MS1VY7eW3Y5bcoqwsncg1 ElqSHOOlM5UZ5zmpTMneq8t7CuQT0pagaNpcsg+duO1VdTn85mKnhVxn61TjuGkOVBxTGd8HPQ84 q4pgVRLtyG4p8DBnPOKnJjusCVVBAxkd6Sa1QlfLyCRg1o5JaCSe5HNODwnX1qEs56mrcWnb41Ky Dee1Q3NpLbvmTpjikmmBXaRicCnpO3yq69D19qjJ6EEU9FOwtV2RN2XxfRNGYwrNuGD6VUaHK9OB 71GCFbHepVmIBU96Tv0BFd7dwNyZ203ACBSAe/Aqcu3llM4U1Xc7TxzRqxj1bzGAI5zitiMAIBWR Zo0s3I4AzWihbJ5qZItF2PZtDKcNmpC0iKapR56DvU32kj5D1xWQyGa4y2CcGo2ddmScmoWDSSu2 cYGTUqRAgZ5rSxFyIbmJre06BrazCsfmYlvzrMwFHGKt28k7g4PAHFJu4i9JGHUsTyKRFIUMTVUX pA2uhO3riomunuIyyZRO1Kwyxd36QDlx1qtPd3AJEYAG0nJ7VjXg/f7ckletbcISTTEZvvFcGq2A 5m8nlluCWlZh+lX7RvlAqH+zH3k5AGatpbeWvynJFVOzWgIdf3ckFsiJxvHWs+A5IJqe7bzdgfgR rzmoLenBWQmaMB+cVdqhH2rQTlQaGIq3do0RLr3PWq8Ukyv8zZHetSOdLu34PPcVRuozH04rHYoq LcNdXTwn7q9femXkO0YqxZwBXdx1NJfH5S3oKtPXQCpsMeG/vdqkil8l9wHUY5qp5zzyjH3VHFT4 LA+orRkluRg6BAMgrmjaiWqoSNxqCNzkJ/H0xTJgyOxYEEdaVhimAMRgflTDCxPCk471YhkC4YHN XIZQ0RKAZ71MpNDsP0nVGs2EE4Plk8E9q6EwwzJuKhgeaxILVbhGMg+lRWGoyWkhWVmZOm09vpRG Se5LR0EVvEv3UA/Cnl1j9AKyv7Y3IxijOR/e4qIXzXaqshCnPQUX7AkX7nVLe3GXkArB1e9N4Ywo ITPX1qjqYEVypYFhipkaOW3VuQV6A9qdtLgKo4Ga0NOgXJzxms8NjbxVyRmiX5TjamfzrFmi1Iw3 kRySEYwDj88VfttSQQjcwUisC41I3iohG0IMcd6QTDAXBAHU1so2RL1N93SdzIACW4zRLIbdMbSW x2rIh1GK3TDksvbirX9sRiMsInYAdDScWJCQzxIg84svPUrVqa5jCMF5RhWLHHI4EkzEqecdqk3b hgDA9KbAU7m6njtTgoByKRWGcHkClkcE/IDii4CMeenNN8sY6c0q8noSac77OqEH3pXa2AhcBecY pqBTu3HtTpbuKWEqq/NTUiAYNIcg9hV82morDVBB+Ump1nUIQTyKiM8okCQxqCTgd6bJZzwxMJlb LNwDRug2LKaxPbZQScD1phv7q7zhyQfSqq2mfv8AA9TV6JUgXCnAqXyorUr+S7DJRgc9at6ZcS2d 2rSBjF0PtUkUqcqasRKjsdzcUnIVizJdxPFLNngjIrL02cG2IllO85YMe2e1PuLTzlCoSgPHHeq8 aBQVk7cVMUkmU9SzPNJboTdDzg/AIH3arzRkBWU5DAEU66uDIhTA25yKv6YkV3ZSW8hClOVb0q1o S2UEgEssYK7VB+bFaNtc/ZpmgD7lbhR6VQupPsp2JMrhT+lV/tkbBiMhjxmpaZSsal1Zou+4iUh8 cqKZAcICDwelIt2Y1Hzh/U561A82BmMYI52mk03oIus2RVB13Ttnpn+lOEszLkRGp7W1aSGVnPzg g8elEVyu7B6ooeUWucdhUr2s28kDhhnNTTReXIHjPQ/zq6GK25LdFFFSXYIIxvNYPtHOOpqe0vDb lynJycZ+tNhQfbDGw6hTTr60a0cEr8r9DVKwFe6u5Llhv+71AHSoNjTNjpUsarnP51pSW6KqyREb WUkU3K2wJXMtbSTftHTrVq1tliLbueME1aZggUjBqMDz2wp684pXlIdkjPjs2L4c7VFWxKIAFhVe O5FTzYndNy7cDHHtVdlG41e5Izy5Jcszk881btLV2XIOB60+zhEjZP3B1q+GQAgce1TKVtECV9yl JabhtZjUN9GYRb4OQAQa0VUs3J4qO6WMSoHO5QpyKi7e5VkiiW3KKvWd2cbCfmUdarCGPBABweg9 KuW9ojwMw4kyOah2Gh99ItxavvGduDVWIyCJFDYVOCKsGIhzEfTmqN0HtpWZiSGPHvRBrZg12NCD CqZJ3UA4xk1RkuIpZZIkXsSp9arF2KjzDnHQelRdOcfSquKwqXBhvdh+62M/WtYSAqVNYUrNIxyh BUcmrltMXhVTyw4zVtXBMt3EZlj5HzL90+tQRTrgh8cVqWYWeLDDmqstiiu6EYyc59azaT3AqsqN FuXB7Vn3JZpAAPpW3bWCOSoJBXqKsQ6SkT7yNx7ZoTsFjBTSr1MSqg4OeTW5ZrcW0QfHI+8M1o7H PBHFTrEuCOxq05TYnZFAtHqCnAw69jT4F8olM8rUrosJIjAXPWqckpjZ265B/OolJXsxpXHXd5FB Iqggu3AFXUilKcyc/SsC209rqZbiQ5IbjPtW8lwFyHPI6+1VFxvqJp9CizXAu2Sc5UcDFN3kb2HT HHPSq+o3bTLIsR2nq0nZRWIl1PE2xywHU88n60NN6oaNiHBZh6d6R5N33Rk+9VhewlQEcAjrSW91 FcXBRSRkcH1NTZjJgWjc7SVzz1q5HK8uVxk45BpixcgOOc8GpjGxI2nBHQikxlbycXW4Dbx2qVEc OSemOKcBlsseehzTDOYpwHwyVGrKGTKRJlTkdfxqzbSpBkyoCCeD6U2eW3MYMXDE8imgAnB6Gr2J 3JHit76QNGdpPWq95pbR4JwVHpU0G2MrtI+U1ZeZpSc9KaZOqMgXCwnbHhAO1IkhMpyM9OR71Zub GK6VlOFbqrVnQW0kEkkb5Ix+tNJMrmLQnAkxwauRygR8YqGy0xJIjK74welWTFZx4DTgfjS5Q5iK UqwG38aRFCkd81LOlrDCJPOAB6c9azhfAXITtjqaOVhcvyzRRgZXJrOnaBpDiHn3FX5DEVLEhuOc VWZ4jltpzQmKxVWR4XyF3Dvmop555GJijUBhip5gXBw22oBujH+tGPpV3ELDHJG8ZmC4PU1plAqx sMbWP6VntdxEYO08VEsjNna+cdATSavqNM2YrdbaF5TyQcoc+tQSs16gyBxwapJdyswQ5I9PSlBl GWX5TU8oE8ulK0Y8sgydce1Oh0iWIMWAINEF9Gm3DZf61rxXkbD5jlSM/Si7WgmZI0scFwADUE+m lXwoyPatw3ls+Yc9ehpjIscW5W3ep9qV5INzFTS2kjJ9DVqLSosbcZbGSTWnGq5QbgF5qQzwRseR k1S5n1EY1xbJabNgGWznApkUZxmrt5LErgvyT0ql9rRQUIwe1DuyloKSyg7RzULMVBYnmmy3gTO3 nNVZJGdCc8VUVoDZMrgwlQPnzz9Ksw8oKi0u2eeMyg45xWhbWTu/P3QaTktiWJaWbTygv9wVpmIR xsFGMVZhjWNcAcU2UYB9DQo6XJuUGiCrnHXOaovIFfYo+VOcVpSEuoVBUS28aZZ8EnrQ2Ujnlgke RnkBG4k1pQqyRAMflHapLkqWGMAZqzbQjytzDJPSi9x7GLd3rKSEjPHen6fcvKPnWprrbLNKmAMd KjtYfs4JPem7WAq3zF5JDjqMVHAvFXZ4yzbuMGoF+RyvcVUZdBNFhBV2DlKqJVu3PBpkmZ8yNlDg 1etZBd/upPvVTPK5qSJGijadfvLyKxTvoUWmh+zyFG4z0NVL9MwsvetSK6iv7c+aFVwORnvWdqJx G3T7tVZoSKVta+UAD09aexj+1kgYjH61XWWQxhAQD6mp5bZ9omHQ09VuMbKB5gkT14qR5fOX5xyR g1DGflKnt0pJt8ZRlGQ3A+tNPoDQktt5S/uX3Z7Ve0uylU75TgHt61JZWwjjDScua0osRgFuv8qU pdBJFhAsAy2BWLd7HvJJARt4AqzqVwdpYHCgVzct07OSemeBRGNx7Go1woGAaahYsMcHtVZWLIpw BVtXTYrHjFNqwXuRuGa8Fu4+Y459KbcQyWtyI5Bwec1AskjTmZvvZzWhe6hHcW67oyJvWqtoTcjV AWUHoas6hkW8+3+7j9Kgth5kqL71f1yFYrQsrcuDx+FYNamiZzcSrgGrSRF9u0ZJHQVQEckCq7A7 TWtBdm1hEqoGLDABreT7EoYbCSS2MygjBwQRTGB+x8DkNtP0q7DqrzRGEoAT6dqq/wDLSZedpPFS m+oMGbcVjUkoo/WpVjZjhRk1EV2HK0xHuFclGx7gUbiLVxGLRVDgNI3O30FRJfqn37fP0q3Z6ZNf hpp5CD0BPero8OE8mUAn2pqIXSMr7Y0ozBBt5xk077DLMDNeSEKPWtM6XLZxgRp5uPTvTDpdzeoD MxiX+7Ra2wmzEuGHnjYAI8cZHWoJZmHPYV0h8PW6lTJMxI9TUNzYxrIoZlIIPIFJyXUaKGhRC5uS 7/KUwwzW1rU0bxx4IwOpqCGNEVvKGDjB96dLD9ojCn7tJyvoOxkSsjdTwKVViZvvil1CxktRvj+Z DwfaqXIwcYqkk0K7NTbHtHINKQqgFXGScYqpbFSuCalOPWoasxmxb27GBXP3cgmsK4LT3LRw8D1q 7FeyQQmJG3Bux7VAoEZOOWIpp2HYqtZSqeZMDHpUcaz7iiuBvHIB6itDazIBzxyKgiUROX+8/eq5 n1FYZIptbjyyoZc/KSKfFBDmSWTaqqcCq97NJcSby23b8oUdqqsjsOXJA96fLdE3sWDOoPynjPSk EsgYZ7VCsIaEOpyR1FSpliGbpTaSBO51GkzQTQFSMSbfm4qWS3YRNHDkljnNZVnKsMTZ/iHar8Tz KIoklGxhuBA5rNu5VrEM8JtbZnnIMm3AX+tMsX+0WxRvvOCp/KpNRjEcEkjZZyu3caoaRIPMkznj BFKUdBpjIxukRm4dcqa0JGa4iWFxnI49iKqXhC3LMoxuOal0yfzbpFb73P8AKjdCZnzW72/7zB2H 9KWBXuGAViFTnrwK6fUII5rSRNo3FcVg20f2eMIepBzV3ARhlFVaijBjbI4NWWHHH4VEpy3PpTT0 CxJvLlcDnFRyhY4yT1pzyBBhRz61Xcs4yecc01diehqE+RCioMFlBNJk4OAXfHAHrUc0rS3CqnO5 FwK04IxboD1bqTWT7sor3itHYzM2Q+wFQOvXBrIJKWcxZiZWIwT2FbmokTaWZB1Vhz+NYV5Kgtxj nPGKqIi5Cx8pCxy3etTThuL8cEdKzYyMD2rS0lyzsMcYrJK7GyW9gOUlXt8rVS1CDzIAcZI5Fa8w 3wOvc1nX13HbAR7S8i8kCipGzugjLSxz0weKVYypJY4X3NDxzWd9Gt0BtbBHPTmr6yCSMuy5J5z/ AHeap6pFLIqTFi+48H0rSLT0Yahev5snI2uBU2hwq08izgAryPeqV1vSY+aeSBimR3JWaLacZYDN Va60Fc6yBQsjlV2g9qnngE0Yx17VVtpMuY34KmrqSKUyhBrJb6jfkQWMBRy57jBrRwMVBExJPGBV W91aO0lWNgWJODjtW0LRWpDu2XXdVU5OMVzs+tzWtwIx+83fMBjoKk1LVYzCxDewXuaxY5GJ3zlV fOQc8jPapvzMpLlRpS6y7AuwI9ansmkvBu2lVPc1l24+0QGIcyE4roJHS1tUUcMBgCsnGKK5mWJY miRBEQFAwTWZbsTLIZmyDkketOl1MmMR8ZH3jVNss4ycdjjvRuCIo5RKvT91H85B6se2agwGWSeQ 5c9K0xZIYxj5R1OKyUTz5jGmSqsQW7DmtlK5LM90Ac8cdqvxv5VkAMAt7dD61AwV5mcD5dxwPbtW pbWq3Nugx93k0pyHEs6dqsctr5VzxKDwfUVcLxNyjdawJY1QvGByvGas6fJM6DEZdhweOlS1dXGX p0fzMqSaiEDs3BJNacFm8q5kGzParsFukQ+UURg2DnYw2s5Y2BlHy+1SxoycyKdo71o6g4VAMcnp VSW6LwFSvJx+NKSs7Am3qQ4R2OOMGpY5giFSuagyVIxxTuWdQD1IFQMcSHO3pnNRyqXiVzgnlTSu peXKMOOtQzziON8cj+tPqIjnEjQGNHZM9dpxWMkRjyjn5s9TW6h3gPjAIzWVqyFH3DIOe1aRbvYG Cwjyg7ZbBwq56GmkFjub6HHanWRcqfNUgrjAIqZ4zGA3r96h3JBJtqkRr9c0Dc/Jb8BTQ4bgHAHB o+7krkgVNrjuW5oI2tBIhO7uK56ZGE7A5bFaqzOoZR0apIIQP3sqEoD8xxWkXYkZpWliVBLKuAeg 9afeJFBdoqDCgcitB3zaxonDsRgDsBVS4gO7cRuYDDf40c99AS6kdov79ifw+lT3aN5Xyfjio4ZF 84hQCAOtStcxkHmpa1KuZV1AQFaFeAOfWoYppY8gSHmt2JlLhlHB4NVb2wZ1d4gAe4Aq+a+jJsOh 0x7m0WXzG3HPTtTGs762t8xSNIncCm2lzcWvyRtlRxtNXbbVQdySDCuefapd0BQXU2ZwJARtGKer ea+VPJ6Vd1aG2a0d4FGVG7IrDtpHRg2CPbFFk9UHqbNym2JUk+8oyPxqr5G6Pdk1El2J7krK/wAw 4GauqwwVzmpk2BAbArZrcRndu4ZfSqxXC4NaVvN9lkww3Qv94elbAsLOdBIFBBHFNO4N2Mq0mitb XbvHJ5rS0y4SdG2dM5qKXQ4ncGM4T0rQtbSO0jCRjApcmtwciXJCE+lQyNuQnPalvp1t7Z5DzgdB 3rjbvVbnOYXKL6Vpa5J0f21Au0Lgiop7oBMtxWfZOzxLLJ9earSztPIWb7uelZ8upoSLMZ5wnbOT W7FIBFj0rC09QZGb0rWZW2gIMmk9w6GZcgDUsdAeSKsTyhiqxj2plzas8xkbhu1VDOEmCMcMpp7g SzTpHkE9BzVGFmeQse5qS/QOyyEc0+FVKgqMZ61cdBMsx9KtW/3sVWQVZh4cUEmRYyB4lRjyDVnU 3aO22JkbxistXELK2cc1p3Ttd7GRegqXHW5VylEXi5BPPX3oklaZsEnbkdanSznYnCmoZoGUhWBU jmnzCEx+9q2uqJEPs8i5BHUdqou23J9OarwW8szlwMD1NUknuJmw0Mex2DAN1A9aW2hkdlaQjC8q PSks4G25dc7fWrqKZJBjgY5pKwxVlWKUb+RjrUaXZa4AHKucD2pb+BjAfLOGWq8CBEXPVR+tRZDT LeooplhgbhZGGT7U6+s7KO0eNFBbHDehps1yDHGZFzIv3TUMrv8AZJDn534BpXtoKxkrayyKCpOO 5q5bRAAq5yF6Ggy+TZInQmprUq0bE84GatyaQWGu6MhUqFPrWeWDHa3b9asFt3J701YkU73+6OtC l3CxPaP5UbydwOKhurtpysbNkDrmlNzFKxgtlPrzU7adtRGzuLj5h6Ura3ZV7IjWPzI9ucg9qZOm JY1A4HGKvQW+07F5NJf2roqSIpyvJoSYrlKeAxTM4O0kY20iK5wadcTm4mD4wPSnxZNNvQB0MfmM S/QU0zKtwqAcAgGppJFihY55A4rPXAjZzyx5JqY73Y3sd0WjSIdAvUVUk1MA7VX8aykvWltIgWzt GCKY0hduaiVSV7CUUaZ1V8fcFVpL6aT+LA9qqtk0H5eM5qHJsaSRI08knBYkVBO5JyD04qRi+z5I mPvirFpprzsJJxsQ849acYthcis5gwbPbj61cVgTx0q3JZR7PkUL9KoNA8Sbs5HcVo4sVx8myVTG wyDXO3kRgnMR+71B9q3PMGRjrVe9gW5ByP3i9KcXZjMuERhwdjsvfFaMNvFcMSYise07Tk5JFZ0T m2lKSLxn8q1be5VSqg4AOfrVsRTZBG5VuGzinJETKq560/UHRtRk29Nq5+uKSNgBkHr0NSkO5Pcx G3mWMnJPcVH9nEdyjNyvX6+tKZN8g7nIOTTJhI93HEh5UlV/Gh3EXbvR7eZtycBlyrCsVdNMYkDS ZA61ZtdXkhcwuPlyevapHbNkSP4hzRJuKBJMzooVgkaNWzu5Oe1PaHCAAZNLIq+ajJn0NSliMEdq fNdBYSBwV296vWUnlTJ5mSo6e1ZTRuZSyZGeasQtKm0PzRtsPfc2dbkVrJNp4Zx0qhbFBfMVUKgU Ln196hm3uVJyyA/dzVmIZhJcBGB45pN6BbUnvLcS27FMFkOR7is/TU/09GU5xmtFJQvC857VBorw wXkizEDdwpqYPSwSRo3FwI4yCCWPTNY28rIS/Uk1u3sSsN64PH6VlSxb0wRg54qo6iIHkwmahzkc dT0qV7VyACelL9iZAzZ6VpokK92QKjMcenWmvuU7RyDxT3uIraNmdwGPan2bLcj9yu4nue1Fwtc0 rCAOPNI+bAUfSrUys8iRj7p+8fSoTcJZosW4byO/apbWcP8AeGSetYSZSRJeqiaZIpHyhTx6muei s2upgHUoM8IOcVvX587STxg//XptrGkM7s3AUAVotFckz2VgSoHQkVo6UCrt/u1Q3CJpSx+UMwyf rTY9aS0k3BGdSMcVkr3KZvXlwLS2knYZ2jp61g2k5vro+d99uTior/XWvYPJMXloSCSTnIqLTHDT FlOSv61rNaCirGvJZCF0mjUlejr6iqt4gh2qozG3QehraEiCIZx0rOtwXeQzj5FY7ff0rNLQdzOu tMmuY1dB271mGymjuI1kRsBgTj0zXYC5iCjgjFVZ5VY5CirjJoVrj764htbdvl3StgKAMmqNncXe 4Fo9kY7lakQpPdIr/MTnGfpS300ixhExwcAetJyHawmo61NBtWFRuPtVa3C3iyNOGL9SfSmSf8e7 PKmWP3T6Gn6PN5Ny7Och1xg/WqsTfsQWelB/nlJO0dT65qje2wF0VgO4Ac/Wuiu7mHIiiIAY84rO kjCFpE6A/MKXM09SrXQywIs03OuJCenWrErtL+8fv09qq5EtwCTgAcVYySqqeg61nLcZGsalznqe TU4AwZCeR0FQSypDli3AFRWt9E67nPJJxntVJaXEaSMfKYucAg/jxWZAXVXt40yc4HNWYJmubhYl xtUE5rSttNUTeZ0NNaAzBsbOWaRSEJXGc10FnZPGCWHXsO1aMUCRIAqgYqXOO1Vy825F7GYNIiZm c53k5q7DAsQ4AB+lSlhSZyaqyC7HDGafUdPHStIsllS+27o8jrmqckQIBHWrN8ytIADkr1FQoQax qas0jsV5FKAA96jDFGDEdKtzKSpH5UxYfM+U9utQhsia2Mrb0G0ntT/sSSoiAfKDlvrV4Rbl44NN kUwxEqM/Sosx3MyUqJWiT+BuntioZEUyxPKuV3c1HdboL6J2PEhO4+9aKKskZBAJPSrloxx1RQlJ nlaQJheij2qKU5i5q4IyDtPQVXkQI+CPlPWlzdQsUYICVyM43VcSIyHYox6mrSFI4tiKOepoC4GR xUOoKwpis4uPvHFRN5rxlFAWHtnqaajxBzvPINWZA02zYBtXnirV92TYyZLl7a5j3g7SvX0rQMuz bMw3IR2qndRrLE7sPmA49qt2YD2IU4IK8H3q3YZUmjUuZITw3XFJ5G5Np6mrqWZO1osDn5lp8kSQ Isw+YMcbfSo1Ax4Zmhl2A8ZxWssqyqQvBA5pJrS3nGYU2SDqKrEi3kXJ5xg1fNzCtYsXGnmZVaPg 9zVC406aMb0HA7VqJc4X5TkDqKmSTefUGmmIxjdmCLyn+YNxirFvCjiSWJQSAMD8K0XghkGGQEEc 1j3AktTKkLYU8Kfal6DMry5Li5d3UBieMV039iNDaJJGzGQKNynvWRaxE3CMeCXH867MzKFLEgKt Ve7sxPQ5VpMOUkGCOCDWjp/miNtjfJ2zVUyW9zfPI2DzVydwqhI2CKKye9kMdLd3cPEYVsetOttW kllKTR+XxwfWqjTKmGMhPHNV7i8SSM7ACe1WnLYVka853nnkVi6npyvEXiXDA5x602y1WXayTDgd DWgt1HNCQaNUx6EMCr9hA9Bg1luAoO0cVoMxjUsp+Q9RVJBvBoQFvT12W7Njknin2t5PHcSTOA0Q +Vh6UwNtspBjBUcGqFk7xM67iyueQe5oS3Y32OjzHcw+YhyDXNX5/wBIQIuW6E+9W9MvTbXDwScR OeM9jUExC37eYPkzkGnFJakiy5SEeb94jAFPt8bQKuLaxXTb+pxxUMsQhuWQdBTi7oGSqKnj4IqJ alWgDKv4Ypj+7XG08VNandFhThl4q/LYCa3jlgHOORVKKLy5hG6sGduKm/QehXTW2gkaKWMllOMj vSSXD3SGbZhSQoqvq9uba63beG5Bq1GuzS4ieCXzj8KpqNrkplSUYjf34rfsrNI4AuM8VnQaeZlE rN8p5xWitw9lbZZTJ6YqbrYoeyFF6cdqZG2w7u5q2hW6hVh0YZ+lU5x5Um30oEPedHXHqcE1TlG1 toPfNDSbRgDvTCxwS3WlIEJyzcnNXFtGu1CIwG3mqsfPJrc0ZV+ztM38RwPpSirsGzBvtEuUG9JC 4Hb0pNOxkq/8Sla6dmG5gMEGue1JY4NQKxfLuG4Cqb0BFQ4EuCMYOKfqvlxThI+gQZ+tNZfMMkh6 rg49ap3LNO7P3PanFXB6EEaGWYBeCTityW4Sxt1UnLYwBVDTowCWPLdBSXETSTkOcsKp6uwI1bCU RSCadgN5x9BUmqagkjmCA8D7zVG8SraM7YIVOPrWQQTHSv0Fa7LATHJFMeQxDNLC2FHmnio5sS/K gNStzSwmZJyN33RVqK1aVTjgdqg3C2QNKMjsPU1etr6AoNoKsOoNOV7aC0J4LLy4izHkDiqEty6u yBcsO9bEd5Ey8jArLmZHvS0QynrWaV3qFyDzrhm67RWra3FuJBvjIx95j2qrMipEsvY9faqwf7Q4 AJEZIzjvVWVgOqhuLeQFUdc9qsL90CuVltZWbdaR528AjitqzS8iCpK3mKcZLdRTS6kM0C3y8VQv 5FhUpxuc4VfetEAAVSvreKSaCVxyhNU1pdiQyazRYVY8OF61RUKSWB56Gr18Wkxg/KTWPMJIZcxg sM8isuZNmiTsJqFoLhQyffX9aoWkm2TZJ16ZrTR5A43DFUr233O0kfUnJFaXWzFZk8UYu1K5Hnkj B9aimiNtL5UgwwHNQ2Bka4TBKspq3q0rzXJcjGBgY9KewEaEAblPanWzO17G3X5gc0R20ojDFW24 zzVmzRRexp0IyTntRoFyle2ifamV2KA8qwH55qadwtuVHTGBU+vQ/v4Nh6g1muWbER4Gc1lLWw0M RSMk9G5FKs6hcSKQB3qWXaNoxgDoahlXdC23r0prUCzHPB5e4MCOtSQsJ4ndByDjms22tPLQl16j rWnY4jQq2Tlg2aJWWo1qWodOmdwxcKu3kelZk01zFI6SRFlU43Doa2kkmuZMRMVRepPpSQ4R2Rhu 55yKhSCzRn28uUycgkVUmzHNkHDckfWrE7MmpSqq4j3YA9OOtF9HuCyqOg+Y1orKQPVEdheXC3EZ mnLqTjb2Ga2RtMi5FYsVtvOccrzxWlE+VBbg45qmyRbjIlwvcdKjeUmMqeKVx+8BJyDQ7wxKS5zk 8UhmfcadHPlwvzZ6+tadlEsEOUGMZBqtHPufao4Y8VpTyg2ymNcBxlj70pN7BYYllFKS5G5j1Jp8 VsISdowD7023bMeVYb8Z2+1Wj5oX5kz9KykmirjZkL27RjvVSRJd7eYchxggdKtfaArFSpBxmomv IWbBYA0KUlsHKmUZkeVTGUBDMTk1UvLXyovm6npWteX9rZWfmOQ7ufkUdTWIb19SG1vlKnt0ArVK T1ZN0tDOeI7cZwT0rY8P6VK1x5rZVF4570R2Nu67pHzhq1G1q2gIihUuT6dKbnfQmxcuYkSM/T1r O+0EnBBqtd3t3cLywjUdhRFKBDukfc3rWe2paLTS5HTmmEMRzUiFGUODxUDzbSfapcmxjxGEIIPI 5qndyu0qljgK2R9ae8xwXU/NjpVfY84yxAOeKqMXuxMia5eTKZJ5J/OnsNqYzyPSpIrYIBtzvPFR 3SNAF5yT1ArZWuSxhLA7x1FXbYieN89G+Uis3zSykVPbJJvTacDvTlFNCUie6tBDloSQ6YPJ6ilu ZgqZHSnXr7Ywy8n37iks7KW7mCupwRuyRwKztcsoeS904yCVz90d6t/8I9dykFUCjqCTXT21rbWa lVChu5PWq9xqEscxVQMLx9a0+Hci99jB05ZLXUUWZCoGVb0rq4cOgZTkEcGslZt7EyRg5OTViG7W NQiKcdPpWPMr6jaZqAUxskkU4H5AfaoZLiKH/WMF+tdDtaxCHqhJ5pk0iQKWc4FQtqkCnAJbnHAz UU0qzxNI4wAflB/nWbsloUr9RJNTEYZhGzAU+HVo7qRYrdWLH72RjFZNxJuUrnqeat6JZ4JuGGCS QPXFNNoGkXr0JFBLM3VVJz71i291KNo3qSTzmtrU4zNAIh0Y/N9KwSsYfESnjjdSe9hx2NeNpJWB GAvvU0URTJHJpLAh7dWPUcVbyBxUIGyJHP8AEMU9mz06U1gCeKbvwcGocmtAtco6npZu41aM7XU5 A7Gq0MjwkRyjDetaxn7CoXjR2+cZpOatYpJoqFgTnI9aYwR1rK1Nmiv5FjYqu7IwfWpYJT5BJf5h 61pyaXQcw+cY+4SKom/uclQAcUgvzK23YeakgUsCgA+ZuT7U1FLdCbJtNBlDO43AttJrZJFraTMe Nq1Ss0AiZUAUF8rj6VZvwGjWAnJc8/nS6iKJH2uORIRlip/lRoUg8n7JNw6nIzW1DaJDteJQDjBq rf6YzSi4teHHUCqWqsJssNaupzHgfWsvU1+yWsO9tzl+ffNO/tS6j3Quo3r61BOp1KFQ3+uTJ9qS jYdxV1CKOE/K5YjkgdKrrc20iklvn6c0yGUMHWT5WXgigaS7RzSLgqo3LVJJAWmRoFx1U8ip45Qt uZACdpwcVnSXTjZHJwygHFWdOlxI24/KwptB0LFteNcTeWEZFzjJFXb63hW0kJxnHFUZm/5aQ4JX oFrJmlu5WJcvjPTNCsJpiPI4OxfqKsm7ubtFg3cE8+9PttPeUq0zBQwyBVjyEtSEjHzVLkNIlt7K OA84Zx1qadYthV13BuMU1N0ceZB83Wqom8+QKDls4xUDHNEcGOJTnpjFRHTZNv8AqyBW2JIbY5I3 OetMiuWublUQYXOT9KfP0JOdfTGZ8MzItS2tk8asjPuXPBrf1J4iPLAG/wBfSqOxfJbccehFOcmt BxXUoyjMBCnB/nUNuuAM+lXJogYsDt3qnGjxvjGVqFK6sNks4ZoXUdCORVCwwJvm6Air251fPboR UXkmLbLj5Twa0jsLqOurfJIAyQc1CSzqFxlhxWgkgKBuuRg021hG4sBlzUc1ijU0eALZksORWTeu H1GTb0BxWy8ws9PYvxkZrnIW3uXPUnNax2IL6dKmUVAhqZTQBRTV57OBEEYYdjmkbW47gx+ZHslV wcjoKzbuYv7BegquSrtnpVcojpdQgju1wCG/umql4vlWVtET83LGqOnSulxGNxK7ulaGsIQwcfdx j6VLVgHW0+2JI1NWmmUxFWHy96yYZAFHqKju70tmNO/Ws+RuRd1Yntb6S3uNyNmLcfl9a0ryQXDb 4+eAeKwoXwPpVm2vBC/3sBuPpWrRJXmuJ1k5QgZqyj+YAc8VpNZO9ssi4dazbi1mg5AyhqJO+gJk s0yQw9eW4A963mzDokZj4IUE1x0iSmUSFeB0rTs9YdwbW4PyFCB7GqUbR0B7luLUGE4bsBjFQa0w N9byL3Xmq5BBBHemXM5kZd/VAAPpSQdS1KjRyCRU3LtycVmzOFY7eh5FalrPJtbAypXnNVray+0v k8KO9TF23KZLptsJId3mbX649KrLZ3ElxuEnylvzFbUFilvHtjJO49aebRoypXk1XN1RJTu4HUPv J2bCy46elUJEKoFHSt2/iaGxeSQg8YUVkOhZ1UdxU31KRV37vl6j3qWKRVPC5xQ8JT2NOtlCNubr 2FO6G0asdnFcWyGaP58d+1ZVzpr28nyAlfWtL7U+Vb+EAAir0bpMnIzmhMhowLcyEhV5q9JAFAOO Txmp4ofs1y6bcpJyD6GprnasSk9WIx+lHUZl34H2IRnox/rUlvaxxWO9GByOQe1QasGWGLHQvzUF qskzqoJ25+amtgNjw7c+Y80Z+orcKEkkemK5G1uhY6hJKgJiDkHHpXUWWoQXqnyWyQOR6VSSZLAS mLCOCfQ1FcyAqpHO01blA2kkcVnxYZtp6nis5J3sNWJjt8sbuDiqsuMhY1+brVy6jK26uB8yDket Yct5KtwGZNvbio5OVlJ3Lf2fJBaopoV42H61Gt4ZBw3Q5NSi8G3a8WR6ikVca8SxKHVRuzxTJn2q zBA5KkfnVszW9xEUI2kdKga1WONADvB9O1VewtGRSXN5NAoKABQAAveqEIun1WOSdGVd/PvWorGN gFyQP0qzHIJCTx9apTsDiVdTjAu1C9AvrWfLGS4YLlVBLc1rG3aedi5/hODSWcQjuNrjIZCKlPXU RkiKQKd4JUdyKht4y1ztz8ueQa6G5ntkISRcluBjtUyafBNbMyIFLZ2n0qtegrmSuw5THGOKagVC SxwAOK0LbSyUBmb5uen1pl9o0ckLDzDntWdmXzIksZFksWMZ5ZyM1KsQV+Rk+tZekN5ObVyNyc8d 81s9PlPPrVSjbYlMx9WR1nWRQNjjB+tRwTeWGt7xcEgocjr71r3UCzW7xnsM1VuYvtMDpgbiOD71 UdUGxmK7WspXdkDgH1FWw4uSzoPmHWqqaZdsFBKlau2+kyo5w+Rine24WGqS5ClSDVHUIJ47pUYY RhlTmt6G08vO5SzA8U66sxeRAONrJnaaUZAzBtpg1xErfe71s3BVYWC9AOlcvBI1vdMzclCVI/nW 2lzHMMA5yKVRdRx1ILgyRmNoztZBn8PSpJdauwEaK2dgR1xUr4lGSMY4q3YlBCFIGAa0VnuSzDl1 W8lbIhKHGOapH7TNIWPYZya6i8WCWEiIKXdtox61mpbrh1J+8vyn3zRdR6CWplfZXlZXlbJHp2q0 kf2QkqAQw5p5cpLtcZOeAO9Pa6AOxohtx3NNu+gWI1ljkj+UHnnFIu1UzwOajTMkwSJtqEZPHSrq QjcM4PGPxrKVolFZrjzGAVTnpU9nZT3EiRsdob19KfDABMqsPlLcn0rqI4I12sqjIGBTiud6CbsZ S6LKUIE+MHjiqb6NeLKM7WXPUGunFFdHskZ8zMO30ZkT52GSe9Svpe0DZj8K1iBVS6vre1/1sgB7 DvUumkNSZlTWDoAXk24POPSoHktLYHb+8nHdhwtMuNTE7ygkhSfl9xVJuVXcOvWoW5Yx2WWRm2gF z0FXLYEnEY6dKhs7VrmYAHAHetWVI7WAxQjJJGT60SYRI4NOlunLzEEEnA9BWyskVpFgjhFzTbR0 gRIZCN+MmotTTbEXXkNwfaklZcyE9XZmfcSGadpOm45xTM4NMz71HLJtQknAFYu7dyywZRGhYkAD vTFnB2yYOzOfrVlrBbmwZOr7c1Xlt51tF+TecdAORVKNxXL9/dbNOadZCm3BGKxLxnkTzN5YnkZq xIWjjSCVsxuMkn+E+lLY2YkGJGCopwoz2rSCEyOV8BSdwYgHANXobR8BndmLDnJ6VDdiJXHltuYH B46CrKTH5Vz1waUwRH9iMt0AvATrW0uyCH2UVUhdY1IzyTkmq95I8sZSN9oPf1pQdmDVyK8vQ+xC 2PMPJHao2iVeRjAFZqxSsCQpI9af9scERvwQOhqrAbGnzjJhHXqK0CD1ArnrS62XKFjgHgmrt1qb xRbolMij+7UOF2M0SCOcGmkc81hJ4jw+2RWX6ir0WrwyLu3DFTKk0CZb/iJPSqt3qENu21mAb0pi XsdyjyJKFVR3qtHFbzSrKcO7DPNQqfVlXC603zLee5diZMbgPQVhiQj5c111qBJ5sLH7y4FcnPYy xXG1uADzn0reGqIe5NHCGJKD8KtQoVA4xS2sexNw5GM1YZQVOBnj86iUrjLNrGFVSD8uc5pjEyXU hJ4GAtLanNtIo42Gs6DUozKFY4Oe9NLqB1FrMJIVPfoasJ3NY1jcANt7MaNY1OS1KwwEAkfMfSrp y1JkilrSr/aZeJtxGN61Y0qa3jnc8hZMAbh0qtbhDkkZLcknvUDyKjg44BqpO+okibW7HyLpJYgA shwTTvP8hXt0Y4IyafcXL3MAAAKoVI9aCgYGTGAfWoctB2Muc/apWGOUUsSKCskcagEbqtjyrVZm YZMi4+lSadCt7c4cfLtzVARWckluG3qWDc8CrEd9CrlZFwG9e1bZgRQFCjgelZN3pgnmZkXIHNIL leVHZjLFJlT6dqURspDn7x55rQNskBCwQkcc4FQOpdtzcEcVLaGioyXkm6QkMvoKq2zrDfI7DaRn rWuisEPOF/nWbqsQg4kXKvgg/WmveEXjKJBkEGlgvEtJJGbuvH1rEXEa5VyB9adH5ki7+WXOM1mo 2dytzR+0NMzseshp0z52p2qFQY1DHtUTTjlyeaJaj2LM0ojgJ/CoUlLdVxWbdXbSJtGeK6HT2huY kwgzjB+tNU2lqS2UDuIyF4xU6Jv04Z+8BmtO7jjSHhQMCqNqPNgZR7imlYCiqglTkge1aUVxbw4D MN4HTvVIQtHI0RPSq80TRyCUJu2nBIqtAY7Vrx7qQRk7VHIHrVe0ODg1akSOZRnr1BqAw+W5Knir T6CsXEqZaqwNuq2tJgYU1vktxkVTkOG+7yKsmaR2wvNOjs55Z9rYHr7Va03EXtEhSVmZxyo4rSlh 860J6kVHtj0uBwW3OVqXTZRNbAH0wazbvqM51y0ZZD1zimIiPubd82cVa1CzmglY7SyEkgioLZjE BleTk4NXfQEIq8BhTARIxVeoqee4VmXaAvy8j3qCLMV4D1VuRQrgb+hXoETQOenIzSyKZUcA/ISc VlKfKuWKcA5xWpbqVsVLHrWc+4IzzbTKWAG4KM/WqzxIXG8FGNdBaThCFmXPbNTz2Nrej5cBsdRS TsDGQWUbWUYOCzDk1hX1tJHMVZcZPyn1FXpftVi+A+4DpV11+0WsUsg+b7wp3S1QEVlaGO0Ic43i mvtjKwx8A9aGm2Iyu2B2ye9UBcIJc+YCTx1qbNsrQ01u1ilRTyi8VpJGGCuGyDyK54xFmJzg1raU zxYjkOV7GmhSIPEBkEKRqcq3zf8A1qz7GQZPmkBlHf0ro7+0+1Q7R97sa5i+0+a2f5wcZ6iqce4k ySZlkyScDtTY0WSdE3YNXYI4JbcAjAxj8aqXVoIisisfqKhLWxVzfisEMG1h261Rjhktp2XPGfl9 6j0/VHtyI7hsp2b0q3ql4iRRMpGXzg02mthJ3LBKsMEjcKq3GcJGR8wIP4AiqUNyWQFuSM81deeL yQXPzKM5oQPQhurcSwttPTkZrNRZYo/LBAz1I6mtfcNpGRzVK6IjXGOQaEwLGnaYJIwX4T+daMMF tp7ExgKWqvFdeTYLjG9hn6Cq1syyzNJO+70XPSqbsTubkxBjAHRqz1IDF8YIb5femLcytiMDIXnJ pyMp4dgMdqTd3caRaubtDCRzuIIwKxWuA2AEwQOSasySwxDKODjnGaitmjlfnBB/SlJtu7GlYrSR JydoUnuKgLspwDxV66NukZUsNwPFVVWJ8EfjmkvMbHQ4dQxXvUyztEDt+hFOS2JgZVdcHB+lPSzJ XmVf9qjQY6K+VcMVHPWrtsbaTL8D1Fc/fP8AZzsXEgIyCKpi5lHCsY93FUkrXJZuyazAs7xAYXOA atRzJ3wQRxXLi3djjIx61ftZZYECuN6jgH0qZJdCkbTWsLncwBPWq9xdvaDEZP09qWzeSXc4GcDk U+4sftCxknawqdgLsM/mIO3HNMnkRU3MeMkD8qYYpFDDIwQMVm3tteFW2qXA6YqUm3qGhk3M6wXS Tw9QeR6it+C5+0oGU9R+lc5Fp1zPPhl7/lWxcQmzmRI8lEAQ47nrmunS1iDcgtsjLnr2plzFFuCI BuJ5rLTV5okVCBgcZNXra5WVix6k5yaibUVZDUW9WWYYyvB61IPl4BqvLcLGSzOMYrKuNbijYbCX PTislrsU13NqUOQGQjgjP0pZEO8EnjFZ1nqaTgK3yuf4TWgZQflI+lVbQmxgXegtJM8keQrZbNFp o0oUpkh+oNdFHKgG0nB9DT8jGcYq91uK9mc9Lp93bKW++O+KriRzwAVBHI966fdzg85qCa0Q8qoq b6aFepgQyskoOOlSXQwgKEBlIIrXWyhbqoBFLLYxMNpUFam9xuxzcSPM5eU4HYU82YkmUElVPFal 3YfZoxJHyi9j2qtv3Q/Kcljge1a3Fa5myqbSR3iIcA4571PZz+ZFIWxu3AADtV26sLRolXcSQu5s HvVGCBbaRtnT0qZWav1BGjBMBkMo56ity1cNGuDkYrnRsLAkitDTLki58kcoeQazpPllcJao2cUZ 7U1nVFLMwAHc1WuL2FYiVcFj90A9673JIxSbJirB1IPGeRWRqWlRXN6LnO3HDe9SR6lPNIwCKqDj dnNKztcYVfug8n1rnlLojRJ9TAmVJJSEHyKcCqLSukki7uAeK7D+zIREu1MMGyazLvSYYrnzFPDZ 3KaV7bjvfYZZSnyz8pUdie9LczrGFIOSDn6mldAiY7Uj2Pn3CqufLTBJ9az3ZeyNG2tpLmJriceV O5+X0xWgUUw+W2CCMGqUdyJHEJI3qOB7VYZtq8DmtGzOxiXsTW0pRgdpPyms24VplK7sAjFdNqUf m6c7EfMo3Cubw8oIjxyOvpStbUaNLw3el0e2kb94n3fcVq3chiTco4x830rlrCF7K4ErfeXp710d 1dosKSkjaxxg0S3uhjRHBdRSKQGXGcisjbFDN9njbc5H6Un2sW1oxt8sZCcAemam0izdibiUEyPz 9BSV4gXkt47WLBGSRinoEaMlh93mrU8Q8jBHOKz7oSJiJFJLDtUbuxSsTr5ZdSz++KgHm3VxK6jb Hgqv+NQxLsfYzbnbge1W4ncyNHHgRpjJ9aewmW4YY4rcRYz61l3+nqZlHBDe3IrVuJFij3d+wrMJ eU+YxIbOKLtCsVJNPkjwUORjvVmzl2SBJAArHipBMu1dxJIPI9qfNbxuWQnjPykdqOZ21HbsRavp KXCb4wFkAzx3rHiBtwInGVJzz2NaEerkF7a4+8DtDCnSo0zLHHFuz39KvW1mLYzXginkKn5XHfsa sWMT252E5K559R1rUtLGOLlxk065RBIXVR8q4qb9BlW2m2zxNkgE/lS6xE5bzVUMmOSO1QEAW4Ib DDmpI70BxvOUcdKzTa2KauU7HLQkg8J1q7bEPGxz93pUUMke+Zo02xk9R0qeKMSL5cfU+npRImwi CRbZnxxJu/HiudEW6dGx/GP512VwmLXCgYjHArAmgPklolyc9B1raErImxftYuG2ngcYqnqLFpFL c4JH6U+yldUy+RkYP1pzOrTAuAVPX2qVoxvVC24zGvuKrzRlZjno386tlVhxtbjtmmb0lmQnHBwa vmJsQiOVE3L0HFOSdhwwJHpVvcFQjcKqSl5Jl8sArjmslJyZbVkElr59puc/MzcD0ApdHuxBdpv4 /hP0q1bxYVi/3scCpba3jFo0sShnI+b2NaXINOe8hjU4cE9qzLe8eOVm6g8kVXlkEs8WFwwz+gqF ZcPk9+tTUd1oNI2TrEKp907sdKge4S5GQNrH0rNl2n5hxTk4AKms5SbQ0kWZHKIM8j2qO/uILiCN G5kUYNVjdSIShAIzVe4kDSCQDnvWlO99RMYlsknDOdo7dzWvpYhe0khUY2N0rHupApTC7WA5962d MCC3QnAcrkkVUtARWvT5XXvwBWZLwuT1q3qNwDN1HHaqtsfMDPLxz8tJLS42QJBI5JK/L610ukQf Zok5zldx+tUBMNgUAdKs2d3twjdqbk2TYvXDI42ucZqgsoi3yL9xD+lPvpY3wQ4/Os5plNu8Ckne fvUWC5f1KBlkSaLncCCKtWkYfTSCPmPWqct4XWIKPudfyojvRG+w/dNIZm3UDxTHa5254FIrMDzk 1oy+XLC6kgOc4qlBGXHPGKrcexLbA+Y3pV1elRRRhBUopkmT5QgiLsRk9BW9pKQTRB1xuPXNYC28 ssbyuCVUbiT6UyzupLdw0bEe1DVwZseIrdtquo4AwTVDSbkpCw7g1prerewMsgG8Dp61SWKKEFRw DyTUJ2Ha5ZN0WBJAIqtcCCRCwXDj0qKaRWAVOAO/rSxyKCN1K47IypUIUuQaazEmL1Fa8qozBtuQ azri3aJw3UH9K1jNMTRIz7ip74xVmO6lUKp5Re1RWaLKrk8kKSKVcHpSkxF038EwzEcN0IPUU+K5 ODk4PYisG5V4LnenfpV2OR9gMi7eOtDjpdAmXFm82R1lcnI4z61sRsslmB0KjGK5tWyVcd629PBa 1Zick8VD2GVpEEjbCO9ZepRpbzoFRdo5yetabsVudvrJtqrrltl7dlGXJ21aJZYTZIodfu4qQStB JlCSvpVyHT/LsljH3sZJ96puhiwH65rGziy07o1rO98xQCfpTNQ+e2kyMkqcVmxMY2yDV5LhCnzn n3rVO5LRj2k42iN+ASDWhewmRgF+4FGRTFso2lLEgLnIxS3V5schR0GKzb10GkUntioJkO0dqgvZ vN8uJTkRjaP61JM7T43MSf5VLZ2JkJCrlj39KrmHylKNzC+0nKmrqpHJIGkJxtxj2rRj0KB/9YWP 40yXSdufIY/Kehp3vqJdiGGaF7fbHIHKe/OKjuCssRB9OtVkspEnd4uGB5Wp/s0ssu2MEg9fanZb giq8jt0yxwBxV7S7GSZS0hKgnpWjaWEcJ5GT3Jq7lY+gAFZuY7CQwoibeuPWmtbRM5Zl5pks6q4O flpI7hZHIByR2qOYfKL9itl5EYY+/NQS2ETtuUNGc87DU5JGc0iyg8NkGlzsfKVv7JgDg8kn+8c1 WuNCLyBo2285IHetqPDnPYVKWG33raLbRm9Gcde21xYybdzbSMgrUMNycFGkbB689a7SWGNlJdQe O9Yup2lm9sWQIr54I4pttaMadzAmdQc5yByKlhcXcLhU+ZOfwpZLVdybQQTwRW+bSKy3LGgXKDcc VTdkHUx/IdIhJ74IqRTkfLTLy5IuGjUgLjB4p6oNg2msn3ZRd0yZUlaJj97BzWpJC+d4b5a55VZX BXrkV0lrIZIgG6g4NFkJuxBIsqkEDevtSG58teVIq26GHdIpAGOVNZEt4Z9+47eyim42EnckeNXy 8bGF2GTx1qrJh02O+Co5z3qSWUzNEp4CjBPrVKf5twQ9DjPrTjcGSOEkOwnP9avpaqyIVYjI71gT StFdxjtzzW1Y3IkiwT9PrVSVkNMnmtN0LI5LEgiqVjoqyeSzEEITux3q/Nc8D2qrpl+ILnynI2M3 5VEddBu9hmr2TQMXiXbxkMO1Q2Orys4hnj3P2YV0MslvdQlWYYPFZMNhHDfNMWDJGuatrlITLqzR syq4wx6Zq0pJGTWKG89iznnPHtRFqclq22Yb07EdRWa1KaNljhgcGpN4IqG1uYrpN8bBh/KldecU O8dULRjxhjx1qdV45qmA0TYU5GauoSVBNXQabae5M9DP1yUQac3IG5gv5msFIio3Rvx2rc1mzS6S Pfnrjg1m/wBnvCixxPuAOeetVVdmVDYohr5XcRBWyMbjQBKrZmwGIxxWhFIqB1bhwenrSOEkkwwr Fs0sUtyK25m4pbHVIkvF2sOMjb3JxU0ttCzfJ0pkWn28UiyiP5lOQRQuXqJpmlPcvdBARtDHOKrz sBKVXsBUoIIUDsDUTLhmY+lG7BaAsghgO3lm4ArR07a688EdqxI90k2T0zxWotzHZwsSQPerukxN XNOaVYkJJxXO3100zbl57cUgv/7QnKs5WIZzQsUcSYjyUBzn1q5O5MVYhhWSSQeccJ3rTNwibVXH IrPaYMpH3T2Oaghc/aBvbOOlJIpmjb7d0kjZDnofStG3mEiENjPqKykOc7elOaQxrKw4ITj86m7C 2hfvbhVsph1OCoHrXOxRyxg7R+JqZp5n69uaVFeUnLYqiBu6R5Q0+NoHAA61Q1S6mkdY1yI1yQMd 61BGMZJzTTGh4kAOehpJ2dyrXM3RxJLcLE4ygBPPrXa2UOyMcdqxLC1jF9Cy/d5yK6RRgmqXvO5M tNCrdPjBBHB5qikskkpKIP8AeNJeO8h8tc5Zufpmp1kjSIrFjC8E1G7uPYpXJEM22NdzKmR7mm2R FnbM87lpJGDPk9/aknffJiD5nqs1hdzEmRcA+hpuwIttM85DMMegp6EDO48Gois0SAGMkgYyKz3k mZtvK/Wotco0WaJWxkZNRtKY3A3ZFURGXPJO71q/BaAZeVsketFkFwitkn1BbkrgbRx71pho4+QQ D3qlNfRRNtA5x0FZl1cPK4OSF9KdriNe4uJHjZrUBsN83tVIXilGQHc3X6mq1pPJEJVjPDDkGlt4 kMayD/WNyabSsJbizI4Qk8LjpUVuUa4RUBY9xVqdFk5dj9KZZWrwTLNEM/Ngj2paJF6j3tWtydjf IeSvvV/TYvLQysMcfpVkxo5JkwBTbyVEsysZBA9KhJyE2Z8t08txtVsRgkH3NTwRxqrSMwCjrmoI LYmMuwwD2qG8P+i+WAcl+avfQRKWVpHO0bGOfwpjwoR8pxUvlCNEj/uoM00Rg5PYVk3qUVnhMmNz dKYISr9ce9WnjO4beOeahlO3rnB71SbYhFiLZGTiiAlJdo5OMgUkTssbEHio7Rma8Vh1FUk0Fx0t 7KW2Iu0571b0lmgSZpHBycbfWrUKRBnaaMEscjimCxt9+Y5GTuVzxVOVxENsyx3wMn3JBtB9DT5t OYTN5YyOtWVt44m8wgMF561oQSRyRiTcMGpvzOwttTBeLYArjDHsaSMBRg1avpop9S8njKLVDU4T HEroSDnFJ03e1x3HSQhmyOlQTQEIG64OKjs2urmfyg4BKkj8KkbznBUcgdfamouL3Fe4GISQLuUM A3X0p0cggglZSQQdoFOJYWSoowTzmntbbrbzQuW6kVpuLYzfKSSISMSXyT9KktomnMMQONzbc1XE jrMY+1aMEBR43JxsIYU3oBproJTlpRVS4sEjJHmflVx7yabPzYHtVKYOVDA5zWbkuhSi+pW+zojD GSaccZGABTtr8E9aUIScmldlWI5ZvIIIGTWdNPN5+7ghueKu3UitkEdBiodqiNCB171cNNyWMSaR 2yetXrfgCmG3/d+YBgjrT4avQgtA04UxaetSMtJGkuicDqMNXMXDKbiQx8IDx9K2rO+VLCaF+oUk flXPopYDJ5qkKxraR894vPy7Tu+lNnkSS5dIWLKOtRwSC3tZ2HDbcCl0iIeXJK3VjgVm9dSyOW0u CuU69qZ9mu1UGVlANbi3MccCqRlg2DS3Sq9sdo+YkkUuZoDDWWVOMZAqwQJo2EnDY4qhcT+XKIzw R1rTJQzBieCgNW46XFfWxRtVeMkDqDipQuxip4PpTEnUOwX7wINWZwsrrIpxvH60Ng0QSgbSzDkd KYC904QcDGDilnOAV71Z0OBpJDIeUA5prSNxdRBbGAhGORjir+nzBUaL15FN1XhV2jBFU7PInBB6 Cs9xli4Yi8fZz3qK4uJG25ALA5BFPWQLOztySMVHLEkuNp2MOhFO6AswX0yn52JHoaszlJ4ty/eq u8W+FWGC6dcdxTElKjjkd6VwHeW4IDdcZptzCJFVsnj3qYyhgCewxUfmrnDfdalEbIopjAcMdy9q uiBJIy7Dg1QlAK8KxzUzSvGix5IXFDQ0W4LWFYzkAmrFtIiqTkACskTsQSThfT1pyO3lHYDljipQ 2jR/tu0hYozFm74qaHVrOdsKcMa5r7NmXaiktnmtCK2jtiJGHzCr5klYnlLt3ArXMciHAPXBq4jQ Qp95R61kW0krTGPO4cnBpLgLuBZMgHtQ1pYEjTe9iJwrcetNRnmbC/dx1rJuw72ytENqg80Wl7Ir LG6kehzSVNMbdjTlsJnBw+70GcUWto8JJK7WPoc1NHO24Ao4z6ip2mUbRkDLYFVaxN2Qz3UVsds5 2k9z0ppntVAYyLg+9Z2qsbueWNcFBgZ9xUNvEjQBH+8h4+lS4pK5SbNGXWoYvlhRnJ79qZ/bBHJi JrNl2lxt4xU6ldnSlzWQWJL3V55YGWFAjnuewpto9vdRBZwFlHXPeqZxIDjtTcHHTr3qr33FsbFm sEdwY2CsUXcpPYVVvNUEshx2NU9OjdZ5TI5bKYH0qU2GDjaWBFPbcDOeRGf5myTkmpYZGQY+8Aad LpSH7jFX7bu9VIndGKuMMOoNWrS2E20aCXKHv0rV0m8DyEbsgnJPvVC3IWAsoB3A5qOxiZmYwLs3 v0H8IqWraoE7mlfaiZZpIkP7tQeR3qghZ12lOoJFWRpcwkAJwCck1LNH5LgAdFqXOxSimUASJFVz gU+SAiQleRnpUd0N75UYqeJ/3O4nrU8zeoOKL1npMNxCHmG7PSqVzYnTZwob5HyVP9Kv6dqGzMcn 3QcKak1mCS6gUxqTtyQR2461uknHzM9UzGkulUtvbGOR708iG4COi9VDVRubZnhDFTlTg1p6clvL pyHzQsiAgr+NQ1pdF3IZLaN1JJZTjI5psaNbqV84sHPQnoBTpdytzkioJA7HKZ/GpTb0KsSXF/Db rjd83oKgkdrsGSJSUA5wOlCWUO3dIC0h7VbtZltiREgG48g4watJLYkp6bczRynbujQ9/WuktJ5m i3TLkDofUUtvHBIA6ovNWSvy4HSpbAi85dwzVlbiMAc1Umt/NGVOKpSiSDvn60oS5XdA4pl3UbnE aFOSG6e1RpKrnctVHkklkTK9BWhBb4jyRgmiTcmCSSKWoWhnjLRHbIOR71hQXzwSOl2uCOM11br8 uB2rmNejX7WhGAWTmnCzdmDbROt/bYJU7vYU5b0yL8iGsBGkhkzHjcR6V0FvLL9ljllAJbjircEh 8zYK8rDJBHpmnxzh8h2HXFKZDKhbGFUcmo4IkWJpWALdF+tIRagQebhV3NjgVbfTVdC0x3t+lZym VZPMUkHHUVZe5nZCwYZA4HrQkkhO5FdWKwsjKNu77xpplWOPYvJFRyXF46lThkIxgiq8Ucq5LAnJ p2DUuWumQTwgq+GzznrVK5tzHKcHhG2n+lSKzRodpIJxTfLkuMgKf7xOaQE1tnawzzUpXzd698dP xqok2xsPwwPNWQSj+YDkMKJIaZNHbIMD+I9akFtkYZODxmpoZIm2gY3N1qyZURcDnFZJyvYbMkxK rEDscUogaTCqhIrYiihC+Y6gFuTmoWuVaYRQqBzy1U1bVsla7EMcAs4y5GZDworUj6Ek5J61gas9 xHPFKD9wEj0NZ6a7cLch+FXPzJVw0E1c2tQQx7pU6EbazkuE+zSQMSGlIwfTmorXVpC3k3Y3xMT8 w7ZqrqMTpEk0TfKeAaFo7DtoXIkMT7kOO2avLqDxqA/NYenzypuWX5lfv6VflBdQQOABk1nK6dhl z+1gTho/yp7yW0ygYG5h0rMgjaVwe3T6VYn+z2bfITKyg9O1MBZFVWAjHAHNOi8+YkFSig9+uKXT 4Z5V8xxgschfSr8XBbPB5H40bAYl+scLjHVjgn6VWOSn0pdY3/bUXaeR+ppyI0mFVTn0qrWASBgq vnq4wKmT92qgelTWumNcFmcYCjCj3ont5PtbKOI1OAfWpbGiLcWkEY+83Aq6sFzA8fQp39qo+YBf IqYyrAZP1rbnuAgiBB+d9o9jUSbGQ6tF5rwqJDGQucZ4qKcxLHFbRnljk/hUV87TSTgZ3I3H0FJD aSxSrPLzgYFa3VjOwqxu1wY0dsgjvSXduUfdnpg4q7pqCa4lmxwOBT9QQMvHUGpGVJwTiXHyuMio Q3lg89a1dOCT2ZRgDsOKZc2EZOQdoPas3BrUaZmSTAxA5wajvCf7PiVOcuamu9OCqNre9FtDutpI 25ZCGXNNaahuZzM8Sru4XNWbBwJ/MI+UCpmCMAGAIpI1in8zblCi/hVXvqwSLscwnYiMZZRmhoQq +ZM2PYdqrWsn2GTMg+91q+5jkDZwRiqQmYt0ZIr3YkjmMjPXikFw+7AJAB4HvTrqQZGOT0BqSwh3 sTt3Ec4p3KtoRfZJBcfa9x8wnqT1q/dRm4tSuPm6j61Dqd4LciFkO7iks5WLFZD7ik77skzLN3tr +KRc8NyPbvWmIyjNIqnaTzUVw0MR4xvLZFaDMskCqv8AdpTdxrQgtoN86IR8lXyEs+W+4/AzVGCY +XuQ/MhwaXUbhruSCJF+UHcT6VMHrZikitPYpLd+bGuF6nFPu5VGxUBAUYrShi2oM1FcpGckgVbd wRmrMU5OcEZqM6jHv2BW468VYRGmnCKPlHelmCW8uGGVNCgmDkQtdxfiaa/mzMuwbVNSWtil1OzE 429K03tAFCDt3qfdTHdsxriJUUJ1Y85pIUUxlD2ORTr2B0uC7HKgYFEIxgmrbVtBWLUQVkRc5yNp qsqmOZkPVTinWaM85wflQ5qS8XN7kYywFNCY9RxT1601VZMBh1p1AGVdKY7QyNxvOBVWIZII6Dmr utyK3kxp0BJOKrWyZwB3p9LhuWry3f8AslHRcksc4qvp8uEKZ98VsandpYaUIcAyyDAHp71j6aiO /qcVC0jdj3NC0QPOu9sjqa1GgVomAPTisZwIX4OOeKsrdScAnjuR3pNcyC1jL1WzJdHAy7HBqNbW dowHY7ug+ldAyRzYcdqCibgpxVRk0rBbUxEtBHFg/eBzmnzSA26RqMMmTmr91Ax6EY9qypSIpCh6 01K4rELrI21F+85xW7pjfYrTbIPxrIgjlluoyn3R3rbmnjjtfKccgcmlN9ASMq7unuHJH3c1Zgi8 uAMPvHkCqkKCWTCjCLyTVhZgzkA9OKkoR0fG49aSMnv2q4rhVw4yD3qlOMDKng+lIC1HP5fIwR3F PMYeMyIOM8iqKnIOzk1YhneOMEngHJWmkA9TnjqOlOa2BTgfMelV/OXzTsztq3HcZUDvnn6UrNMC FgYOCeTxTnkG7DAEgd6ia789wqj5V5Zqh375BkVUtgRaijEjCPGRgk4q7AgK4wBgYFUYSwYFTg9K 0bZmZSuAPQ1k2WLBGI2G9QDjginahtS1IwMsRSTW/mncHO4dMGsvUrl3mZTwF4oirsllrTAAzueT 0FaZijMYBAya5u1ZxlgxHpit/TbVxZbpXLM5yM9hW7V0S9Bt1boto6Y4OOlZW0xyr5yHCnrWzex5 gYA1TuflhXzOWI5qIyQFw36Sri2IbpkelULuN1TLMRgcVFpbGC/4IKNxj0rbvokeA7uNtVJPcS0M KJHijJ685p0afLJzjNSA44AqOc4WoepaI/shjUM+SCcVKQgjAH3iKkjmZ4FBG4Hpiq1zkRMMYbjB 981DTbsMiQgMQaekLynCDIqzZ2qrGZp/u4JxVm0vbaZdkQwzHH0p3ewGaqPHKMcHOCK2xCUUZ7VT ikhFyokILE459c1rSIAg96bu0SUngSRTuXr3rKvNPU5zwezVvBOMHoagniUqwPJqVJx1HuZ2nWLC Mlmz7VuW9vHGo2KBWNJFcQx74m2qT6VLb6wY12zISRxuHStYu7uxNdjaKZHSmCJCcsoJ6VWg1W3m fyi4Ddqmu7yC0gaWVwAP1Na2i9TPVaGZrj2cVuYiMTP9wIOaqfZNkbBCSg9az7+X7XfLJHkbBlm7 E5zWsLlZ7MNDx6gd/apautCtimFlQbgpZRzxVuHVpCuwnv8AkKQXPlLGsilRJkYPtUCNbtMRKQF6 mou9ijT+0QCIAKC3euagnNvdvNGg3ZPB7A10Ftb2cyELKeT69qq3tlFES0WGBUke9JNrcBbO4e8j CygFt2M4oaJkcj1qW3vLS0jUOdrfx8dDWdfakt1KRat8g4Jp2dwuWXeFAAWAbvQHhKbS6msh8opI 6nqaYrM8eCM54OavlC50VhPHExi3fKeR9a0VlKkjtXO2OgPPCLiOTY3UL6VrQs8TCK5GGIwD2NZy S6AmaKcjrTXhVzzzTI2wBg5BFKJDnFRtuOxHJCI/uDJJAFaCrgD6VAh4yafvwCc9K1g0tSJXY1ly ze9ct4iQm7VQPlCf1rqyM4J6YrLurf7SXfZnJIFCVncZyCRsHBHaurhhIsbfI+bGcfWs9rNFmji2 EM7AZ7CtoyIilm4WJCf0onK40Yt4ZlzDEM45bHrRptpeMzB/9Xy2T64q9YgMHkcg+Yd1W2l8lT0A oTYyh5mxtjdRUiYNZl3cie48uLl/X0p8F08JxKNwBxkVTQXNQqOtNbGKRbiJow4YYzimyuo5HNQM bcwR28LSScjHBqvpAlaVjJwCtXyfNgCEZXFQWqtDdeW3TYCv5/8A16TEZ+rRiO+V84Vxz9RxT7e4 xH5bjK54q7qNus74YZBOc56cVVnsjbxRyQ5ZcfMO9apq2pDJbdkE6+aSqn+IVsPEkO0rzk9TzXN+ b5kfJ5Fa8GpxPHFDIQWCjJNRK6Q9y+0L3EoDtiMdqcyQQMqjG5jVCe4k25VsfSs6SSVmDEk4PrWS kmvMqzOnliSaIoyhlI71SXR7ZVP7tST6iqVnqbq4RjuWteK5R+jcjtWycXuRZozJ9FiyWjG09eOl YojllmEDn92jE4966ua6RYnJ6gVh3DRtLuThj6UnZbDT7kcaxB/LwMnOKnSZY3ELJlH71WgUfboS ehbBpsV6smrqxH7p3KAfpU2uyr6F2fbGVhgOfM5JHasxiFuI4e8jgYq5fRtaXe4ZwGzRDp3nzzXY bjd8h9BVJXFeyNmBRDE0jEEDniqiyHdufGwnHPY0WMRbTydzZJ5BqC63R2RUjqzDNJNPQVtSzLFG ZELKCQQVJqCW1dGMsRAyckelLpsonszHKcspIzVx22QkMu7A6jvU7uw9iidR+zWsjSdc5XHes9b+ WexMjfKzOwz7VC0ElzIcglQTgelWFg3QiLbgJ/Wm7JWGkWbGGKTa0qjzBg/X3qWUuJndm/dxvkCp rW3aMB3HKjiqeqyFIPK6s3LVktWULastxq6Ffun9eK3byASQMB29K5mF2hEbr95GGDXR21/FcxZB we4PaumKVmmZO97obbQrBHtj4B5qG4f9+kfXJNSxvhZOc7Tx9KoQh2vQXPrgVlaxSK9vqK2FxMki kIWxV2SVrlA6HAIyBWVq+DeJAAMs/wAx9q0LV91uyr99D09qctlYEUpbxoi8UpG9PXvU1m5eUK/y +YhFULgrPPLcvHnL4A9MUsVwY7pJHPB6GqavES3JiNpKmpLRN0rxDgyKcH3pLtdshcdG5qO3mEc6 PnlWBqL3QydnW5t2RxiZBkZ7jvVaC68soC3B4IrT1C02fv4/usOCO2a526iaOQe44q0JFy9jZG8x eUP6VLY3sdpJulbAYYqGyuwf3E/Q+tTTaWJpkw37vqafqN7DLiM6g8twScEkKPQCkgcyRrg4lQY+ orWEaxxiMDgCsq6gaKU3CnA7j2pXuIbcxiaIEjkd+4NaFt/qFOeQKzjMCMr0bqKtWiOq4PQ1MkNE DXC2t6yMTtk5/GrcAlLqY13Kxwfaqd3bG6i3qfniyD7it/TEWK3UHG7GTSlFXTFfQURnb83Wq13A WQ7etaO5RngVFIQVOBzUO99AKcaeRBxy2OTWdczb5NigZAwTV6efy43XGcjt2rEM5MvAyScVsrtC 6mlBMtsAw5bHNWDqLeX5mB1xis2QSxpl42x61AZg4+U/hWfK2Xct3twtwVK9COaht2LcGqyMSreo NXIQMg+1U1aIizpQzJLngZxVaFXmu8gkgHOaI5gglQnAYZzVhpEs7VUUfvGGc1aehPUu3KfKpHOK r9Rmq0MsxHLEg+tTr0oAxZ2WWViDlV4FPs3VJ493Cjk1KLLy13FTt60zKBs7c0rpjsRaiz6lcNMo IUABQfQU61RoSrEcinNdhOAoAqIXnOCucnAxT1egbDL1pJZwFOKuwZjt1Z2yRwRV8aQkiRs52tjJ NZV5a3EDEMG2549DTTT0JLqTbj8hqZZuMSDp3rnvOmjckZFXLW8eVgjLnPem4Dua5DSN97K1C9nG 05Zhn5aguJJbSPAP3ulURqNwNykg571KTewzSjuYY28tOPenyBZgWkA2isUsSvuKuW10JCkco+X+ dDiFxsszyMYrNPl7tjilsbNzuIZhLnoe9b0UEWwFVAHtU/kqoDBRkU27KwrmZPBLEoEg/EVSZPLb OMg9RXSzx+fa8jORXL3M8ttP5TLvHasY3uUCOEbHrTxKrHngVUMyyFsjbz3oNxEgAxkDqfStuW5J oBkIIA5xTbIh7na3C55qn9qixw3J6U+BirHAzu71HLZlIvSNG0zBAFjB/OlUJv4FQxqP4zTJLmG3 bJYZHbNRu7DvYtPItujueccD61PpVwWTDH5gawXuGnVV52hsmp4neNlKHrVclkLmuzqWxArSHoBk 1zNw7SliBlmNal7cMbLy2PLEVDpECTzkN0UUqa6jZFbxum0TptX1BroPtEZjUxOu3GBzST6ckgAB I44rDurJ4GKHKnrkd6proyb3Nh2XqzZ9qyryRpZG54xzVEzTQ4Bc49Kje7eQEKMA8GhRS2GT2kyf aFJOBvAB+lbst2tyWgc7dwBU+9czDGcqF4A6U6+knijBQ/MCOfSqdnoTY1Zg0TbH4NZl48kkhQE8 elbVhMLuEi4AMi4wfUVbS3hUkug+tQ9GUc9ardpInlFto7HpW0sf2mbMgAP90U2e4UhltlBx1PYV QWeS1hluHkBcjim2Br3coihMTQmQHgbRWFbW15ZEN93f82w8itOz1hJ40WVP33QY70ups5WFVPzl vm9uKSbTsA+GWC5AE9rhl/ixmrlzcpDbeYpyE7VXtUO3aQelPWISMVIz9aTYWC31S3nHDAH0NEt3 EvzbgR9axtStUhuwka4yB8vvUkeirId8kp2dxuoaTBF9dRhdduRioFuLJ9wkK96c9oltBtgVSpNY mqWCxSqyx4Rxk+xqopMDTV7IqP3inGeM1RuGieQMGMgU8Bjmq1nDCvyrEuWHORnFWovLifG0AD2p yaWw0rk6R7lXeoAPTAxT02RMYwcKTnFNknBXg1ExL/eHArO0mPRBJKI5BvYHAO1fSo41Vle4K4YY 49/Smm0E0qYY5zmrG4rMoYcBgfritVZIkkngby1P3SwB44qukchQ7mJHpV6edp5tzgAZ7VXlcmXY o4akhiSW0d8VNxwRwCDVqPw+ioRDMeSDyKfb2zRLvm7DgVfthIioJDnIpcwmjA1SxltIHLpuB6MO laHh/wAq5h8uWIBlXk+takjnG2VAyVmS27W0vnWZBjYdM9Kd09xam5HFHAmE4X0rM1dzJGqwBmfd /CKdpDT3ReS6PCHaqjp9a1gqjoBWig5LTRE35Wc3YzT2xMd1E4T+FiOla0MkcmMYNXioYYIzVK4s guZLf5XHOOxqZU2tRqaY/gZApqoWY+lQ28ouEOOHHUGrgxHFljgetQoXG3YqahcNDGI06t39KIL2 P5Y8Y7Cqt6T5vzdCOKIyIkZj0xkH0NLn1Hy6E926rhgMtnise7eW6k+yRnou6Q/0q1BK9y24jA42 iks4BbCRpW3SO5p6BsZEc9xaMc8DP3TSXN5ctgyKyp1+orYvtLN3ESqnzB0460wQXAtil1CBHGOG H8qq/URj2qtJukUY4/qKuSBQh9TVSHzYJ2jkUqMdx2qSWYYoldvQEPjmXODjcKueYcAOCB2rOtI4 nl3yAnHb1Fa8sqShMcYUKPoKTYx/2tLeDB5OM4FUW1Fnu7dghGxjn/dNPkgJjWcNgspTFVI7dlYE nczenYUXTCxt3yBQjDoearh94HOQKswSeZaoH5wMVl/ZX89xExXaeB61O6AW6tg3zR8MfTvVOVZM jeuMdxWiIbgKOhxzTdsrHaRz6GnGTWgmimssijAfNTQXAVgJehPWr40UOm/zNrntWPexy2c3lyrk dQRVOMZApNFwxlGMkR3Acilt7ot5gLYdT61mx3rQxusZyPQ9q1LW0DWiyMB5jA5PqCKzcHFalJq5 SbUnbfuY5PFSQuWINVrq3ZYdoTp1NSWLg/KfTFW7WuhF0Eo6t3Vgar6jbNbXBaFSQH3r+ealdiwr UDCWOOQrkbBn3qb21AluDFdxRsR85QOV74qPTSArwqcxkk/QVlXT3EF4HLHbj92R6elW9IuBJLKD gY6YpyuldCSNRAEPlp93JyKhVC5Kv8yliMUz7T++YdwaXS7jzJMPw3UA1nEb0JEsYrKKaZc5PQel UwzdCxIrS1NsRovYnNZ0SFn9q3klEUXdFG4uTas5TLHOVGOtVbfUJ352gZbJroGtoZSVZcfLgVii E6ZdlpBvjYdexqbRfQE7G893GiAkjJHFYt7ItxIzA5pLybY6HGYmYH6DvVYjyJJI+pVjg+o7VMYJ FNkzPti29ec1u6fFGtmjEfeGTXPN29K6G1YfZFU8YHFDVhDI5FV5Uxtwcj3FRwSo12zAjIGKmuUg MeZW2FhgHpWLbDyLibaSVY8N60uXS4XEuZkk1wt/CePyq9BkXLY6EZ4qg1v5l2H/ABq4m4MrjoOK cmnsCH3ESq2FHXmsu8iAQ4+6f0rXv+kEyH92cqfr2rPnHmKwx1qoiY+1kNzaJuOXQbTVV0+Y49ea ordyW0zJtwO9XxdLKRKg4z81Pks9BXNrTr+Jrf7NcnBXjmqOqW8bgrEwJzwfSqU75cvyCauWCCVl Rm5YdamSaVxplOz02eWcB/u/3q3BB9lTG7I71Otk+NofaB6UGwQghpSfxpXbC5XckoWjIzVKWQkN DcLgsODVqeP7ORsJK1BKiXMZU/exwfSqQGL80Eux+QelbljzArE845rHggEt6LeTd97qewroEtDE MA7hSqdgRmlik7Y+63WtWKZECeWd4I4qhNEY7gEjg4rVsrRU/eY5PSj4ooTdmUTM7Ps+Yc9KdJOb dDuPzHoKvTFYS74HFc7dzFnLuaVrMa1FN06KRnOSetV0UE5PSpDBMUVwnDcjNOaCXYN2B9KNWBL9 sLWzwHkhsqfbFZ8tszgvGDkdcVdS0YYPPNWrdVSTaxHzDiqTsBk2iMykt2NX1OIycdRiobqSOG4a POCTmnPIThFHTrUyuxkEiloyvfFaepKv2e1YddoGfwqiyExs3oKtTvvsYQT9xgP0q4ksWIfKKlFR pwop4psCm95K6FMjB7YrNleVpljTHNMtJ9sh849B39as2oBm+0Y78CjlsxkZhVG+fnNKYypG0DaO RVieMSBgOvY1DAzEFJD8woi7iLcurTMiIV5U9u9Tya2JYgksGTWfsGTnrSHbnB6mq0EabRWN3sZc Ix6rUdxpbiRJLPHB5HpWXL+7dWXIbNXlv3JQRy7WbrU2fQZHfs0n3ztdRgg+tZmcdq0dRs55JzI5 BYgdO9ZXkyvJsGcniqjYCwrA5z1p0KjzAD69q0dP0PaA1wST6Vent7K0ImchQvYmpc1eyGNtJWjX aN233FTjUGY7UXOOtZlzrcchKxDCnpxVOG5kSXehOc5alZvcR2NlOHiYOMbfWubuSsmpyTKcrv4+ lX0v45NOmYna2Me+ayVkV12R/eJqR2KlzZzvNI0Sl1ZicAVcg0smCNplfB9egrVsYmij2ScqR96t RE2QwRhNyljk1blpYnZnOf2LbsjyLwUxj3psltMzb40JQcZrrDaQkEbQPpVW5VBbeXD8iscNxyKl 3W479jl2jlLfM23PYc0+HSluS+H/AHij+KtzT7OCAlpmDntntUdzaxzXDTRsUx6Uc6Q7NmFIn2DH nocntitSzSKVVPkMqkZyRVyOFplUXSrIo7kVd3IEEcahR9KUnFrUFcxNTZnkURRkKo5Y9Kdo8sa3 bQoRnbnPq1aV3bfakjh6J3A70g0K3jG63JjcdCD0pwtbQUmacbhwPXFK8aTIQ65+tYyzXNhfAXTB omH3gOBWykqsoZSCD6VommtSWYGpaa0QMiKSuenpWZ5Slvu4z1rtXwV5xiuZ1CBIrnKNnLdPSs5r lKi7lDAUjb2p0nzHJqQR55pCgLtntWdyxScJlSykDHB6VKGlWELLMzZGT24qBkLfN0pszsseGOcm qvdWETxuOI1PynrVe8Pm/KB8gNLDyOOopfvYRfvE0uoy3pVn5bC4f0+UVPO6iVnbkICaLfeigOeE GMVSSX7VJKM43E49wKhJylcp6Is3OrtaW4cRD5iAOauWeopcBWKFAy8EmsjbIZfLlhMsSc/T3qdQ Y38pYj1HfgZrb3UtTPdj9RDSX8pLDC42Y/WprOB5tLuAeGzkE+1MKRgnvg8k1ctJ444pInbAcdax Uk3qU4tIyPtpgXyXbHerUU6XQMcwBVhgVh39u5unfdu54xVi1keGTL845q+VJaMLj0ixeSRxc7c4 qK4hn88blKqT1q/pkAuLmSfJBBPHrVjV58hYlXjqTVLQL3MxeEOT0OKazk9Txilc7+R3PNLGGIO1 enrVIGOSCWKVUIYMMEfSr81v8oj3BsfNmoHuZJChIAwuM1PMVhizuB4oZOpXkkaA+WRux0xzV/Tr cCH7RMACRkZ7CqenReZIZ5hkknAPpirOpSukVrFD91mAbHYVPWwy4oNxKGYYUfdFWtoBxnkVXt3y ByOKsFcc96l7gNZWYcnFV5YNsLEdcE4qZp1V9pIpJLmLaTnNAFayu0DeUDhh1FXxIwxzXKai4F35 sBKv3rWsL8yRL5vccGhxa1QaM2Un5w351K5OBiqJYdqmhkyQprSFV/DIlx6oZPEqSeYmAx61SmuH aZYeqqQT71oSFBkN6E1SMaXCebAdr4wD61DdmNbC6iFZYWHQZWsm+uWRBEx2qTlj7VbM25HjmzvU 7v6Vjaoslw/nYzGPlGO2OtC1ZWyNPRZ0uBMucMpBT6VoWls00+6VcBD37nNYFgfImiYHHIB+ma7I /Jgjoa1UVciTH4AqvekC2cEZyMYqVpVUEntVG+n3bFHRj/8AXp1JxtZExi7lDyhJywGRwKpXtgro 0kJww6itANxn3qGRsHI/GuZM1ZJotpAbTEmDMSaddaW0bK0fK5+YD0qvIPlzHwy9COtRm6uk585j 7HmtE01qKxAZg+UOVx2NPhXb8+cHFNkYXC/vU5xwy8GotrxjaCSPejQZs26qbXKHjtUTcTFum6s6 O9kjhMSjGCcn1FWYP38bMJOc4we1JqwIvHK1BI4Az3q4E+QAkZxzVWaLPK9qSGXLWdLgbg35dqr3 8EV5CACpcE8+1ZXl3FnI8sCttcc5FWJbhVJVOTVt9USkVbXSszv5itwAVYdj7/pWn5UiYzx7dqLG 5ZCGkHytw1a7xrMg2/dIpO80J6Mx5Y0kTaw5rPktPs+WXpuz9M1sy25jDcZGKpuN6urDKjqazTaG Ud3AFXYS7aUu0gbWKk+ncVnciUoeSOlWbZ2NldwnglNy/UVqhMigklnb7PKm8KMKDWrY2sNm8aBT ucZOfpWJo6XhvY7lwRFzye9dHMUmKuhwyClPewIGs03+co45JFVRGsVz5iDBBB4qzJdARFUOMd6p w7mYkn71ZjNC8cSNH3yuarWjJ9saNjjK5FSRMGuIwp+4o5qHVHt4Zwy/exyRWqu1cXkWruSOOMsS ABWLetHcwRSSZByQR2p4SW5+Z8hc8A1aFirqAeUHQVCdh2Ktpb74RvGRngHtUd5GqzLxyVx+Vayq kKYHasq8VpZhIWCjsKcXd3BlVsitQXWIVAPQVQ8tgNzjvgCn7TxTlJAkSzTPcFS4GFGAKiMuFzjj 1pruFzj0qq0p247Gp1Yy8jq53r1qwCUG0/dNUNOJeV1I+XFaMgwgU9RTasFwmja4spYlOCV3r9RV K0bzovm4YDmrUD7mwD/Dg1SSeJLgbCRzhgRVQ2sJkd5aqxD45FVFTyJgo4ViK3NquWU1Su7RwuVG 5cEjHbFXcVi7bWKXUSyk5U9hVm6tFtvLMfGFxVbw9OSWgPbke1aOrttjVRy56Cos9RFA6jcxx7Qy ntk1Npdu0n7yRmJPXJrFuGljO2RSDXUaUn+jK3qKSu9Aeg+8thLCEU7cd6wriKS2PXI9q6FnUtgE VWvYQUJxnAq3voJGCB5gZsYbI5rZtn2qqSdccVjTnyTx901srJHc28UgIDDGawmmaDdQUFVYYyKu WsytGoB6CqbFbiI5B44JptrG0Lgg53DGKdO8VqTJJjtUDGPIJz7elc1cZZwJAcdTiujluNs0ltIM 5UEH0qjcwIITxjitOokTJJ5tlEu3kKBUDI0cZ3dau6ZdWs1oikgOq4NSvBFcL+5kB9azsyrlK3bf AM9BnFV5I/NYKW27TkGpYkeJmjPAzxUN8mwLu55zxVoQ2bSgxDu5Y9j6VCoNu5EvzL61P9sKqNvQ DvQGMnVetF31HYq3F8rI0UYPPer/AJYktNw6bQwrKvoxFchcdRWtYNjTzn0xV2VtCeoRj5BTxTU+ 6KcKQGQLBGiWWRsFuauWMKAGXqoOFBpkrRFvJ3AccCoEujDbtAx6E7SKerAvSWxWLd1wcVnzR8b1 4atLR2NzDIkhyT2qvMpR2U9qjZgZPnXCy7c5qR5wjkOPmXvT5ODkdjVGdHdi3rzWq97cRYnuVk5U c4qxa6dcCIO4C5GaoWUDNIJG4QHv3rWluJZABuOKJe7oh7gvnGdAX3MOBWrb2UVu/mzYD1QtgLZT NMQMcjNVZ9Ta7kxuKpnn1NZayYzTvtWEe9bf5mA5PYVzVzNJPJmRy7deTWnqEa29qnkg4fv1qjBb liC3etUlEW5FFEzMABV5FaLCJyTSsNkiRxjLY59q0dPsAz73OcdTQ5X3Aqi2lVCW5B6io40jU55X 3rT1G6SDCIMtjoKzbUG6DLna68/WoWo9ixbXUioVVyx962ba+EdkolzvOdvFYnk+XMok4z6d6uaj OqxRhBgg8VLfQe5owTSMAzEkqc8VM05nViFABqnpLhz879RV2CJkldTjZk4rNprS4aXKUiSAgDjP eligbcQzVoXaosG7uKy/tRWXDjip5WnYtO6Lke1SRn6UBtjYPOKcLfzAkkbcVWaYpO6nBbOTVNEo c0zlsrwRU6Xcm1dgyxwMVTuZVZsAgfSlgMkUyBuB1q43BmlJGLhWWZQVFY8s8mkyDYC8TdAe3tW9 HIsi5TvUVyqNs3KG5/pV2tqZnNPrV9duuV8mIdh1NSowb7/JPc1NdusxPlRABSVNUUbe2M4PSom+ YtFsqF6HIqEY8w+uadGdy4HUUxlI5rNaDJHA3YI6VWvIwQefep0cupPpUUw+Un2pp6gVoXYfd6it SygCMJpOuOBWNESXGM5Nb1uWZFLDGOPwq6miHEddsRbsRwW4FYSs0MojGQV4B9K0tXuAERM8ls8e 1U44Xu7hXK7VJySe9FNWQpm1YXiT2spdNrJgN6mqv2gm4Dt0JwB6CmTBrKUSqN0cnDr/AFqC8csq rEvzN6VEk3IcbIU3A8sD6/zqJnbPDGm+TMiBWjI9zVyzWNWAlXLepqlAOYognOAD7k1pR26R28Uj rkSZqaS2RLoK4BjccVNdRn7D5UI3bSNn9aGrEtmdMslncxy2i8OCW96S7uP7QkUKNjKvzCpkF3Co M0R2Dv6UpjEd4kmBiRc1V+jEtyIQLHGCo68mo2YRhjnNWLh9oKnsf0rPlC7uScGiLL6AJS+UQEkc n2q5bbUX9+N3H4VNY26fZ3lwNu3j3xTGsWaBhHKNw9elUybmjAilV2YKkdaz72TFwkanoD+earRS 3EBZc428EZ4qAzlDuPLE9aztZjJGmu7VS0UhfuQasWesXlzhTEFHds04KJEUlcEjNSwRIjEAYGab loCVx6xebJvckse9TeRHGo6/nUFxM8BBQArVaW9J5zUWkytCtewtLfLHEOG9KtTwnTYDHIm9HI59 D60aMzT6pufnYDWxqNuL0C36c5zWmqM3uY0OpiPCMSR6mtVLpHQFWrlp0KXhjH8BKkVdty6YwePS iUFuNO5rXFwJZTEX2/LyfrUflSwR4VvlJytVNu6QyScBuc1pm6iaycMQrKpwTUW6FPQc0KXICrgS bcsayUjaz3QTZKMSSG559RUGm6ulqp89ZHkdskjnjFbYMOpW3mFGA7EjFXy8pNzDmtxGpIbcnUVf tfETBVjeLftX7wNQy6eXR1WTlegzWWI2tpSHGFUYNXFgzs4ytzbpKvU9azLm4BmKg4aM5NR2F75e zDZQjBH9aqMoa5kOc7jmspJNjV0X1PmqNvJHP1FNfDDpUEMpt5kDH5Tx9K1biBHAdOD1qfMDL6ZA NIoDcN+dTSKMkEVDJ1OOOapAMKfvML0p3JByuQDjNByC1NG8Bdp+UmqEP8uJR83BNRiFRnYxB9RS 9X59KeFz93ii4ArCLDZbcO+481YguGLByAR6Gq2ARzyc0qkoMDpSYGul3C+UlAGR0NQfYLcOXX8q zjIzoOATnFSq88KjnOaHroCRLKqx3Mi544bHpVuzvAjBGPyngGqE0DyO0yOCzADbmqpk3HY2V9RS V07oejOodQwz1BrPu7VgjGMcEciora5mG3Yd0Sjkmr0k+0ZPCkf0qm4yZFmjBuoVWK3KfeKksffN QWytuOT93rVgxsyn1zUsSmOKRSv3jyabdkUkBlO1UUfKOABUynIOeKhiBU80rMc4Hes9yrBJ8+FF BPlsuOlBCwqxc81WkuwwCgZNJXuFi4hycJkk9hVWdvLvYVcBgeWFT2sqpbSMnM7ZwB2FZ5YeV5zA mQDA5/Wt9CNTYjO4Z9elWeETr0rnodYaNkwm5V4ODVp5nntmbeVzgj86xdNplXJ5rrFztK7o/Qet VLK2M+oM82Qi8oCaYzNJIrpyAeav5R1DJ8p74qlohFfUnEboAeKotdksBHVye0M/LOc1CunFJAFI ye9EUluNssKsX9mB+DIWJNU5NrdFxSz289tkg709KsxiN4UK8kjJqlZak6lSOUxjaDgk9am+0yL9 7n3pZY1KgqOQeaqySsTjtnFaWRJZt58TDHQnBpNSAV1wP4sg+2KrA7JCMjPrV5h9otUcnO1ualqz uhpi27F2AJ5Aqy7mJCMblYEfTNV7dcShuw61ovDvD49OKi+pTMzSy0OoLtH3hg1sShZZldhkj9Kz 7UrDPuarDXKWzxbzzIwX6UtWxPQr6tsk2kAZHFXLeSVIkjRsDGax7+byppkHOCcVPY30n2JAykzA YIxTs0Aye7ltZvlYnJ701tWuG3DjFRyw3Nw5JQiqzwvGSrAg+9XFoBk1y8nDcCrGnyOSirIeWxiq z2+ADzToU8qTcCQc0OzGdXGBEioehHJpoIV+DytYdxqssS7CoYHoc9KlgZ3j3Fmyc9TRJaEINSuh BqYkY/Iy7aW6uBPCkcXLPwD6VXv7WSezGBudDx7in6XaPDCpkzu9+1S7WuUWrO0jgh2ADPc+tZl1 PLY3fmQkgZzj1rWZSpLZ/CsPUHEk2M9KUXd6gzQluRcwCVH2kdveoCzyHLsT9ao2fM23PBFXywBx 6UPTQpIRlyVWra9QMdKqI5aZQPWr23A96lsGQX9sJkEo+8o/Sm2rMIdnYnNWpD+5b6VBCMLVxeli WiYdKWgGimIwbi0lSVGL5Dd6mezwuc/NWnJama0Vo+Tjn2rIWeRVVXJZj09qq7YkWNPuDY3G5+mM VYup0mlLxkEMKgt4Q/MoyTVedFtSXGcE8VL1dihjHEhDdPSo7hg5CxcZNJKJpmDFCFPIIFS2lqzP nn8arZXESQxEqEUE4GKuxW3lruf5m7KOtXorYW9v8gDTtgj2qSwsDHP50025znjtWW+4zJn02+vX LSfKOy+lOj8PXAI5ArpwV3E5pVlVh8q/nVc1tELUyf7KeWBI5cHbUkOlQxcHk+9aO1+u8fSqU6Yb 7+GJzmpcrjSK40pElZwRljzT7mVbSLYo+Y8AetOZZ48MnzjuDTJFW4xKykFGxz1ouBRFuWVnl5dq rW8LK5ZG2lTWrdgCFCvc81kStKtyUiBbPYUk22M1YJYGYeePnXp71Fc2jXU+IzgDms03oA2vG+5M g4HerFjqnCiQbWHeq5XuK5Zit5rI4bnnt2qy+peSnzHJNTRzJcYyQR61marASxlJAiUfL7mla71H clOp+YpzJ+FQtexnqwrFS4hAw1Ruyv0PWr9kHMdGurRpaCMOQd2eDWbeapNcXLPGu0GqUSBBuxmn okzMNufyquVLcVywL6VYwPLYt61HJfXkhG92wOMe1WlaaJcEK59MVLEJnl2tBz7ChNLYT1FstUlh IzuH8q001ETvkuAM0yW2VF+ZOcelUDFGz7TlDU3TAt3CiMvJC4Ks2fxrKaRjcHsGJq/Dp4kPMhIz xS3ViioQp2kHrU2SHcSPamFHPvTwQVbPWq6KyOFft3p3LMfQVnYZJbj5CD60y4X5Wx0qTJwAtRSk 7STwCKW7GVYOZS7KAFXAx7V0Y2m1RgACVFc3E6hzz1zxW7asXt1yelOoOJWEEUt0XlIxH61Wnv4m u0SHG0A5qjfxySzyvFI4GTwDgYqTSLFZbpDK2ARj8K2jFWJb1HSXjyk787Nxx+daVs0Uvzom096v Polo6ht+PcGobm0SyQNFJnPFEnZbCWoTXEZVl2hgOp9KqCIyy4U9Bmqvm7yUTkZyT7U4TND8yHFQ rlaFi4vPLjj8znB2k+1aFhqFq6KisCfesIzrJIDMocYPynpUYhCkFMg8YIqnYVjtUdJFxgEGuZ8T JPZzwywDEOMZ7A1Z027kjkEc3935T60a9K9yIYkYBVJLjrnjirjJNakWs9DIhvPPQvJ94frUazLL dIhBCk8mra24RPVj+taOn6JuInujgHovpUppvQtuyGsBHpywox+TqfUVnh3gTarkhu9a2uSRpGqK PnLYGKyDZzyKrFSozxSb7iQp+UfMevaligM/AQkZrQttJGwPI2cc49av281vaJt28k56VOlyiG4s zBYxyDkouG+marRSB1ZR1BrWN4kknkMpKtxmsJrSVLqTymACMRj1FE1G10KN09Sec4j5Gafb2lm1 6iscsy5x2zTJIJzGHC7xjOBUVjDI+bnO2WJuEPU04hIXSVCalduOFViP1/8ArVI99ibe0m1skj2q AymOSZVBUyPk/TFN1UI1pC4GHZv5dalt81hpaGY7+deO56SSZ/CthYImh6896p2VgbmVSo6Hmp7h ZLaUocjDfmKuWokaESK8ax4B7VnX8Ajlmj3ZVFzj3rW0wpIwU9vmFYz2tylzJGVyzuSPz60oq2o2 9bEGmWQmPmy8nqq+tdHLKFj2j5UUZKgVDbwRWSKjEb+hNQXtxul2oMYGSx70nJtgkPuo2aNWhT94 SCMHGKjm0iS6j3MwViORU9rHJO0TGTaoJYj19K1UkQj7wyOopxi31E3Y5dNFv4ZMR7WT3NSPYXMM atIP3g447iulaeJPvMB9ap3Wr2cIwzbz6AZrRxv1JUmZqaazwF5gS3YA1Cl1dw7lkhfYvAJ9K1rP WLe7woVk3EjkVeVY3QHgj1oULi5mc9BL5o+Y9aVwqkZGa1HNhJIVzGWXg47VVeziZyYpsD0PNRJF JlE4YHawz6U0h8cDhatNpBb5xcgZ9qiOnsuVF0OfbrSsVdBsZkDbPxp3luCPkODTos2tu7CTdtyc HvSx6vuHCqfQZpWAjW3mxkITzmntay45AAIq3FqKEcjFQ3d0JkRUOdzY47VOoIrW8axxFW5dm4qw +CuKrID5wUjG3v61a2hlzSKGK+3g8iqOqBGhVwSHDADHpVtlweOc1NFpxkw7jPpVollmLbb2KqBk kfnxVK4uy6lMfKTT5W8nKSE5U5X6VQuCSSMYPpUDSL8YUwFyRhOoqZmjNptAzk5zWVauyxsjKSZD z9Kfc3HkRrGDg1p0FYk80K2SOBUE0rRTBiMKy5AotZVuZgrdByan1CNpkARRweDUrcGUXma6uVOD sHartrZg/MwBp1rZhMcfU1ad1QYBAxSlK2iGl3EeJYIJXXG4IcVgqxdSj9OmK1bmffAVUdeprOUY bJHeqjtqJ6MsJpCG0aWNs/LkYqrlvKQBsKRU1veGDKrnHcUxikqeWRs9DV+pI61byZFLfdParb/I AQflPNUE+ZFw3KnH5VpTX0O0GRcgrUjZH56lRzinpIoYFuo71WM9pJwAcfyqESsHZcZA5Bp2A0pZ o3Ta33/5is1WNvMWXlT2pGLMdxPNRwxu92qBvkxk5pqwNEq3ILlF6sOlQyH5ijjGDVncgmxGBgcZ x1p9zKrqodFOOOeKXNd2Fyme+GOas2cvzGM8qw/Wo5GhZMxgqy8FTTrJVZ2z1HSrb0JtqacCZ3Ad gKuCQ7m9AKqRMEBx360+OXO7NZFiSxEsCo4NUryJpHG/J29KvmQrgDnFRuVf7wwaeoihCsb3geY5 35znsa2I7i0TptB+lYV2hjfgdahVzyp59Kdr6gdWl3bNxlc0rC1kYFlUmuXyVXvk1LHNKkigEkYq bBY6G7S2itW3xgLj0rl3mAcnaQvY1qXE7zRhZSCqnOBVCXDw7QoUk4poZVYtNGHUZAbmtSzmiPEx 2jpipLK0SO1AA6E9e9RXMMLSAbfmptpgaAkhUjaQVp6MjnGRVNUTyeBgGqjzG2lBJ+UnkVnyjL92 jKDt6Vl6fYreagyNkqOWrT8/z4cryB3pmmzRW92c8eYMZ96pNrQT2K+taWlpAktsMbeDisKO8kRs N82SPwruLuMTQMh5BHQ1ys2nRxz8nCg8itYtW1I1LtqiqwZj16Vo2yCcnJ4FYzt+8+Q/KKswXTQs xXnPOKjl6lXLWoKIVOOhqujDaKpSXct1IdxwuelW4fu4NXyk36EwNPHNMXAqRTSGO0WQSyyxnsKy pIFhvXZuATirung22oKezcGl1uDafNAyN3NSmLqVtmOlMkiDxkNzUO90AIOVqZZMjaaTi0XcmgRn gUBegxThEykEj8BV+GMCFS3C4qCa5B+WNR9TSeoEyq3l/NTFxu+Zjj2qs8rAfM+ai+0gH1oUQuaL T/LtQYFNF4yjpmqaySSZA4FKpEAy3JPc07LqBeF4eDINopkWqWbylZGAYHAJrMkk818OTsNSJYw7 y2Mj9KaihGtLeW5X5ZB+BpkMyS/LwSPesSVoluPJRRnGTjtTdPUvfEDIA680cltQudEdrkxsMnFY lxK1heOxXc3JrWsyokdx/CcEmsTWHEl7n1HNCWojO+0Mzs20kk5pxlLJ5YTBNaMKJBaISAS3PPar WmWn2icS43KP1q20CLGjaa8cHmTuVLdFq7qWlC+sPKRsMDlSatpCxPz/AJVPnZz2Aqd3cDz2fRru 3jeSWMBVOMmkt7JmRpCOF74ra8Tal5xW1h6Zy2KzobhpLcW5IQL8xPrWilJoViKMrtwa1LKWNQFb FZkUEk0jLENwHftViOzug54HHvUTSaKiblvaQzSb+K1Ejji6AZNc3bi7iPyqa0UivpQHdxHxjFZc vYbJ7mdGLjOCvBNRQWsd9HgYYKOvvVaWxWOOSSaclyDjnqak0G/ijJgkIVj6+tVGGonsQXOmXFud 0DsDnpVW4muQpSeEkD+IV09/cxW9u8zkcdPeobe6tLqHcSo7YNOzQrnPJexzKkQUhx1JqbowHY1W 1+Szhu41tmBkH3gtMgut3DHoKUou17FIv+YBjA6VDPJvTGw+1OiQyMqL1bpV+3thCT5mC/XntWaG UtPsMBWdfmLZA71oSHy5mVV684FXIpYUK93binTmGAPO/UDk1bTYr2Ofkt/KgYZ+Y5Le1ZqBygcN 8vAFWZ78z7/LBy7E/h/+qooonC88DHAq9hD2vJvLCvIdg96ljjMi+YWPPGSaZHEgwzgN9fWnzSHI GeBQ9QuRJFsJKE1JwzbD260wbm+7wfWrKwqWDhs7V5x+tHUZRuMRylR1xTvN2hQKJrV5rqRlb7oB A9ajZH3BDxjii0WGpo2su/G7qOlPlffJuPHPSs1C6Nn0q8jCaMt3qGrbDRt6bZI0SztyT0FaZTI5 7VU0lgbCIegIq7XTCKcTGTdznL2WEa4RcYWOKMEZ7mmXeswy4jjGFFVdci87WJOePlH6UpsVCBnb A7VhKKNYvQfDfsp+QZA6GnKzXExcsEx2NVV8tDxzg1KLhDkDilZDuWrhJIlRvMJ7dKfGTnB/i5J9 apNMZE27sgc1ehcbQe+KznoBYtJiHZM/KKTVgIwsiowZj95exrMkuJIZQ7cBu1b8E6TwYIByvAPe iGjFI515wka+ZlpGwxJ+pqrf3ReWGLGdgLfnSXiPFKA4wy8EVC0W9jImS23JrVJXuF9DofDr/K27 u3FXdZthJF5uPugg/Ss3w5+8gUDqrZrdvk8yymU90NapXTRm9Gc5p9wwkUR5L+grZD7R5k5HmYxg VhabvtZXYjPmj5D6VfkurdE3Tt8wHfrXPLsjXcZIxnbzWP7tfmPvWZeXI1CVIoW2qGxn1pNVv2uo /JtwUhHX1as6FwkiYGCuMVUY2V2DZtXc88iFYiYcDg9M+1S6ChIlmlZnOQAWOag8ucQCUDe0mQFI zkU6wvIra1dGBQhj8p61Td1oSjQvp/LzsADY4x1rn2hleQM7dTzVsTNKxkY9f0qNXJlC9ietJOwz QgCpCFQdO9WHn3WJUMQSCKowEglc5Y1d2rtKPwcZqb6gyO1AhYx4GxvWr32ePGdq9PShrMSYB6EY yKyrqS7tJxFNIVj7EcA1adxMs3KxIcMy/TNVGeOBsr16g1VVxMR/FnjNB5+9yccUxErzKYgpywHT 61SNsXkLhyCew4pXJBIH3adFLsODR00H1HpasxGGY1rw2HkWnnNnI6Vm2czfbYkQjDtg102ocWLh eoAwKzauO5jZbcW7VYRwoyBkEYxVGGcbyvfNaVvb4iWV22qTxmpTGxJHFvavcuM44Qepp+kTvcRl XbJQVm61dyTuEjX9wh7dz61U0+6ksphMHyh4Za0SJZv38iQsfk3cd6zxPFKQf4sY2nqKp6pqQubj fASF6EGm2jH7xQhmGVpSgOLNN2SK6R8/dTkVnXIW5uNygncOnvVpo2kiwIyHzwSals4Y7UF3O5qh KxVwh0+OKJW3EOOvvU8QTJLHgetNmuUxlyAKQRmQZ6Ke1GwBLepnZEM9s1WWFnfc7E89KlliWP5E 7UsSnDEmkhjTEuWVuhHFU7hPKJA5FaBYMoHeqcnzNj3pxYmiiFMj4TljU8lpIsfAJxzmrWnW6m9b ocgD6VprtaJ2/gzge4q3K70JWhziZRDkYOcmnSoZHPPHFLeShidvTkU2Mk7CT6UnpqMeLeRRwnSk aVFGDwa6O1jLR4mjAPrWdqmlA7pEHbjFEZX3EZJywJJ4qSzDMXzwDimWkMksnz/Kq9jWgypHGVAx ilOVtENEKqqtSSqCVPvQ7AsB+tS7Q1uHA/j/AEpLTUZVnt22losAn1qNs2qjn6mtMrvUAelV5Yhs 3yY+VuAe5rWLvoQ9Cob1ggK4Zj0GetWra8Egw67W6VQlKl9yrwOhxT/L+Rtp5HIptJD3NdWUHJYU j4Y5BrGjeR+DuyKkRpY3BBfHoagC9OQmx3Ge1UJfLWQEHGT0qy8xlADA8VE8SuhJHNO6AmldJXQx jPHNWRAqxZJGSKoWCyJIFC5zWoxSP5ZF/wDrVNrPQCpNBLEoDAhW5BqARiSdSSQFH610sbxXmnjA BC/KfasG8QxIUTr3NU9GJM0pSI9O89RkqvIFZemlr15i5O5cFRWto6/adMKS9CSKo2lm2nas8Zfc jplTQlZBce58pdpHQ4qjtjuJCGbkHpVrWJTDI4AyW6VgJMyzA9zTUdLgmX5mksyTGflPUU/aQuSf mPzCkuSZbYjGGxVZLjhd56DFJLqUdXGTLbK+fvDNYt1bzmRmKEjtWosklnartj8yMLnI61AutQy4 DRsPbFO76EWMQlgcFSPrVmyUNcKCeuR+lak4hmh3qh59qq2lgv2yNlJHORUN3KM9oTHKRjHNWY88 Ve1qAJ5cijGeDVCI1rF3Rm1qWFqVajWpBSGVyXbDY6d61bmIXWn88lk5+tUCAARV3T5gYjExzWcH fQbOXjZkmKscgdqsSTRrIoC5YfwimalELfVHUcBuaZBtS482VSxJrYSNYSO9uvmHHtVWe7hQ4LDd 6DrVfUb0n5YeAf4qowlWcGUEn1FJRQ9S4zSynI+VP1p0AIlCrzUm+38htjEH0NVkleN9y02uwjWD Kr8DHrTLqWPCkYz6VntcySPnGD9KaySOc857VPKO5PJMh+XFOjlcQ/KTiqnkP941ZgDIuSPl707K wXuTWcaSbgigknJJ61djt0g3MNoZqzpEIOIWIyeoos+bx1kYtheAxzzU8o7mqJU2sm0+pI71TGmm 6umcg7DWlGm8hiABtq3CQGC4xWbdgtczLjR4o7PglioySTVnSpFjhCKuADjNXLtPMhZFOCRTIrdb a3x1Oc01J3DoXEYEVl63qK20JRT85p91qKWsJP8AFjgVyV1cSXMxkkzjPeq+LQSVtSFg8srOx5Jq eGyaZ+eBU1vCGG4irPm+WM5AxT5mtEVa4+FRAjRqvDDFKkzDGWx2qA3DM2V/M03DSnGM/So33Hoa DXAiIYPnmi/12NIvLi5J7+lY0zENsUYI702S2ygc9e9VGKW4my+0NzqNoZgxGOAorOhaS3fBU8Hv XSeHSrwPGf4Tmrlzo0NxOrlcDPOO9O7RNznxdzXlu0MjZUENz1qT7GHhJA6U2/gXT9Tkjj/1e0HF aWm4mQnsc8VLbTKVmjm5bERucdTTbeBzMqRg7mOK1prdppDsXJHan6bZSy3JZfl2HrjpWnP3JsXI olspVklYeZjgelMuLjzCNmWcnGKv/wBnRO5LMXPfmnLbR25DBQMc5rC5dxbG0EKiSU5kPP0qrrrg 2nkBsNIwz9Kmm1OGGEyM4OOgHc1gmdrmdpZDyeg9KtEkccSxcA80sxKgcVKqhnwOTjpTmtpWUkph fViBVoRWEpA56VcgtGmiaeQhAPuqeag+wBsNJOuCDwGqw95bw26ogMsgGD6U3qBPFYM6iRlZgRxn iq06mNzFGu3B5I70kerzyylGGyNewqQuFi805YsSR+FJ3Q0V7FiArSZVgduT0NaqxRuDlQWPSsie YyhRt2Rr1A7mpPPlCrscqB3qZRvqUnYvNpUhBYAewqg0cltKxb8RWto+ohwYJn3SZ49xV2+s4rlQ cANjFKzQriaG4ktMjs54rTrFsybC4AP+pk4z6GtrPeuik1YyktTkNZimOvGGIZMuGB/z9KpXEd7J cNGrfKpxk11M0CNqiTt96NDz/Ks6THLY5JOawnOzNIop2lgFXMx3Nmi/tMoXhGCvb1q9E2Vp7cjB HFYczvcuxzcc7tMg2kL3NbsDF4EbGCciqcttgEqQQDyPSr8BDQKcdKuo7pEoS6tEuERicMoqS1Pl yqAcgDFVb2do4cKD1zn2qBJCpV93y1nZvUZHrNys2oSqo+5gH61Sid4zuXnjFWo7WSaUsMM79c+t Mgtnt74Q3IxuH4V1X0I6l/w5KkLPHnkDNdLeTJFZyyP90Ka5Fo2sbxJY+hPP0q7f3zXVusCghC+c /wCzTU9AcdSrbSO0kLOflQAbapThprh2PJ3GtOB4o5Nr9CODTJbYFy0Y4PP41lzWeppbQzvL7ZqB o+46irjoyEhhg1HsIrVMksWOstbqkdxHvVehHatG4ezu4hdJjOcGsQxjPPen7B0XOP61LgugJi3M hQnysc9BRaTFWYykNkYUDsadsC/eHNBjUOpBotZWHcsK74IU89a0rAC7tJFm+9GuQe9Y73AQ5APS r+nTMYZNq4aX5c+gNR6ha+w62v54kA3BhjvVa7un1L9y/wB8MBgcU+WIwg57UyygkubLzom2yo/T 1/zmqTBouWeiADMUhyO5qSDTFlnePeDs64qW2uLuC3XdDk/xetVre7NhfeZOhWGQ4yecfWna+5Po XzoVuYypzk96z5tBkDAIcj1rde9gEe8SqAehzUR1CDs4P0pyjFbMlN9TmprOaxuoZCpwjBs1vxkX MLMGyGHHtWfq+sRRyLbmFiW53Y7VRttWjhnWNCRGRyT2NQ4tlpiCMpcNk/KHx+taOqyIzxRROSEX BAPGamFnDdfMpIZueDU7aTCyAchgOtKLBmVJhML14BqpeW653RjA71bns5rdyCpdexqtczsF5XOF xjvQtHoD1KQgG9S3T1q1CQkvytwCME1TWZmym0j0qQzIgw27OOwrZpslG554Z9jRlePvZ4JqpcNK hzgEDtmswzmQcMSB6mpYTK6jy2OBweanlK1JYbd7q+xMTtBJx2GK1zLgEDpmsl5JraUyH5gRinQ3 qzMcnafQ1E0xxZfJ5BPenDniollDlTkABamTaWAyPTNZ6lDWYCMgDkHNUXLc461dLIQ2CKpuryMd in2NVYBmm3YtdTxKflZf1rYvHCWJEfYcVgGxlMm9slvbtWneSeXZldpzt4qn0sSYduwkymcktnJq zjCA+9Z9oxF4gPQ5rSkcCHjs3FVNakp6HW2kqz26kdxSMp5RxlWrnbXUntkDBSFDcj2rX1TUBbxQ OO7g/hUPswM6aBre4cL0PNQNJnOa07siaEypzjk/SsOTLOSPwpJXKTJC25sL2q1FnKx4yqjn61BC nlEhuoAOfwzUllcEozbep4psZcwhHXGKo3zoxiQHG9qtZ384qC5jUoGK9G6+lKOjEy7b2sMlvsZQ VwMGh9NiwdnB7VHJcLaqCTwRVRtXbdlRwKerYthpkFlIVlTk960tOiju/nbHTGPese9uvtSltvzA fpUFrfGFx8xXHany9QN17UxuzlfkHGaZ5MbjBXHpUf8Aawki8tcHPWmJcFVww69KhopFrasaZUAM OhrJvL+aeYqqBRjqe9Wp7giIgdTWeH2DjmrgiZM09DlWHTHBYmR3PHpSS8hi1ZtlcbLna3Ctx+NX b12WEiPkmiSfMSjb04BLVFHAxVR2Eupy46RqBn0punXWbZAx5HBFLLGqGZ84MzYzSGR6nZyXE6PG M5UA+1Vbm2itTtABOOSa2UnVYdp6gdaxbtxNJnNUn0BIqPl2z6VB9kdmJVTs7mtJbZlcIcc9CKtR p5MLrjmm5W0Ha6Hx3Rt4IVcZjZR17UsmnJJOJYjhTzipLiISWcQwOpA+lZ1lqWx3t3ONh+U0muwj cXasWGUZFUDLtuVZeArCrn2hJIwTjJrIup1ilxnknpUpagbOpQefbYHJHIrnowQcHtW/bX0U4Vd3 OKxpQBdyBem7iri9RNaEidKlUU1KlUUxEDc9DT7HImK+nNQOVhY5bOadaTBbuNs8McVlHcoh8Rw5 kinX/dNZqvtTDdexro9ThElq4xnaciudLxzL5I654NaLXQSGSo8qAgfKvpU72UtuoCpy3ei2XAaJ zW7a3MVxCEl++gwaJNrYEYUMHOXqx5a+lWZ4o9/7tgOelQurIcEGsXJsuwiQjIJFSAANkjpU0dvK yqwHBFRlcsUbG4U0xDNgkHSnmEPhQMAUsUTKTk8VOo4zVSa6CRAYcHIpksShC/AA6mri+9YWpTMt 48ecLxxShduwM0xfFYwI26dz6VNb6nmQCQ8561hK3y9aVSM5JqnFDR17zAgMD1qpqd8Y7dtvXjH1 zWLbXr52M5wOlNv7rcAobPOTUcjTHoWYY3lZmueSegNVLjZLcFVGAOKsRXaAnecYXAqnI2MuOM8V p1JJnnEQCLjNVHukVxk5Y00IXG48mq+zbMxxz61UUnuDZbeZ8cDHpW1oUsbzbNnzEYOaxIgZEYt/ CMitLST9muI5WOBnBoaVgJdZshBKjRjOSc1VRfNtWz1FbWtguiFT0zzWLZscOh7jNQvhDqWdMuPs siuOnRvpXQz6jFHbtKrhjj5QO9c7CiCAgDmnoE8sljj0ppsTRFMJNRuJJto3nnHpWnYQm0snZupH H1punw7ISc/M5qS9kZYcL61Dd3YtIfDYywZmIBOOaltspE6oMM5J/GpLK9WeLy5DhsYNRzERl/IO WHA+tUySFZ104lp3GWOdvUmkutSWWAbQVD8c9agurOUQvM6b5COpNYElxK74XgDrTjG+gNlmQKWJ boPWmtKjBfKGGHWomAaL5mJNJHhR0q7IRaUtaqkyOPMPHIzimzXUsyHzGzmot4brSEHZ7ZoQDcds 4FPUhQcjJxTcZHFOc4AGKYyHaXnLk4UL09TW1DcQCMRlfkByMjvWNFJliAM7uBV2KTyyVIzj1qZb DRKQtwH8sbdtUp3eP5QMt19hU9xOWceX8oHJHrTmCyp6moT5RtXKVuJWmTyc+aTnNdBBJcMrLJOM r14rNt9tuSUGHPc1FdTXBf74Uj+7nmtHrsSXr28kiKxuwaLse4NXIdYkdEAI+Ucn1rFhDXDhZAcA /pT7a0f7UxPyxgZ69aWyGasupBt28YZioH51I6jLAdOtZPkBsu+cjoD0q/bO0kfOcpwawnrqUkPi GTn04qVuDzUbLhfl+tBkLDntU2Az72QozYHLVLb3i7Y0HJbgj0pt1h2BxkgGs/yvswV92WY81qoK S1Jbsza+8cMMiqEDIbiQZygY4FRvPduu2NMe5qqkU0TfdaiMLbsGzo7ZokORgGnapAs0KXHAMRyT 6isFZZYiDkn2rTmvFOkupOWfC4/GhqwEOqQysYSmCg461GqnccdAaclyTEkbNnApTIq4B6Ua2sBW aNizZ4HatXy1itg6yBgBkqTyKpxAS24VgMk7s0kkDITsGRTunowI7m4MjZdfxFV1XeTtqbbtRxKp wTgeu6rkemyLbJOfvYyV9qptRQbszxC2Oh61JHGSpUKSwOTVmNjngDHWrdnKhmZHUByOPeo52x8t jOKNnDKfxpqws7ZxgVpyTpOxUIF9M09YAXRRjk1PtGUo9zMGnSzLuIwvrV6GMW8YA7c1cuZI4YSq Nkk4xVXazOrMD9PSpld6Dj3J1gEi75OWznFU7hG0+ZZ4+Inb5wB0NWvMYcg49qbMDPaTqRn5Cw+o 5q4aaEy7kiXoeMuWUr6giolvoJHIID4HOVOP5VhWzr53K9O1X2dl5BALelXJqJNrmhiwlwJIeOvT ipWa2SIBMbDxWfv2hnZjzwAabFKokRXUEZzz2ouhWM6/nS4vmKDKgce3FFxAn2NG2DcRuJ9q1ry0 hViRFndzxUDQvOAoAXI2qvpTUgsSaLqSwxCKXkgcN6iugimSZSVOa5NNHuUiCtjIOODT47i80sgy gsg445xST10Ha51jJkdMiqs2nwXBy6DIGBVey1qGZPmNaSSJKMg1XLGTJ1Rh3WiBBuiwQOxrLmsg GdM4I6V18i4HtVGewSaPHR+oNS24uwI5EWU3mFVBPfipY2MKmPJU5yav3JmsJCBkMB19ar/aY52D NjPrVXYyX53SNXXO7vUdzaCJkkOCAeRSyu7XEfkncu3kGrcaGVXaQ/JFyfelcCuZbYuAgkQHrjmr lmI47gxzsWVwRz2NQWUalppnHyjke1N1SVwEkjUbmU8EZ70PV2BFuW2ijnIUng9KsxhSnAGB0qlZ sb2ES/ddeGz61NvltM7xlexrKaZaLCFE4xkk0+4CTwsuOQOfpWf5x8xQo4Y1Ykn8klxzlcYqLA0c 7Pb/AGa/Ax8vapJmATB4B5FN1KdpbhTxkE5xS3K74I2HTAro7XI6Fi3uF+xzQSKD8pZW9Ktag4kj tYm5YIC1Y24om0DLE7SPatmSMCZN55CilPe6CJPpMm7fExyA2Me1Q3NmY7hwg4B4H1qXSUBnkmU5 XO38al1oNsMkZw2B+dSuxWzM+IiUsp6qcNUC3Bgk8rjbuxVe3mktZS7gkMfnFIwMp3jg53VaXQV9 TZjPAyeKmlj3wsMZGKr20iPH83BxTp7nCbEOSax1vYpozZp3fCP/AADGDUGcA8VNdb1dGkTG4Yz6 4qPCnOemK6EZ3JrKFpiT2H61Ld2MbRccGnaddxCBgeCD+dLPOJAMdBWbbuUkZZsbhQXhydvXmtFh LHEpLDO3J9qfPcmC3KQLliOTVG4uHNuivwzDmr+KxN7DGnaRsZ4FTZVR65qrFxS/MrcHIrSxFyUI G3AjBzkVfgiLxhnOT0FVrdGnlAx+NdHaWSogJIrNrUq5Qjt3RgVXA9atywmRArjmrUiDcqqelKgy xyPaploNGPIskT4JytRm3LtlRzWnfxBo39lNZUFwyw5b74FSnoWWVjZMqw5xwafuDAh+D61npfzi UORmMdailvN7Ha2Pany3FcvzXgXo2QpyB+FZVgnnvI7Dkmnwr5j4c4B71Ys4vssrRn5hnIPrmrWi EyteSzQyDy2wM4NEZ80hnOW71oXsCyQOcc9qyok2sV3dqa2JZcA8oEqfmPSpIc5y3U1DGpOMnIFW UGBVWFcmWpV5FQrUyGoGU5VDAsaoef5MiOW+61W5pMghTWVJE0rqhPU5NZw3KOsEyTA45R1zXOSl dOuXULvlydo9K0dPlRoQsbZCHGaZfwA3UdwFyWXa34VpezJM5I5CNz/ealkE9uc8hWHUVbW7iDYk Q5FWEmW6h+6CBWblJa2LSXQylcj595LfWrDaoRgFMmmz2jjmP8qoOH8za4K1UVGYrtGvDq86DCqM Dpmo4LtHkbeCrE5JqsGWPAVdzHpimNBLGC79z0qmlsGp1DR27wIwcKSMZrPe6jibYWyOmRVGxm86 RYZWyD0BqW4tmUsqpxnrWTjYC6bqHYW3jgVh38bTM1woJDN+lXDaxJHmZhkdqkhdWjKRLkAZ5q42 jqDVzJihmbAAx9anFs+eDuqSacox8zg+gqu2pnoBV6y2DRDzZTDJOB+NPjs2c8kce9Ed95gw6ED1 NK7mJg6tlTSs9gLK6aJOc1Hc2EsWT1UUsV06kc8GtEs8ttuJGO9Q7oZgyBkT5PvHimiJk+/1IzWi QN2AowauXy28Yt0I3Oy44q0xMwQ4d1iU8Z+atFlKxK3scVDFZiO5DdMnpVqdcorA/Lu20pPWyBFi G486zaGTJdPmH0rNhLJNt6c4q9pKGe981uEIK49arTxst7JkdDSWjsDJRJsB9Kz5LzzZCEztH61J K5IZTxniqvl+WmP4jyauKtuJs29Kv9xWKTjqQasTuJGKswCg5zXNo5VsVNb28l0QJWO3tk0pU1e4 09DQs7jfeP5eWjA5NdJaSR7MkAVyphNrIqIeD3FadvP5sWOhWolvdDN+SeHyyCQa5fULMRlZYwcv 94ehrUhl3ELjJommiDMrYPHFPnvqKyOaY8lTU0YUR89cVPewoF8wEbvQVW3fJjHSrvdCGFMc55zT sHpTVfLgYqU4HGeaYDB900xgzpheT2qbCgDJ+tTSDfMhtkwMikAy20uaF/mHzKcCpGAjlzKMZrTk ugZ9gHXnNUdTspZyPLbhRuHuaz3epfQhfb1GPrUiR7oiynDqf0qnGWA2SjDL2qeBzGMgZVuop26A VZrxs4C5H94DirFmv2hgz9MYqURJNLgj5as4ihiZcAAH5TRdJaBuR5igO4c89KsLMhXAQnNVrW1N 0+Q3y9zW1FapEgwB7VEikUks5XJd+PQUvlS2+8gZVhg1eM6qSOpqMu7gkr+FQ2Mq4wTzmkOAM460 jNiTBG3J4qRRvjYdxR0JaMjUJtrqi8ZPWoUcvj+IA1elsxIpLVS+xzxH92citoSjazIaZa89lYAr xVhZ1AwRzVV4pYhulXJwOBSRFZ5AyBk45GelVypibLeI5XG7AyMiobmJWYR+g7VSE+JDjJAJHNWU uI87duZCO9Pl7BcgltCn3ZQPrTZBLEuWG8exq1GBcSD5QDnpViVXDuxgBQ+nakwKcNyEIU5GB0Pa ry3UZB5xisl2Qtk9R0zT2hzzlk3DIFJxRRekG9JHViQp3be31pYLm4ISNHzHnLE9hVjT0iuLfy2U 71G3NVZYZLKYlRwOR70tNgsy69ssEKSBsluKrIxSVZWGdv61Ct75XyMrMhHA6kUoud4MeNucEZ64 pcpaYpu0jkLOmMnOPSj+0HYZWNkDcAmkeIS7Oc5J3e1LOildoYAjp7UlFCbHKxREkY7iSetX4ZTc R5XgmshX3YDZx2rStpI4VXrxUtDuWzbndyc8U+NNp2kcEEGqc+qqv3UJxVG51aYREqMM3SqjFibM py8Up9UYqT9DWnbyCaASEfNnms21DyyMZTn5snPc1e090aVrcd8kVrJKxmmW36AkdOaguWGRIOOc GrexyWQrnA/Sq7orfLjOetYpq5Rft3EtsrMwz71Fayp/aYjPUg4+tU7abyZfKdSy9ua0bKG3kull GAY849STVWQrl+QBZOvvVaSHzw4Yblarsu3bjqTUCOlrb5lYCoaKTMOOwMs06RnZ5bcEfyrWsoJr YHMjOvpTbJkkVnA+Z2JNaGQBipcncB3nZUZB5FRmVhwO1QvKVY470LKuPmIp87YcoyZI5wyzKDkV mDTbeKYtjKVqCVZpNqc02e3JT5eT6UczQ7IzpbfKJJbjDjg+9KljJ5SgMRuPze9adnaPgb+D6UXs qW0Xy8ufuimuZrQTauULmIWsccSnO9st+FR3sReyhCffLHH0qDMkl0pkfcdv5VYlmVWXeeEzVrRC 3IdM/wBHuBC0hBlBIDetao6GKVeSOhrEhj+0TR3Tk5jkzgDsK6GRBcopQ8HkH0psRjXNpNCRtPyj pUc1hdypt88KcZxW00LGM7zyKoToxYNETxxWfNZl7nMT20kExSUnPvV4nGnRr36VsuiXEDfaI/mj GQ3cVgXkmCqjp6Vrzc5FrDrdPMnQZ53qv1rT1qQQncOD0rO09T9si4yQwJq3rim4nCg4wPypP4kh ra4mnaglmF3AlGIP41tXm25VfruBrno7dTCvzAnHWt2DiFAx5CgGk9NgMt7UEygkZDUwIPILAYIO DU9w/lXDE/dbnNMk+4+3oRkYp9REMEM8rFIxyDirdrabZSJwS2OlWNKbZcMPpzV29ZFlSX/ZINJO 8gZRutjoIXQEZIBx0rDnUpM0fYNj61sI6yTxlvu85/GoLxI5OI8bhk01JpjtoVIdm0KwGadcj95s gJYDngVXIBGM49DRG5SRdzfLnrVbk7Fi0kYzBZOnQii8sJ5W8xFytb+nW0DATAhwR1q66x9cgKKj ms7oe5w6xSq21lPuKt2lm8zhTxmtjVbH7RGtzbDlT8wHcVFZ7VXK9R3qnN2uibFu204wK3GeKdPa SvGrxXDx4PIq1bXikbX4qzhXQ8ZFEX1QMyNPS4S4laeQyKOFrRUYOahi4kkX0PFTjpUy1Y0V75wI Xz1INc1dAxoSpwa1dYlIIQHris+cBo8GnEfQitbhZcK4x60rWMcs4aInHpSWdvgZ6k1eWHBGKmU7 PQpLQq6hE8CAquFzjIpkN18yZ79K1JY2AcN8yDkZ9K5qWURTOg6K+V+lVD3tCdjpEImBVuMisrUb drYK6c5JBq3FcCRI5F/EVNdRi4spRjkDcKpXTEynYP5kQz94VcxWbZ5QBhWoMFQfWrZKBRzUy1Cv WpxUDMV8o5OD0qCzDyXu2RSFYFfzrRtpVnGWxUxiCEkYPvSTsUynpURtLqa3bpjINa0kYktZcfeA yKo+YBICw+YcZqxHJxIAeMUSd9RGCbpZUIcYbPWprSU2xGGBQ1HLAI5GH401Yy0Rxxg1Vk1YeqNl J0mXKdfSoJ4hMcMOaz1Z42DKSPWtG2m86PJIyOK55QcdUWmmV7WHyrjLHAUcVoxRRyyFpcFRz9BV eUchjUDSNGuGBKE1UZXE0QxjfdF1XHzEirLPPKTvfapqu1yqKWQflS2Un2ne02VQdB0z+Naa7khI YvNCJl39Knt0eNxI4wB2pbK3Q3BeNArduc1ZuwyoRtwG70OwXKdzFbXc5bqvamrZQBtqxqB61X8z yZWG3GfWr8TBrQOvUVLuloNamXfWzRsME7SatW0QlCp2xWmsKz2+SMntUllaLCmW+ZzS521YLWZH Z6YGf1xTtQhNvCkaH7zc1opJ5QIUe9Y+oXPmTsxbKoKFe12HUoyytnYBjHWnlvMIZ+SO9Vw++Qse /Sp1IOB+dUxEs8mArjkgcVXik81RGR/FuJq2sau6g9MVU0/f9ocFCAM54oi9ANK2kFuylR92qlxL 5krP3Y5q8kakHI6VGYY3fCip5tR8pmyoCRioJFJHHatWWwc8iqEkDoWBFXGaYnFlGTdEVJ53dKs2 t0wwMg47UeSCvzdV6VGtvuJxWl00JJl4yB1aT0GQT2plvd5Yv0BqlKGC+XlsdxmkUFVwoNJRQXOk s7hBKrE8dDVPUQ0EzMG+X+H6VQSYquDw1MkV5ZA8jFiKhRtuFyUyFwdxppfr6VGxzwKeqfLzWmwh oBpx+X60vyh855xSFWZgPXmmIf8A8smJ6lh/WrNlISGXuOaoyNtGD1zToWYEFetS9ikaoQl85rQH yQDPU8VStGSRQwHQ81fEi/xjP9KyZZnXcAcbyPnAwKrA4jG3rWngO2O5OcVl3UZgupe65poQAlcE dR+tIWS4dYg+R39qZHJHJxn8KcYcOHU8g0MZo2bBHWJGIUj8zV9pViTLtkdhWHNchJ0K9EPWrCTC fA9OaloZdE0ZIY9c5pGuwvfgd6yri88q4VVGQOtackMV/bM1qwVgMhfWhxtqK5Ulk3vuzVmGXzAG Bx2IrHlaaMkOpDL2NNtrqbz1UYG7rk1ThdaC5jbbDHGeKR/lUbcHFV3kIcgYIFVnu3ztVT1rBJlF i4nkLlyPwpiBghdcDPX6Ukcpl4kGO1NLeWGRjlXGK1i3sS0VgAULHk5pI7N5n37SO2avxGCOXLod varq3EMnywjaPWtNUTYykjeNsKGwDwasC5KRbS/BOatiBky0bBsnkMMioZtNBGQwLelG4yqVikjx jcQasXEiTW0UaR/vsgrgdqhhto9PTzJWLsc8epqr9qkfcykqzcHH8qSQF61nEFyCRt/vD1HrWzeL AyhXcAsOK5TDvIMszHpV2WG4KpuJckYA9BQ1EE2R6kEtZVML7hgHg1BL+8YPGy7uuAOlW20yZ0BJ B9KUabcCFsBQcevWkpJbDZTG4j5m5701JY0c5OcVdSyEIzJ87d6SG2jluQrKMDlqFNASP50NtHME ARj2HIqKWZgMu4X6mte7VZrRoQAQRgVzH2fySVmUrn260oWe4O6JjdDv8w9atR2v2wxyOpRE/Wl0 +0Rl8yToBwDWiJDtKIvGMAUm+w0Uby13x5thyOT71l2jSR6hGQMOrYIrakuhBCARli3Ss9iftazS xlZd2SMcEVcW7aiZtwzrJvcEDAwc9aZBbROG3NhsHaayWcMSNpUk9vSpIZ3jICngdjUOHYaZYvLV l+demM5FVIZiJBtOCOau/at6Oh4yCvNQCwdF80HIB5pbbgzasLnfG+/qOawNYvHlvHVW+VR8uKtW 8haBiDtI4NQixjd+eOOtaR01JZqeHo457TzMncDg1oXVqzplHKntWdouy3lkhXA3EEAfrW51IHam oJiu0c2N6SMsj7do71JbI0yA8kGtC/0xZw7etSWUMccSKn8PBqGmtCuYr2oWKQritAlUj3Yzxmon hVnJ6E0+HJUq3UcVMdxN3HwuHXcPTOK5zUw8d+5JOB90+1dEBsO7t0rL13CxR5X7zcGtE9LC6mfA f3jSNx8pNZ+pSkGFF6yncfpVgyZ3be5xj2prIJLkSsOFAUZ7UdSuho2EQaMDjPcVrgrFtUcCqFpa qi7lfnNXkRn3BvwNZNtsNAdvN+VOealitVUEkcmmtJb2S5kdQT0GetIl00vKDCmtFBLWRLd9jN1w eVHheDIR+lc5LHmXcemBitbVrh57gqx+5wKy2DPIiqMk09noPoW9N2pI8zdAvHtTgGuGaQck04QF rOVR0Tg+9RJM6BNuAc46VG7K6ESxtHKQVJ71dW7ZlwRio3uFmQHbhweaaikkYrS1tyVqSyEOuWGa FUFdooIIGAKSMkEg1PQdieNgrZGQ2MVKfMmiAVSy57VX2bvWtPSHChojjJORUJ3ZTVlczZYnhxvT APSonRVXPqOa6S7tknj2kcjpWBfWstsV38qehqmmmJO5jykK5XtUawSSLkdM1NdxmKYTfwMefatm OyEmkbSQsjncCKvmtYm2pFpbvbRCNm+U859KtTyEIcNlT1qOK1jjUQEncR1zWddrPZvtckxn7prK 3Myr6F6zv3t5gCcoTgio0uEhvJ0/hLHFUFlwxzzirXliVckA1pboQaiYYZBp5upFYRoRlvlFYsM0 ltMI8kq5wM9qtbm+0gZ5Xmo5XENzRIcJHIPvYxVSW/uFfbgcdake4aRvKzhqplCJCGbJzyaqLvuD RBeTtIymQimNcIFIPJxiotQTZKE9+tNeMbcjkVTQ0Ot78W4wy5APFbCX1rKoZWAJ7VzrJxmo/uMp HWk6aYXsdjd/v7X9397OOO9cxeWis5DjBHetHTL5vljY8Z70/UYVabcOAwzUxvF2EZumsIt0Tngf dNaNtOXUj2INVIbaKQF/Oww7VdEAESzK4xjkVo2BnWp6r6GtKE/IB6VQhTa7/U1dhPamxE6DJqWo 4x1qQGkBy6TtEcDpV+O4cxluvFUMgsccCpjJ+6C4wKbGRvcyu/XBPYVqW1wo2szDn5SKpQW5EE12 44QfLUKBWAfOSBn8aWjA2buyEse9OTWeU2Kc0601WSJGixu7DNMmyyE+vNTZxdh7kQbL+2KCTEQ8 Z+op1ugLYJ7c0zILMo+6OM0+oi/HKZ48KM0+4gdYhn+7VbT28slFODmtN1YxkHnIrGaUdi1qZixh Ixu5zUscXmQYPHcYp8sYITbyTVhI0gUMzDgd60TuS9CjC00EgYD7vStJNVRivnRYxVGymFzfFn4Q fdWrk0cUolCqPl6kVVibmfdSwXMjM/GfSl09lWNkznJ6U6408NZRyxgq20E+9ZyPLHwrd6LXVikb 1q/llkPTORWhalVT5sE1kQk3EKMpw4PNSSzSNAfLOJVNZx0ZT1JdVvQq7UOBnDYrJYhueoYc1Gjk wMJQd2TkmqlvMZJxFu4PGa1SuRexMXVDx1xU0DZC9yRk1HNAYnwRkdjWhYWmV8x+EUZJNKTSQIdb lVmTecZ9avxojRuQvLMSaxXmWa9yg+ROBWjZyMBsJ5qOUpMtqUUYcVTjnjjnkYsAvYVYQh5Tu6g8 is7UY44b1SPuuMn2pJJlGjDe75NqgsrHrjpUj2wkyMcdc1nW1xGOM5z7VdtZm80ZOE96HEClNbbC QRUaR7a2LgJIT6AZrP8As7Mx2jiqi+4mrlXyFdm3DApRbxtgICasNBIONtSqFtbTzGH73JwKHLsJ JlcWASMtMMelZ0jeXJtBrTS4muFG4ZxzVGaBg+WHU0ReuoPYjCA4IqQIADSxsB8pFD8qCK0IGLbs 7kqM5FSH9yx3DnoKtaaQbkKzbQRj6mtp7a2CbnVeByTUSk0xpHJIPOmORxWiIIrVS8nJxwo71aEd sk7eUAd/A9qp3LNOsu37xbZ9BU8zbLSsiHTLnZNIJThZMsMetbkcRwHHIrnJLVlC7SS1a9lO+0Qz HYw6g1UrMWxfVSfmAwT3rK1J18wpEcsV2596t3N4AvlRHLHgVmnJJk7jpSWgGUwMcjHcQQccVo2c pmi6/MOtZ3zPMSO7GnxtNC/7scnitpK6IvZmp5Ac4I6nFWYLMpMEeTYvXPtWcl24ZtygEc1sWMon KyNyqfLWDujRWK19ZpE8bgkxk4zUFpObecLkj0+lbtzbQzwsIzxnOPQ1jXFgdykHAxwaakmIu3my +thkAS+orIaKS1lww5qbzJImCk5PtVtgLpUyf3m4CjYVios21CSO1LEgYs3YjIp9zatDuDDjvUf2 lY1wRwBUWKLKJhcnrUN0A7qi8sOarC8kuJhHEOveta0gEfLAs56mi1twRH9nDxhTknFQpatG/G7r W7Hb8L64qO3jW5mmP8EbbM+p70XYaFQgSRgAnOahkgwCS7fnV6eERFSvQZqFsNHk8k1Kk9waM9om OMNn61LBp6FlU48w84qSSAlSV4Pao4hLEQ+75h0q+e4uUttbRW67nwpA61k3WoET7hlUAwKff3Es 7gytwOw6ZqpcgNgt6Yx71cUgL/2yRVAOfoact86rgnj0quWMoBxgkZzUtpZtcXCo33SanQZbMkck DOD0GTVa3ilRvMdSEmPBrcj0mJEKjNVdcmWBIYVwCOfwpKDWorq4u1Y4cnk4pJFikhYNgMFyPrVK O7Dx4JximrMrsxY4UUlF3KdixboNjGQ4U8UeaquRECznpx0qqtwG7/LnqanN2kC5jiY56tjrVqJN xn9nyzTrJLgICDitG/to5hvwMjAH0qWBt8ETMMHGSDTZ5VCy4PyqP5VL1A5hnEcrqf4GIqQAMKqG bzJXbBJY5q5Y2s006KAdhPzH0q3oBGGYNnqM81oC0upLYTWswwR86GppdDbBaJ8+oNRi0vraNkiB KvwcVPMmBSgzAPLkJJc1f3RvbnBwwFU5IpUUblIYc800zMgI2HPWq0ewixCZIr23eMbiud30NdLb Tq6jB4J4zXGJeSRTuXXqOntV9rieXy2tZMgkED0OKvVE7nQ3d6tvLGrY2vkE+lUY7ryS6jBVjkGs YyyPKyTMck/xdqlWVWZVBwBUzdxpGqt6dy5HBqyk+52kHQCscE5J6gVPDKQCCeDWLY7GyMuij1Ga bc2i3NuYn7cg+hotJleENngVY3DFbQs9WQ7nFSRtEVDDBHB/M1bgtjdbYunGc1PrCo11sThm6ipL CNkmMh7KAKzvZmm6ILize2lTbM4XHTNRy391bLlXBHqRU2rs5eMKeefyrNuElKbd27PNWmhCXD/a R5zMWbvk9DW1b3XkWgJ5+UGudyUt37EjFaMd0r6WISf3i4GfUZodwRXd9zsx6sc1Y0qNZL4DGSoJ qqeCfarmikrKzAfM+efaoewy3EvlafKXGNzGsmXAAAPuK39U2/Ywo4BINYVzGAwb0oQEYcAADip4 pBnBOBimPaugUlT8wyCO9WLXTLmc5C7frWjs0JOwwSjOT0FLlmkJUE5NaA0x0VhIBt2nOPWm6coD GIr846nFRey0HctWunh4MS5WQNnj0qf7LFbsHBIZeetLPK0SKynqcVm3E0gchn3A1OlhXZuCVGUH cOaqX8SXUO0MAy8isg3DMOpFAlc5AY5FDm2KxS1GMJA8b9R2p+jXj3UYtGzvVflPsKrai5a4BfJG 3mixYWtwlynTkEe1aJe6Pqa8UcquzSdR92ppFS6gMcg5qVJkuEDDHzc1XyY3OfzqUBiS2U0UjAoQ o96mtDIrlDww7GtpY1nYbjxjmsbV5dt8rx8YHP0rTcV7MllQK4kYfN2HvVq3RiCJV2tjOfSqtkxv bmNCOFbca3JoQIpj3K1nJtaDMuZEknIhfLAfMfequpFraP5jyelWNLi++SeScmo9ZUS/KSAV6UR+ IbKpmSW3HmgHjrVckIOT8h706OHagABKj1p08YktSoHIxmrumxW0GBAwBXkVDJEQw3DiqryPbMNp OPStNHiuYlKt82OR6U3eOotyvG8kD/Q8GrFzeedEgJww4+tSXEPmJkDGKoeS2/1ApRtJ3B6FgYEa sMZHFDyOqr8x2+lMgG+4jQ9C3NTX20SlV7VVtQC2kyMA8Vdib5qzbc7TitCHlhQ9xF9R8tKDSD7t A60gOeVFIp0cfmypEOpPNRlggzVi2BiQzkYz3pFE+szCDTFt4vvM+GHsKoadbMyfP36VYjhNzKZp DkdhUrt5cbso4FVsrEmftEc7AdmIq5K6+QMdapck57mpjymM02hpjFkIyF6mrjQiDSHYf6yRgq1Q Xhs+9WLy4LLBH2DZApbMW4se6PO4fOO4rZsJkmQ7uqjmss4NuAOo70umPIZnVQcEYNZT1TLRfwMF h2PFUXtp7gktIcZ6Vrw2ykHPQGobpkiwsfXPNRFtbDZmNavE48s4NXYi8YmOM7gKbvyfeiHfuO7o aftJCsi2kolhEQHygcYrFuIjG7AAgZraR0h6daR3jlyCBz7Uc+tw5TDiuRbH5mIBFXYLhZRvHFTS 2EMq/dX61Rlja1lUDlaq6kGxY1CET2xliG0jqB3rAjHlt9K6OCQMMdj1FY17F9nuHQqCM5H0q6b1 sTJE0V6TCY2XcfWle9naPygdqHqB3qAwFbZZkOS3UelRJJKzDZGW+laWQiVQ4PGRmrkEzqRk5Iqt GZcDemAaczhMbetS9Ro10nWYllbbIP1qpezyA4eHzMdxTY0W4hLxnbIKihkkDFX6+9RYot2E8BAM ibCexrTeSBhww9qwxNhhuUU4TgnO2k9Rl6S7EMuAcg81o2MkVxGCjc9xWBOU27hkP2qO3uTbnejY J7UON0FzrRAG4zx1om01Z48M2TVSxvlmQHdz6VpCbaMdTUJdwd+hjravYykOMxnofSo7tEZPlINb 5ZJAVcAioTYW7nO3ijlb1Qubucm0R7etOzgEEYrrksLdRxGKrXmnQvztA+lattLUnR7HKiTypEb0 ORWrNLJcIrPkDaOKi/s4G62jlEOammkCvhqhzT2KUWQh0to95+90FRRjC5PU8mmTkm5XjKAZ49ak JVuM4pWuXewqSCO4gJAPzinazG1zqSm1PVRn2qJI1NxGztgKc4q5E4Fw8pOAVq1oQ9SC0stquXYt MOCfT6VUuVdIREmd2cVZSWVJWxn5zk1HLLycdT3qbtsdrFcWwjhjz99v5VPGgGDjkVHuJbJNTxtx x9KYiKSFJiV+6/Y+tNs0urZCgwctmp2QnkcGnQo5kG7JUGncRekuDHyOAetQ6pdJ/Z5C58wJlcdc 9qnyqxlpBkYrFNwXkZxjBPAx0FTFdSmNsblY4mNzl5WOMEYwPWnRzvHIGBBHfFGUc5K9TU7WtrIo KMUbHPNW9WSTT3LXFmVU5Ykc+1VHhdPvr9aZEGt5cFiVJ5rSnmElqU6nIwaT0AzVTy5ldDtK8/Wu htLiORSzYHFZDxq4y34VJbSmFyEIxjA3DpS0kGxpXOqqqtDaAmTON56CnaRcRxQtbscMTkE96x2J jlYYJLDJPvR5nzAA0N2eg0lY6C6wV+h5qgnLEehq1YgPCWcknpyetQ7B5j+Wc88is2rDBhn5R261 DtIU7uSamAwvPU9aYxyuR3OKgZl3gDFY15y1QYSad1zyrYArQkgCMGI5yT9ayTKtvcs5z1yDW8Vd WRL0Zp+QdqhTg1s6TbBEDNyy9DWbC6yjcBzitq1ZYIArH5jyfas43vqOWwupXosrV5TycYUeprj7 q9lvJjJKfmPYdhWl4iuPOuVjQ5VFBP1NY+0jI6+ldKdzPYkjcFgGOM09RumQucqrdPWlWAtEHPBU VZ09Fltizj+LdSb7DRdYxvtCJ2z9KfYYuJWEi8IAear72Mnlxj5jUo32oJGW3HnFQ30KsX2cAAng AVkXV1tDxr0Oc1auZi0anoCMAVSFr5jDd3rO47EUMIkUMMLk1rWLeVuQYzjNUns9i/ISMCqyXD2k gdyWBBAotdjNaTVfKcrg5HWpYNZhPDnmuYlumYEn71QB5M5Gea0UCW0dp9utHxuwc09fs0pwqqfw rjFeUgYBzUsUl3HzGxGKTgB01xZ2TvmRVBPFNFnaW4KxsEZuRz0rnJJLp23OWJpHabAZyzH1J6UK PmK5r6uiMFuFIyVBJHes61kUkbuTnNVXnkZAuWKjoKLZirFgMheT7VTjoFzaSVecdKlUbwSKzY5N 5GeDV5GeIDcO1YONmUaFq/lxup6EcfWtKEZUZPIFYS3GG5rU02481CD1FODSlqTJaCahaxMRKRhl PWq6YjDE9MZq/eqGgYt0HJ/Cufurvd8g4FaTj7wRehVvrlriUY6LxVR7oxna2elWkt2kVmUdOc1n X6kkHIyBzTjZsHsOZ94C96ljOFH1qjFJuIGeTV9VMceDyc5qpKwLUc2CAM8k4rZ0S32XTBuqDBrB Gd+cZ711umhdjyjBZ+SfashvYh1shYFwOhrFJEy47962tSdfKPGcmsTIMilVxxg0bgWjfCPTvJcb pIz8h9q2tKvlvbYHAVwOQK5x03VY0qb7JMu7hSCDVJ2E0dHMwANZ7zRxDOBvPXFQz3hmyEPTvVYA lsnms5O7BInlnZ0Azx1FV3VmapgBwD0FI21TnNTcZXZNo+lOUAc0jzxjIZqga6jBIzTs2A2ULJMQ RyKR1C4IFVWu0N+hPCkgE10MkFtHAHIBzyKppoDNsp1hdUJ6/pWjKu4blrI1B44vmQc/yq9YXBlg BPXvVW6iJUbB2ngGs3VEw5GDkgfzrTkTIzUE8YlQMRkoc/WqT6iZa0C1CW7O6/OxzWhOMwyDvtNZ 9nfxqhAPQ5xUOpawkSfL1Pas3qx2ILOZLeJy7Y2jmswXJneR35welUpppLmfC5AY9KmSN4wRt5rX lSGmXknXGMc1M43R5C4JA/GqNsGkuAXGBnpV66Yx2jP6jatLlFcyJSkrFlGecVEmUlynDClhUKxI PBpsYzOcc8GtfIk19PuEuN8cpwxFOliQP5YOTjINUrHAuCD3FaCpukGOtYOKTuXcz5j5M4ZeCKsW 8f2hjI56Dmk1FB5ikDFQyKy2iujEHdtbFarVEMmcKrDbVy2GcGsiHJYda2YBtQfShqwXLOaevNRC nKeaQHOQp50qjtmtnUIkEFtApxv+Y/SqekQ+bLyOBVjVSBdxYPIXAHoKlvWxRUllMTlYs7RwKgaZ nUqelOnk3Aqo+c1Eq8da0XmQxoyKcMk0oXFJnauB3qgGM+0AAcjvSIrzTggEkdBTXIzz9K6HToY4 IVbAy3OaicuUqKuVVs5EXdJ37elakMKwwsQoBNEriXAXseanfBTBrkcmzSxlNq0cL+UQS3t61VuJ CspkZs5pmp6f5e+4X1zWcm6Z8FmI966IxTV0Rexq+aNobPNKLo4461VS2knwIztx0z3qtEtwJ3iY fMvaj2aDmNEzMeSaI7hgTVZA23mnKrZqLDuXorgr3pWxcSl24CjAFUd+361esE8yG4dudqVLjbUd x9uiK4JOF71U1JInaSQtnAAFQNOVLDdgA1VlkaRhnp1Aq4RYpEsE4Tgr8h4NWoXjjVmRcEjAzVIK AtPViOW/AVoyQJKbi3IqW2ga6Pyrge9JCfMkGR1NdEyRQqTHgAdMVnKVhoxYrZ7WQtu4Hb1qYm3k ccgPRJOqlt/NYc07Fs9ieKuKctwbsa0qxR3OxiOKk2KqswAIAzWK0zyHcTk+tWorl1UhuVK4puFg 5hY51mZlOMkU3ZgnjjGAKbYx4aRW4PXNaRtgtv5uQcU21ERHp7CO4G4lQR1zXQXRK/PBkjAJIrlx KVPJ9uK6jRbhZrZ4yQWBB59KlxugvYjje55O00yPXEifZMGXB7it9UGOB2rJ1jTUuIn2KPM2kg+9 TycurHzXJYtYtpGCLIMn3p8l3E38Q5rkoLZ7aQ+YuOeRWrDGHClB2pTemg0i0GRTI+fvHNZty4mk OMhR1q4QCTj6VA0HzE4rMskhhQQEtgYBOTWbcHyj+8YFmUFdvTmreolzHHCnAYfN+GKzTETIXI4G cVtC1rsze5vmxj82JNwYN69elUJ0kiuJEjPyqcDmpdDRpL3cSSFUk5q7Nbo25y33sn8amUrDRitL KhBcd6JhuBdemM1NqcZFuWRgWIPFVIVl+x7ZkZQBhSR1prVXC4IQT1qccAYPQ5qK3ieUkIM7etW1 iRFIkbDUrgMUk4A61ol47aAGTGcdKorMsWdi5NROXmYPIc+gqrAaEEb3jBpDtR1IUVFfaWIIleEZ UD5qm0ycL+7J5XkZq9I5A9VPUVL0YI52NPl5FPHymrd3b7B5kf3Seg7VT6Dii9xizYYc1HCSjqmS ytxz2pk7leCQCemaliUG3V48kBjjPWqWwiZgVYd1I4oKnOSMEURSjIyARVtENxDI2OUYKcdxUPTU Ct56+ZnAx6GlwsjEoMDGRUZtgpJIJFSwjYAg69vpiqumtARctpCsTAfWsy/mljulEblW6nFaUQ2q 4H0rIul8y6kfuDiku4MtW9/LGP3mHzyakGq/vlQWzNk4GMGqSLkj3rSsrPLmXGQowKV1cBNTZy5Y gKEXisR1Ejg9hya2tVO2EBvYVkptyFPYVpFW2E2bWkOXtpF2A7SME9qnfzpAc4FU9HdWSRgwHzbS K1wEhX5jkms5aMaOeuLWVCTyxY806OJIUEsvRT0rUvry2t1ZnIrn2ma/Zid0cIBYcdapXaAS5na4 lZY22pzgDqRV2xytucjjGKo28Qt4mbP7yQYBPYVrxFWCQw8kqM1UnbYSQyMPE6TOvyHjd71d89ZB xj0q7IsNtZbZMHAwfc1gtujYvFkAHOKiURxZcn4kRWxgCmsy8bfWmssssQmSNipGelVUnaXKhcbe tZtPcu6NGRxswDk4rPkRXXawyRTIzNIxKBiM8+1adpYlsO3JNMTM2OzZuVjzUn2CQdUxXRwWyxAF sVMURuSBVqMiLo5JrZlblcc0BGBwRjNdPLaRSgEDBqjcWQI2sOR3pNNbjujGZtpwSKV3VE3OMqeK sLYiObe2W+pqe6iVo03qoQcgetNJAZOYnUmNenJoWVIgUdB5bg7io5q99jWXlTt+lQ3GmSAZT94B +dVsIoRyA4H8Q/Wrhml4DkkDpms+eCRXAAKn3FXPtCyKA2N4GPrVMCwku5qu2s/k3EW1vkYgGslD skGelWUIACZyKylEL3Omu1D2kmf7tYtppRlAklbr2q/BerJZ5c8qdrVjrrrNO/lRkr2xT1lsC0NC +CWtt5MYG6TisxtEkm+eRsBqS5uLh1SeTgqcqK0b0MumZZmLKQ272NC90NzButJ8rcYmyF5z3qO0 EhDb8n0pVaeacQh+G/UVqpaMCuwfKRVSk1owSM4nb1FaWnXbw4OSVxjHpUEttIjZaM8HrTCSPu8c 1NuwXL17N5xAQkCqTIV5BoR2wSe1SIQ8fPWpd0MktrWe5QMmMZxk0XenXdqfMYB48Y+XtVjSpmiM kJPCkOPxp8erOJiZlPlnjNUrCZUhkX6Cle6G7EYzWkrWNwhDBVP5VCYLKAkg7jUONhlKLzblsdBV kWghy8rbiegqOTUI4j+6AUetAnEoDcnNKzAgniQEsRWRcF5JcRjitnUTstwMcucfQUzShEJt8oG1 EJ/GtI3WojHaFrZxvw+7g4966EQXE6x8YQDjmor7ymG9UH0qWK+d4hsOFxRKVwSMq+jY3YQcjv7V PbSiG72dFfilcfvtxPU1Wuj+8yvUVS1QG9nK4NRkYNV7GczwbieRwasg7hU7AZ0tuILxZiT5ZPzA Vl3zb5WPUZ+U+1dBcRiSJlNYD4XdG/4GtIvqIislLS7l6AYrSlAMe4feFVtKTdJIvfqK27XTg4d5 Gwg7VM2rgjOWVUYEjmrWsYbTYWi5UYJ/Ksu7Yx3W0DgdKu2l0ru0Uo/dvwfahDZibhnI70+H925Y 9xUk9o9veGI8gHg+oprAiQnAKjitfIi46zfdc4PU1tINvPesKE4nDDjBFdDAA/yn0rOasUtSpeR7 7d37rzVOKYmF4iMh60b1fKsp888VhxSdPXNOGqBlu1TLfStZeAKzrTBYkVog02SSA08DIpi809aQ zPhlW0gLDhjWbNdGSRpGOT0FNu5/MJUHgdagiQyOFY8E0Rj1G2SW8vzsx69qmJxzVmS0ijRAud3e oZY9mB0Bp3VxEBbJpxB3he9MfAOByRUkT4lDN0FW9hbkElu7T4Xooya0rG63xmORuV+7VOR2Z5dh +XNQxowJPQiokrrUa0OhtpdrDHOetWy4POaxbW68uPkH60kuqxnChsfjXPyO5pcu6vKp0yQZ5Y4H 1rEtFKqR371o+W90pbGVX7uf51VQAPt6c1tHRWIepcty2z5Rz7U+e3eKUzMvLLjNXlubaC3VIwC/ fNXQguLYORkEZqJtoEc8AATSrjjNT3Vq8LEgcGoQR2qb3GQzID+BroNFtgbJ944fP5VhgF5FHYmu otR5Nkc8KFJqulgOattMM97KSCyhjj86fd6DNBDJcZzg52j0rpNOWJot8eOatzgeQ5YZG0kitVHQ hs89XnGKlSEzSrGgyTVZJh5jBVOCxx+ddJp0KW1r9pmGCRUT0KQJo6CNcttIHWo7hvs6YLZHQGmP dyX1xsB2IOmPSnTwo2EY4x6ms7PqUYtxITI3o1UXQM4x0FWb5Qkg2nrUcadK6o7XM3qOtrdpZtq9 wf0FKWIxmrlin74nOAAcn0zVKZcbRRe4F6JI53QR53uQCPSpL2Uqv2ZT8ink+tJp6tCyuBkg1akh juJHYjGTWTtctXMtIvMkVc4z39KtWUr28gZWIP8AOrCabuzhsGq88D28m08jFHNfQLHaWb+dArg8 EU9oiG3A5NYOkatHbQeXLnGeK14NRinkCoevTNaWTViNSvfWS3CMyDEg5x61kwSNauUlGBmuocZH HWsrU7IzIzgfNjtXPOPKykyKBY2ORyKlaNevrWFFPLaO4IJXPQ1YXVS7hdmPqajlvsXcvT2gmwRw w6Vi31tcQy7dp2mtJ9REcbSlGwDjpWXLq012+0AKM4Ga0gpITWpqaCpSG7lII2rioL24aLaS2MVf snf+ytr43SPtGO4rK1lT56j/AJZgY/GjeSQikt4GlSSVhgMDj2rrGSK+ssxbTjla4SdVDgjgY/XN XtM1Waxf5TuTuprZxTRNzpobZIom2JtPcVlXuBLgfWtqC7hvoA0ThXI5HpWRe2ciz4GWPYisV7r1 L3RR3HIHapUPOCe1WbTTJJ5DvBVatzaI6jdG2a050TaxkocOcHpUdheXEExErb0J6VYkiMEpRhzi hoFA3Y4FJsdjUjkWVvkwVI5FVbzTZJObdgrdx61kPfNBLmM7cdvWty2mkurdHGVPWpcbajMX7FcS SlbhHyOhA4qe2DRSeWxyhzg1f1Gdox5C8ttH1yapxqvlbW5OODT5nbUCEuUcAn5SeK17C4jjwoI+ dCGz69qzDCGxkcjpSSxuij0qbpgWJrvY/lgZJqeJT5aSN161XESyqodfn24zT458WYU/fRcfrQl0 At2zecxx0yBXOtcyJcyqwyN7fzrotN/1AfvvJNVbSxhvJpzIMbWyKd0tw3KkBD4IrWtLwwRbCufS ssx+XIxj+7ngVOsgdFbOD0I9Kh3WqGO1KUM8LNwrHJ9qy5WEkmIhxzzWjeqrafuJ+YtgVnKnlnI7 1rHYhjXjlt496kjPf1qZL2WZNrNhx+tWLiZJdOjt8fMDnNVYg7BEKDjqf61XqND7i0aW3V2Odo/O olkKW7RBRyRyPSrSSSxqQfmhBwGqBwu9sHgnikJImKeayZ6hRWhpW1rueYfdTAFVbFkkieGRtrAE o3pTrYtFbvCvUtkmlbUZa1CY3EzAcxx9cVnNfSxyqFUbfappXWFCgb5m7VJaWctwOE4Pc0m7Aa2l s8lsV6/Mcmo00+OCZ2K8tzS2jtZyFHwFqK41ILI2BuGKlu6GlqaFrCiRFtoG6p0KKcAisNtTLAAc IABUL3kjZ8rOwjP5ULQVjoC4d9oPSnY54rC07UBg78/WtiK4WUDYQaT31HYsjA6nmm/KCS2MGmem etZGq6pFFMYyThB29atO5NjWnhhYFiQMe9c/qNzFPJsjyVUYBFZ5uXmHmF2APOM1MsIaKKZMkMvz expuyGkNSaWHODuUevWtG0vY2hLk85xist0BXBOPpSQRBc8k0XQ+Vl2/ZLguVGBGoyfc1kqvPpVt ldIXXOd3NQDcuSw5xTuCRIWA4PJzVqGJt/z8DGc1mtIfOANTPfSeWItpBHBNS0xE00r4kSM/u2OT imrPCmPLT5+hpbdl8ghuoNH2RWkDBgFPWknbQALM6kyN16Vp6RqAuR9klGTjAPrWSs8b3yKy/ulP TPWtSMRWtwlxGuFGQy+nvRKOmoX1K19ZmwuUmUZRW/Q9q14k4VlOUIzU0rQ3kJQ4KuKp2qtb74Hb IzlD7elZPVFo0YwjH5hxioprG3c52jipI87Txn0qJp9rbSDUp6CtdmddWBiDOgyhHSqEbDG3GMV0 QfK461m31ozzl4lwO4q4y7iaKIkxKNp5birsgTBAGVUdPWqXl7Dgjkd6nsZlW4USfcOQc1XoIoC3 uY/MkHQ9jVdLh1kBkJI7iusuIkkhZU7jqKz3tbaWARzR4dRwwrRNdSXcXT3tp48NGMmr0drEiAhA o9hWNp8Iil3eYPKzjNak+ooR5UeCMYzUW10KKWqBpQUjQkjkGqtvayLG/mHGRxV6C6EZKtgjsahv pmRN3QEcGqvcWxWDFoRnqKZDuUYHAzTYiXUe/WpycDaooQ2NTknNMmUbi3QGnFtq8darXTyOhZFO xepqiR9nKYbooDwwzitu3IOc1ztnDIJFlatmGfbwRSktSkWJACxNYGqRYlLqeO9bYlUrknmse/BZ mOeCeKaJZQglkhl3xnmtWz1KRwVZseorMZfKBJ7Coo5DFIHH3e9VKKaBM6CaGO6yTjPYis2WJ7aQ q3Tsas27FirIcq3Iqe8xKoXaSelYp2dizPkuC6Lnll71CUONinvStE6SMpH3Rmljm8qdGbpnitvQ hgto6yRpj75zW5jZDlfvAVKkQMkTkDDJwRRajcHDjoSKyk77jiVJlb+yZ5ZOfMwB+dc79xhXXztG dM8rjP3ce9crMuyQg9K1gxFyyfDYPetQHpWCk4jdSOcnFbcZyozQxE6dakFRLUoqWM5CPLgZPWrd suLmPI4yM1GkJRhtrYsY4dh83GTVSYkV729VLpFjweKZcRSSRKx+6eRUWoWaQzeZGetNjklEHcil ZWugv3IsbDz1pXDsoAFSABgHPWpMjB5och2IUj8tCD1PNSoisjAUwsWpchDS3GTW77WAOMCqyWgn vA7f6vPSlZiWAX8asR/IKSfLqN6m5biI25VSMkVkGEw3jFhwORSwTGNiQeh6VNPdJJGcryahJ3uL oQTRFHMzN97gCup04rJbKB0wK455NxUNnA7Vu6NfBMIx4PStGriNO4twc7uhrFvbFoCXQErXS7kl WoZowwKkZBrJwtsNM5KM77gKvsK2tSu2gtVhUffBUn2xWbIi2upZP3eppLq6F1MMfdXpTYy3p14b YgZynet1bqK5t32tn5TkVyQYqfapo5pI/mQkeo9aqM7aMTQul28dwMheFJz+dWdWuAsawL0BBNZU Fy9iG2HaWYnkZGKJJGnBkySCaTjdgidJo0HHBJpl1MS3J+8KqOwKAHjA4PvUEkruACeAatRC42T9 5L834VPFG3ls2OBTraDc24jgVbYERlccGlKdtEFjPilIDfMQG+8PWn4Vk3Yz6VdigTd8yKTjjipI IlLBVTAz1NNyQkmU7f7Z5m5Y8DtV6ITMwUrhjWgPKGEU5b2FXbaFIiGf7x9aycvIszLiKeBEZu5x xVG5kdnCsOFzz610jnzZ2BAKYAFZurWD+WxiXODnikpdwMmRVTlTx1rStJFESsO9YhcyDvnuKmhl aMAEnFatdhHbWk3nxc/eHBqR5EUYYjPTFcrb6vLARip1mkubkThgRuyFzVuWhNjYutPiukIYbWI6 isC901rZxuGR2atptTKH54WwB1FTie1vYgCyncMYNZuH8obbnKTqZLMxr13hvwFJbQruAI561qal Y/YzviyVNUGGY9ycNWfM9mUixf3Rt0tVTsdx+tWbiGO+j3IfvDP44rLmHnR/aZgQigAfWptLvFkm ZQNqJgrVculwMu8tyJNg/hptraSSttCkZ710L2ccoEikZZqsqIljYAKGHXFV7R2sHKUIbQWuGQnI Xkimf2o6XTRZVuByeopLq4ZcrGeSOM1jzWcxkaRSWHXd60oq+7G9NjqYL/ODgCrwv0RNz8L61wtv cSlvvsAKvXF+81ukLn5U5+tPkaYrpmpPNFNdlj0PANXXtVkgAU4APJrn7jKsjnKZOMH6VswyM1qi BicnJI71DRVypJpMfmB1JOOKvAeRAViHzYwKnjiYAZHWoxc20RkV3VSDjk0XvoBnLERe+bcHJYf/ AFqbIF+8h6E8U7UbiF0UQHewbt6URTRyqF24OMVT0WpO4iuGXJBpTh8A1OXRUMTqFKrx71XDKGyD 0NZlWL5jCtkjpms1lCbh3JrTkfJP1qncwgqZB2qoOz1Ex+nyFV8rHVuKr6feCK/eJxgFyoNW9Ni/ eszdh8v1qKTTQ167g7QfmyPWqdgRC4EdzJEw6McVPaW0cryjPzAAj6Ul4myRg4y+Mg+tUfOkhbzU bbuGM042ejE/Iv3JihgaC4HzEHYfesyTkDHYVNf3IvI4yx2snT3pigEgN+dPl5RJ33GqgbBPpToG aORWI45BFOjXLDFTrEzZOPwovYZbgjhfERB2nn2FY17ZS2U7ruLJnKt65q5FM9vJucZTOD7VreTD e2TKSCrcq3oajmcXqVZNHNJKygPsOOmame6ZYdoBDZrTvrBoktYYgSmcs2O9Pv8ARj5HmR8uvb1q +dXIMNGYzoWH3jXT2twIolGQvGa5iMMZvmBXbxg1cXUYzE0btggYpSTbKLd3OZ23BuDxVUiQo6qB 8yYqMTxg/K4K1NHdQvIEjbccZOKhqSeg7oqKkg4LEDoasWzPCXJ+YAEY+tD5aQlx8p6e1P3ojMGT KEcMKrViK9pIQpRhitbS2zcKqHIxg1QSyyweNsqe1bOn25t4sqvzHvUvcC3fzG2tjJjcw4Cjua4m SR55nkmz16HtXZtbtOdzkkjoKoXuipIm6MbWPX61SlYVjmskxDHQda09Hv1tg8coyjHI9qqCB4SY 5Bg1GAYsYHGavSSAvXQja6fyWyhORQgweKqo+Oc09JHjYHPGc0mhqRaKyEYKHAqNoJHyQtSf2k3l lSo570q37KcdRU2Y+YpmEkg4JbPpSXCsGG5e3pWpDfwhgWVakubq1nwGUE+1F3fYNDFGScDvT0T5 wC5A9KT5d+QcCpUjDnIYZqmSif7PZpFnOX9RV6MJNHzyCMVBb2MbAhmzUcIkhnaPB2ZyKi6Y7WKc lzcQSPDG2FRsj3zUsN9cxzp5gDLkEk9celP1C2P2iGVRwXAb6E1vJpkBAZgCabfZCKkepgfKRt+t XPkkiBBBapjYQsCNg+tVLy1SCIsHMZ9M1HI3uPmHpyRzjFNmbBwO3esJLm68w4JYetXIb4AhJxtY UnCw7iX0fyCReuPmFZvmAj3roAsc0XDDBqhPDClqzsBwSDTi2tBNXJdKuGkjKsc4OBT9RJitpXUZ ODVK3uNiZhjOAPmPvRfX6zWmxchm/lV2ERCE/YRGDjd8xrOlM8AUo3fHNayuAoB7IKrNGLggIM81 Seoikt3NwXXj1q3DeyzDyvK3KepNOltMMAT8tWIzHCuFHNMQRwiNMHioGmRHUZzlgKmk3yKdoJPt TE0uQoZJOO9J2W4zSvLGBLQSJyT0NUIpEG6Mj5TwasIztEsTH5UGBVeWE43L61nzFJFRJNoKA5we Kja6l8xlAGB0pZ7Jk3SoxA64qCPIHqTWyS3JbJhO7YA/Gmz7vMjDHKgg1IiDah/iB5FJIhlBIP3c GgRJfQqY16fNiqclpII3wny4yMVau5MmNRzgVfkZRZgINz7elJNoGYVheSWz9MqO1bsV/HLECqgn OazLfymZgwAbHSoLWQxMyfw54pySbuCNC8BkzIn3sc+9UAizRbTwynIrSiYOKgvbUIBNH36ioUra FWJrC7lWJYZOQG+U1sxgJn865aKcqm0dRWpb6oXAD4zRNNgrItX0QW2lkBxt+b8a5y4bzWz3NdDd Src2rRqflcYJrnbiFoZNucgd6dMGS2lurRmV/wCE8D3rVtCTHzUFtCv2VSDnjJqzbrtUVTd2SWFp 4pi08UgOcQnPtU6tsOc8VXjIzz0qQg9qGCL7Qfa0RwOBwaJdObblWwg61c0eRBAVYZIqO8n2I0ag kdajmd7ILGO+YzjtS7gR9KdIGkUqq4NQtE6tzzWlgFJGRg01gzsAozTvLOQTVqLaAAMZ9aL2GRww MuMjrVjyckD1pHkZD60gmJ61IFlbcBeOTUJjz+BqxDcADgVGcYOTSApSJ+8Ap7u0OGXtVgxq/I61 BIyOhUHLZq7gPh1mZcbXIz2NaMWuuBiUBq5+BQbvbjIHWrs0Ss4x0PpRLQEy/dXFvdISvEh9artb Mi+Z/DVUxlPpUi3LouM5U9QajQdh7A4z1oR+xqxDCtzCfLOH9KrvE8WQ4wamwA6B+DyKZCfs7qCu Y89KFZh17VJkFeaL2AqalIpnZYhhFPFR21sZSMc7qfLH5ZZtuQfStHSmiVM4yyjIrS9o6C6ksNu0 UYzHwKmsrNrlmlIwucAVfS2fzA7NkEfdqzCFjXYOMc4rC5RXj0+EEkrzUwtoUAGwU96Y542g81LQ zOASO5mKYHPFNFy8j7PTvTprfY7SNkg+lVnlWN8DAyOKCi8ruFUqe/NEuoYfbIpC45NVY3yODgAd 6zr+5zIFRsgdcU0m9BMbeIkV3ujHHWobqUEbgMD2qeBPtCuZG+Y9Kb5LHhh04Nap20Fa5HaypJHh uDjvT4Zmib5TjvUF5F5W1h9KRGL9fzq7Lch6G7b6hEVAnJ5GKiPkw3DKv3T8ysO1UVh3oCR3xRKM jBJFSmkx2Og06Y6nZShzlk+XPr71lKNynsQcVDp969hIMf6vuB3rR1Py4mLRf8tF3cVFSP2kJEOn tFPA8L/dz0NUb2P7JdZHypnj6VBZ3DQ3QDY8sHmti7to7qHsSOQa0aBFOwlN9MYkYhlGetNujJaS lZSdnrRpMBtb0yE4xxitTWLcXNsxQfN1H0o0voO5imcORgcevrVgMJE8tTtJBBNUEB249KsL8sLS n+GlYCCXTZIPmiIdDx7ioJE2KRICCatRX/lp++DZz2qVLm3vcKQM54yKq8luJWItkmpSRs0ikA8q OMCunt4RHHGVHAHFYEEEFpdcHBPBrXa/XYoHHyjFZzbZSVi7LKiqzZxsXJrl0iNyJJZchWYkZ71r SxvdQygN94gke1U5CFVVxgCpvbYdisFCRvg4bOAMVS86SGQcknPStKQKRgVnzKI7pSc8itISvoJq xce7AlVpz161Cl7E8q7Sc7+mO1OuY1lQMvXFRG0UWpkyA0Y3H86dovcG2bjyfex65qBZt0QU/wAR P86ci8lfWqmSMY/hNQkNsv2LvFZ7WOXiJyf1rRgmWdCwUAEZGay4Z4xu3dJc5FNiuxHFMFblExSd 2GhpRCGdgzMC3T8aw76IRyMkZzGD1qFHnhKyq55OetNmuCwBY/LmqihMmFsTFuU5x1FSSwNBGruQ AeQKZb3vlAgpuBPQ1JMI74KPN246K3anZi0JbdBkN6U4uynjuaS2ie2JWQhgRlSDmnOC8g2+tRLc ERSAyhs8cZptvJIkASMkY6irdztWTKAYxzUFqpDSqOvWlJ6FLc2rSdbi1CsctjBq6GBXBHQVzkMv kSbs4Oea24LhXQHP40oyBoz73To3maQDGR82KyFt4XJR0GzJ5711jKCOOQaxtSsGRWlT7ncCmm0I yrjS4XkQRSEq/Qe9RwR7POwgTadoH0qeDfbuHySobcKZeT+fOrxrtBHze9ap3QtgmlxGMdcVMoDo q9iKqhGc1eW1dbcSMCAKl2QxIZzARt7CtS01NZP3cg2n1rCZgcEdjVm12tyxwQc1IjqIyCMim3G7 Z8nUc1nabqH7zyJOvODWrkMOOaq11YWzMbULQXSCSMYkA/OsEph8N0rtfJVQSPTpXN3kCys7oNo7 CiKcVqO6bMmeNlbKEL9elRG4OOVq7KG8jlTnp0rKlOHIFaR1CRZ87IwRSpKufmNLaWskkDTEZUdq WZFABx6UXV7Ejy8bDhT9aQPtOantgjnygMHGcGpTCB2FQ52dh2Ki5kOFGTU7Ws0ScoeeRVvSlQX2 0j7ykfiOa6KVFMYJAyBxT5wscpZySedtLFccjNS3eoMkwVQCX+UCma4hSa3kj+TcmDj2NM0pVlvI hMNxLYGaVr6juagXzbUbs5xg0yG/mjOx2wy9c1fvCsUgwuEIwadaWVvcW4MsYJORnv1pJa2BvS4y LWo9wV/vVDqNyt0F4IC9femTaAkEwmhckA8qeahuZEt4pQeXYYWqba0ErFS5cRJ8nWsyaYtk55qd yWjyTUVtb+dKA33e9EYpLUGzS04iW0yGPPUZqvIfMuPKLHYG5Ga0NLtY1m8s8oRUFzYm3v2C8pJj H1qXbUa3LggWO22w87u9UIbcbiTz7Gtq2s5I7YB/rioJY1jOTjk1ldoqyKEkY8sDow4/CmRyCBcY 57mkuZkMpCH61Ax3d+a1jqSx0twWGAKbASW29aZ1zVqwUSXGM/MRkfWtHoiTVso1iQFhkn1ouJSz FE6U24kKqdg+Y1Er+TGGblzWT1KSGk4HPFLCnmAD1NQNIZJfY1fgiITIqLajuRXNsrRlPUVnrppW Pg9+9a6few1Ok2g8Dqa0vYmxzt1HJCT8vPrVaGUknt61p6nMSrADnoKowQZwmOvWtE9LsTGQuJZj uPPatOFBKCoOCRWfLZvAwkXlR/Kpre5KOMc5qZau6Gtive2j20vOeTwwpj27mJQOq8k1tM0dxEyy jkjjPaqtqAHCPz/CaOZgU7abnaTzWpGm6MhuQayLu3EMxC8HqDTrfUGhOyU0mr6odyC7jNvIV7Hv TTucgxjn2q/PGl2hZWHtVa2PkTBZR1PWrjLQTRLpVyfPEEnQ9K0ZrSORXcjAANU4LbGoGVR8g6ex rVJWO1PmchhiolvdCMeyC7ZBuII6VoQ8YzVSOMBsgYq4gGKoCbjNOFMXmnigDmgCKl3BEx3Ip0+0 sCikD0qBm+anuBcs7o27Yzwasyzq2SeSRVFRnDDtVqC1N1ny+MDmlZARhjn5e9BRiemak+zywPhl p7PsXkYJouBCYBtyetN8rHOaZJeIGwzd+gprXYf7ik0WYyR12oxJ6etUGkdsFXGfTNWmDzxkZIAF PtNNIG6QkZ7U00txWKMNxMGxnOavwQXE6kjOByaZcrFC2xFxjvWja3yJZCONSZCCCcdqb1V0BTDO zFIjgAYJpJFW3jIFTjESE9zVK63zDCgn1qUNkFuSn70v985xWminaMc1Sgttq/MDjtmtGKJtgIbg USeokKyAj+lVpLU54PU9BV5U6A8d6WBPnJIyB0rMZUgjliZSvWtK3uYmRortcN6mgqPMQj1zRrUA cIgGDI3Le1Na7hcpz2+0kxEMlQE5XFRSs9pMShJUHBFP+1RTf7L+lDiMDzGR1qDT3eC+WMD75x+d TBiD60hPlzpOo5RgaIu2gM6mMMB97NSrgMWI5NVLK7juoy8fY8j0qfzgDzWdmhj5WBAOMVWdiWLD oOKLi5XG3IweKqvdRiMjeOtDTGjRQBo8NzkVh6vYtbAzq3HQD0qU6tFDk7s4rN1HWDebYwCFBzVR jIVyJLiQRFQc571CzbRlhkk9amg5Tcq8UsgjP3u1XezHa4ls/Jx1zUnmyGQqTxnJqJTtXEY5J61K sTBS2Ce5otqMjuM3CEL/AAfzpILWRcN/CeCKlwbZFA5L8mrkMhmGAOaUpNLQm13dlXEkKkfwjkih pBPBvHUNipdQlVICerHoBWdbr5cZbcc9SMcCnD3ldg9GShiVI68VYiuQyt5pyVXAz6VTgmLMQyHm ppLV2YbUYAjvQ10YivLhOW/jPFXbO6lQmKQ5XHBpnlPt8txn09qYtvIH+9kVXMrWFY04dpbPeryX AW2LtyBkVnR20ix7wc4FM89xG0ZPBHHtULUpkM0PlPGQco4zUFzOCwhXgHqadLdNvjhYZ2Dgiqct u/mF2OfSriu5NyxJFvjORRHHGEV0HKjJ+tSxBmhXd1IpksbRRnb0ahPoNoYkhlkVc8k9atTb3aPa DtAxmqMcDhPNyeD27VPFeyJG0YIIbue1N67AmWlv2hupVBJjHyH24pBIJIx3Kj86LS3EsU/Q+ZyD 71WtEZcHOB3FQ7MepOHypJ6DqahlMcn3jggYBqVlDAoDgN1qC4gIYKfunvRGK3E7iFmtJNrHeCAf zFIziRWHOD2q/wDZPtM6hxwqqoI74GKnXRo/lYtgKeaptXBXE84eQrDrwDVcgEfjTbj5JWCjEe7K /SlBHX2ppCbIbrMZBBPFQwlw5+UgN696mlO5GB596gRnG1W5A6UDRd8sTRlA3So7aON7pPNIEcZ3 EeuO1SW7Kh3Kcn09agl+SUkgqDUx0egPYtS48wnAAJyAKmjhRkzsJJOc47VWhn6sfnFWYr8oCCnF Q730Gkh7RRrhopMkdqjinI5NQiUKxI6Mc08JuVmXpjJFN6haxYdvMDFegHNRR5EmQcZpBIREygfe 4NIrkDFTbQELLIrEtnkdqmsrsRS+U5IB5FZs6hyeSDntT0zIVY9aXLZDudPDNlcCpjKrLtIyK5wT yxn5WOMU9b+RUBYjOfWpSfQbsWr6BY+VHyntWdHas8hMYyuanl1AtGVcZqFLqeC13xxHYTktirhF ols0IbOG3h3zMNx6VnXOqNNJ8vyxKeB61Qlnmnfc7E1EcjINbKKuQ2SxybXIzxmrcc6Ko3N7VnKR UmGP0puCFdl5LtYZ0KnPYn0rpNPlChg0oYZ4NcWR2q9YEGZQzEY9DipcUtUVc7cEYrmJLy3SWVWY BtxAH41elubiSLZH9xhjI61n3GjrMmOVb1pSknowSIjO0Z3gB074pLvTkuL1cKAu0Z96rJay2BCv ypbk1vAB7kFeRtBrOT5VdFbjYrdY02Kvy4qrcaK075jbAJ6elbcMG7rVpYgvSs6UZyd0KTSOM1KK TTb+NXA2YBDAdR0NPuZkTgHPFdTqGnw38QSYfdPB7isU+HYlfBlYN6+tdE4W3JizNspG8+OcMBsb oe9dVKcoMd6yItCTa6mRg2SAa0LMTJGY7nBZOAR3GOtQ7NaFGdrdvvtAwH+rfj6Gsi0k8mVJB1Rg 1dNexeYjRH+IVy5Xy5nQj6imtgOmuZUlhk9ulS6fKEhCE9+KzbeGSS2c5PC8VPaSbZIVYdU/Wkn1 Bo2DjBJ6VyGqyq9y5X7oNdLdbpLVsHBxmuOmfzZQp6sa1TuStCW0ge5YZU+WvJNXlhztjiQgAYz6 1Z0yKa3ZIQoIDZJ9Qa1tsa5KgA1nKQ7FO1tvKG49aS7Xdgj7w5FTyzxxqcsOKyrvUlwNnJqFqUbN lei4zFIMOoqjrEbqgkThQay7G8LXmGO3d90+9bVxeFrd45IsnHarabFscxZo018VPIxk1bubZkye wqxpVmVmeYjAPAFac8UbxlSKfMkwaujm0OKmiYxMsidVPFSm0ZX9RVmGzBYg9KpzVhKLHwz+cQzD BPWnMB8+4ZwOKnZYoYscZFUJ5izlVOA1Yt32LSKk84gjJwdzdKng1pyFjWIjjGT3qbyRhQ6A0zbE G3YHFaLToQ9S8khlAJwGPWoJ38twm7rUQm2rkcAng1nXV0vnZ3dBQo3GOvDvuCueAKvaZbB1Mj96 yfODHf61rJdxx2O9SAcdKp3tYksSMkSFCu8VmzQRIDNGCjoQQKvwSxyIGLA7qh1CeKOMR7cs3AqU 9bDaHzWqyt5qsVyOgqgp2T8HIzVmS7CwkfxHimW9v8odj1HFLbcZLJHBK2JupHBrOu9LJBaJgR2q W4kDzBCenNLLtwCjsKqOiEzKgEsMu1twHtVqWRGXymOD1DYqwVEgHzcgdcVE8K+Syycnsaq6e4tS G31CWEMikHJ6mrqTSSDMjk+1ZSx7SK0YDlRVsksr1qZKgWpkPNQxlhelOFMWpKQzAdnKqXGOOKiI zStO0hVTjgYFGCBzTAehO0jtVjRr3yLowuflPSq0fQ02IDzCx65pJjZ2aIkwywBqjqltGVQbRndU WnX4JCE4PbNKZma8cSHKn7ue1Nq5Gxz9xZkM23sauWUMaWwL43k9DVy+tWVTLEMnuKokLKBzhh+l K7asVctxMsfGBg1KZFC8VkTefA3zHcvrQl8GGGBp8o7lmaBJX3MfyppdYhhRimb3cfKpH1pRFghn OeaV7DsIMyPhjhaV7gRlkjAwRio5JVL4PAolRGQFDzU37gSrOdvQZpI5ZG5LYFVCj9QeelKkUpG3 PFPQWpp20oYkO+eavRnqqjHFZ9hCrLhh8y9/WtRBz+FRLQBtom9xu5APNSaxcJC0Ab721iKmsECz OW4VQSa5zVLiTUL0yqwEYJVOe1EFdgSsjTKzMODVK4s84KnBrYKiO2VewGKhCCQZ7mmm0VZGKs8s D4bkCrH2pZBhetWbyxL544HcVnpG0R4FaLlkidUzT067+wyMW5RhyKSfWmdiFAx/Kolw/GM8ciq1 zAElYovHuKElfUL9gkv2Yli5+gNV2nkb7uRn3qeKznuUVEB25zV+DRpYAJHQtg5xVXiiW2Z6oQPm 645phAaYFfxAroXtIJkU7NpAwfrVKxsRHePkZ5wM0nK2o1qMsflt3Jz7U5Ru5K1emtTbJlsYFRR4 ORkDAzzWL1dzVPQgKsWHHSpRu2si87hg03z0VSzc+1WLGSNI2kcjJPAp2a1FcIbV59qlOnGa0otO VBwdvqar2mpqhIIz1qC81ORmwuQO+KjW4rmilpbxhmZQ2Omahnez+zzIVCswwKykuZcgEnGciiVj K2O/enbUCaC4t7Y7VQMw71NcXiOUK4Bxk+1ZONu/+92p0ALNufgdKpxQrl2SeNiHZe/aqUkrhiyD jNSlflI9eRVcGTbnAxTiJkwupxtXfxjpTDKCdx6nrUDcHd2pI28yVQO3Jq7dQuXrOzMhZyRuPr2q 1JpMjIcEECrN5bw2dnvVt0jgH6Vn2GrtGkiOc5BArKzYxixGNzuOQBxU7gGGNjjJB4qK3BnlWMnA 9asTW6RZ8yVQoHBzQUU3IWJlrBkmLMdvQ1o312PM2w8+9LbWCeSJX5YnOPStYvkV2Q9dESac80ce f4ccCpif3hpCzMNkKkgdTVu2tisRd8ZYfLmobvqUkVgrM3y9a1rXTVmtCZT+861GtsiyqFOVXqfU 1eeTyioHU9qV7oCuscguUCKBGg/OieQynYn3R1NQ396yDy4z8x6+wpY3UxqU70WAq36AOu77q/rV eaVFZcKQrcZrRuQHjwRyKy73Y9qSHAI5Ve5qo6iZEzr90HOTTtvBz2qrC3YjmrESvK6yE4jB6etV IEbGjWqzW5kZeQ5H4VNfWgOGZeMYNalqkVtBwMAgGhlWZCD0NYt63GjAi8st5SAggDr+VRTFUJ34 yKtXCJY3248LIhxn1GKyJ4JLws7PtGeFx1FWlzahexbt0S4iZ0YYU4z71K0Em35OcjBxVe0Ty4Gj X+8D+lXbIOz8dBUvRj6FRGkR9roQPU0+QgkdvWtaOJZk2Muck1zswmgupo2ydrEc1SV9SbkkhCEO eQDTrQE5Y+uaz7iR2YgnGe1WrCckGM9RTkvdBbl2d1QADkmqLuXOT2qdj5hwOfSo5cAgVMNBsnsb drydUzgY+Y1Z1K7SO3Wyh+7H1PrVZLlokKwjGRgnvVdlyA56mq6isQqGPPSn+WG+tSbcD60KADz6 VVwsNEIyBU5i8pDu9M0sKPLkIjE/SrKaXdTLhvlB9alyCxmbdzYAq5b2F0MSrGcDmt20062sovnw zHqTUVzq8MH7uIbgD2ou3sIsJcxZw5Cse1TkFgTjiuMubh5roy92OMVvaPflh9nmbnsTUyhpcdy9 LbLKhz+NUo2SxuAj5IPI+lagXB68Gq2oQKQJR1HFZrXRlE8epwdI8sR1wKf/AGrCozKClYb24eUO M8DJwfSoJx5kYk39T93NbRlyrQjludQNRtSu7zVx9axtQ1MzygQ/KE6H1rLVOKcMZyetU53QKNi/ b6pIsg8zkHrWsZkkhEisDt71yckpG5QOM8mrlhccNbs2BICB9e1Z2Gbl5OiRrKxGAK5SW5W4v2kA 2h+BTtQeaMqGZtjdQT3qkMrKp/KtIpNXJeh1Vhq1o0BjdhG4GDniqr6pbx3GQwO1cCsIxswZk5I5 IqFQQ33c0OKsNHR/2hNeRlYhtA70z+zRHE8snbBB9KtaKsDwB1IBxyKbqd7mFo41OBwazV3oNkJ1 Qr91eQKhl1CeQfKMZFVoZombaPvelTyAMucgHHSk7IaImLyYLNTZIQB85waWztnuZQu7heaW8Esk 7xtjC0X1sOxTKomcv0rWhu/NsUctkgbSfpVGO3QffAII7iq0jPAJrcDaA5Iq42ZLRv2N7F5YBIFW nnhIyGrmbSCULu9s4q1MZ1IQLjI61DhqUmjSlu40HbNQNqOFwuBUNhCLoyRSn5wMjFLPpLRI7DL9 xSUUtGNyI5L4MetQqTK+c4X1qlGjLKFK8k4qa5iuY7gQDgE9R6VpypEORfFwBhA25qmW3LZzIDxn FQS2sdnbCXPPfNVr262oHifB9jQlfYRIXZZPKU9T3qGayEhV2TaD1AqKxvGLkOu49c+hqz9qYgRu cHPpTs0wZT2APsxgA9KZICpChmx6Zqw8JLHa2c00RNvAfqelXcVhYWMajnitGzie+glwwLAgKDVC S3YcHtVzT5TbPlD9axk1uWiM20jTsjD7p5q2S23CjIHFI7P87r1Y1ZsQn2dQWG8k5zU35gasZBtp fMaTGc01lYgZ4xXQyW6nletQzrFszIBz1qrsRihcd+ae5BiOecCp5khKFozyP1qADIYEdaLgUQys wOeatwiojYNGdw+YVYhHbvW3TQzZOBmpFpqipAOKljJF6VIKjSnikByrsd2U4NWYzviy3UVCMDPF TQxykcKcGrYCbtqmmwnj6mrBs5HPTFOFjIvQ1NhtjVYKc5wRWpZzwzo3mkbu1Z39nsVJaQA+lQrb XEZJFFhXRvwXG+F42IzjisO8k8uY4ByD1HetTSYEmVhK+1xxgmp7jT41RywyqjcTU3sx6GRGxnhw V496I4IoBvYjPvVZrt8YXhTTJpGlAx0p2bGWpLlcYj/CoVm5KucfWolDLtIAyPWgRszFsFyTRZIB CXZjkYBqZV9W4q7bWq+TiXl2HHtSLapnaaTkthpFcx8E7qjLMCAGrVudLOxFV8Fhmqd3pwhEYWQ5 Ock01ZiuP0+TEoUng1sAkg4rDtoxG6kt361dk1FIyQvzEdMd6iSuwJtTufJtFgjcB52IY56L3rHY oFCxlWx2HaobqR55Q7nJPA9qfBEyEOB+BrWKtET3NjIkiXPQ0CMqo24xUVoD9nw3UVMSxTjisWi0 TW4LxSK2OTxWLcvslaMKAVPWuisFjYfe4HWsC+CS387x8jOKcN9RMjtPmnA9etaE1uGOCvbOaqWw MEokdSFxWnJdxonUZPSrb10JILa6W2JVl9s1qQahDIoG4ZPrWLKySIfWqysVYqeCKLJgbmousamV cfKv3R3rNium8xXPC5BIFV5JXZNpJINQyTKq4Bo8kCLeoXZuZdwyqgYC5quoZ+c1XMmU3deOKdFO wU5oatsNDynzbWNO3FM5/CoXd2bcB9Ki82QtzgfWqVxGhG5HPrUy4Ylm61miVsCpluCoyQahxZSL jsGwFGMU1cAbt3JGKptc5bgED6VG1wSfkUmhQYrl0gKM+/NTAxiIk8c1W06OS7eUOQAiFq0baxWc EvICvtUtWGUcl/unoKgd/wCHOfan6pH9nmMcJOOtaGg6fG0IuJzk8nmq2VxGWqyS/Io60gje3keN h+84FXZ1C3LbD8pbIxVe4R2k3NnJ7nrQpXCxMGmUrHNyrcZNRXCRLLuhYACmu87oqHovQ1FFp9xc uACcE0abtjJLISXl0ILdjnGWYdqXULNreRRJIXz1JrY0+3h0ndkjzGUA+wqneoLzWFjGdgUZp3S1 QtSjaWHnfvCCqZ4JrQjtgGIDZUdav3MSG38tBgoRwKohWAwCRWbk5alpIignMEcq7QSTxmrFuklw wXOQB+VV3X5wgG5zW1p8AtoPm++3JoC5N5KxIp7gdKqXM4gBY8yt29KvOdib261z0vmTaiUJ47+1 NCIp5dhGTlpDir1snlIq+nNQGCCG8V7hxjblR709rtU+6A/Han00AszRtKDGpIyOorJk05ldhuAz xg1reeIIfNLAl8cVkT3Ek85LHGT0qo3QmMtXWC5SOVAUBKsTz+NX4tl3dpHEAIwTnHbvVSODzyB+ daunWf2QM4HWplNDUTU8vzJQSfkxwKkklSLHp0qublQBj0qrIxkznJzWRRW1X/TWXZ95BxVS3G35 XPJ60lxcmCYBTyV5qz9mS9tlmibDEc49a0TsiRLVVmnlWM5KrmtixttkG4j5ielYNvDcabP5qrvH IP0rUg1+LhZUKZOKTjzO6FcvQRlbnHYc1gasynUbj0DY/QVupqFtiSRZFOF456muZvGL3LtnduOc 1dugijNGS24duTWvp1j5ULyuM5T+dZ53A9K3tIuEewZJfvHKgfhRLVaAtDA06YvOFY5HIHtU88ZE pqK3tytwiqMHOTWhKnmbT0z3qZNKV0UtiBUwQfbikaJyMYPXrWrDbRW8e64YYPArTW0XGNoxWbbG YEVhM/HHWrA0oRqXmbAFaTwG3ikmQnKqeKzNVvGuggizsxk/WmrvqI0I7uztIkwR04rKvNflaUrC oUA9TVByYly3BHrVa6bz5hIp4IrSCEyy9/PPLiWQsO4HSmfdGfWoYwABk4OP1qZAJWjQ8FmC1TAk +xMXQlgM8ipEWSNy56hs5FQK0rgDOduQPpU6O0bbW7jBpXYWN60uvNhAJ+ZaZJcmTCdcHmsyxlKN juo/MVbOFkDpnB6ioa1GSB41aQOdo28GqkiQvGjg/eAH41Neqk8W4cEelZ+nKz3scTZ25zQ11EOd XS48teQTihuGwRgjqKtyofP3EfMDmnajavsinReSMOKUXcpmchUCQOPvLj8e1V3baAynDDn6Grf2 WV13BTt9aimtgj7Sa0TIJb65W404bgPMXA+tZyEGIH0NXrizMcEbhshhkVRiGTtx3qo7AT2e5pwu OD1qVYQXZBxt4qxbJsckj6UlyCtyXQcMOalvUEirGJrfc6MyjPbpVu2SW6KENwc7jRYyAzPBIPlk U4z61paeiQWu0dQxBpNsCJtMRWxjk8hqrJATJJG4yyc1rTXKhAScY5rMjkNxNJNEQCvyn3qWrlJ2 IzG8BJRtuaqSShHZi2WxU0gmnkcO33Djiqc9vjae+cUJdGMbLdlo4xGOR1pZZ1vJmfbtLYyKjmUx Nt9QDTEGZOB2rRWtoLc2kkRdoAAB4FT3CNJGTj5lrHZiigZrRgv4/LCyde59alCaK+j3Hk34eVht YbfpXUny2XOQR3rkpIYnY+W3y1btpFjQoZW5PIJolYWpcuZ9Ohl+faWHPHrWHe3xnvDJHxgcVauL SHJYHPesh8LLkdM1UUguaq3P2m18uTkg5PvWZc25D5j5U1JExRGYdqj+15jIPBNEbp6AyfS4c9eM 024GLhlJ5BxVuw2eVk8FOfwqlffLdMR0JyPxpptyCw9JmQAuMirg23EQ2kZ7Gs9HDKQaSBZIyfLb 8KbiFyW4MsbYYnmrltEY4vmOWNRLI5XMqZFTB/NH7vnNZyuNGjp0ayrtJ5zkVX1BJLPMyqcA8+lS WY8m6j2nIYciresyAW0kTj7/AEqEtR3Kmn6k10VQL1OCar6krpdsCTt6ioNIkWK5ZV79K19Sg8+F JEHzAZxTl7rEYThweBwanHKe9NY4XnrUZc7fenuA+zmZJvKkbKngE1YaMiXJAGRkVmjO/PerkUxJ Ac8gYFXsyWWR1qUdKiTmnimIkUU9RTVp4pAUo7GJOSMmpQqrwABTmNMNWSBpCaKXHFADDUbse1S8 UEA9aLgUC7o+5SQfUVJJqlwYXjJ+8ME1O8a1BLCGHAqXuUjMAyNoHHvUySRxoEblqV7eQnAOBURs n3bs8+tO19w5rEjxu3zH5Vp1sjNKoGQueBTljfgSEkAVbtPLWQtKdqoual6aIe5YUfPtTkjjNK1s yuCzYUcmqDaltBESkk8k4qCW7uZu5VfQDrSjAbkdB9oQ42ncR0qhqEgHll+WZsDHaqKTyRphVJNM HnSSq8vOP0q0iepM3IwKaiA4z940PMuSSCPwqo9ywPyKc+tHK2O5ft7T7Rchey8mnXsoS6KR/dXi n6JcLFDPJKfm4qkw3uzepzUvTRlLVl2yn3T7SeGrSWL5d3f0rCUGJ1JbH0q8NRYKM8AcDPFS432C 5M+UVgrFTg5xWGiGRMxkhu9X5Lxy2dpIJqvboVnDY+VjgiqirCepsx4TT4o3Xc7DvWfJCTOMfMAM VprcpHGiuuSDgH2qx5cB5hK5NQ73uCOfLbM4U4p0Q8wknkmtSSHYrBsetVmsiqeYrAE9qFK47Fdh sRiwz6U2MKyBmUEH1qaVgq4mAHHagKklurRnleoouBWuYgqLsb5f7vpVePIfOOKuSL8uGHFQbOQB xzV30EOCCTpx7UjQA9RjFDMVGAMHNOjlDjDDLCp16DCGBBMFc4Bq1eaVL5im2+eNh1ps8ajyyDyw 6VtaWJFQAjIAobsFjAn0+e3jVpFwDVZhg5xXaSIZjskQFe1c1q9qba52AYVskUlPoFinZ3L28ku0 ffQofxq9aicL+7JPtVGKPaSxPWrVvetbyZHI9KctdgJ5rN1vYjckEScHFaCL9jh2xruUgjB96rLd Cf8AePyRz9M1OLphH8w4rPm6MdhbKxGN8gHFVJbaKWd3UMS5wgq9FN55AY7UHUDvUmnRbrqSVuic AVatYTIodKVYwJOW6mkvQLKBPLIAVsn1NW726+z8KMseTWLezPd7Y3OAx/KjQCexaO7ZjtJYn7xq fTtNcXUlxPwc5H0qoLgaeixQ4JxyfU1Kt3dTjrjjnFDdwsJc3CfbyiNw3HFQZZpAi8nNXLe0AwVT nqSangtFSQs1SUMtrZYRv27pD3q0pIP9age9jEvlR8k+narogEqDLdfSh3QjNuzPduIosqgP3vWg aa8Fu3GXbljW3HbKhBA6VNsUrz0p8smrCukcxe2izsrDqE4qrbWzNLjov8XtW/cmESqsePf2rI1S ZYIzFBwX+8aI3WjG31RnzTeZJuxtQfdHoKgx5kqhe5xT1QMOT2qeBAJC3QKM/lWnmSaFtaCDjq3e ro3gFMcVQ0m/jmuWt5T87HINbhgCkHPBrCSd9TRNFBlOMEVmXF2bY5J4HIFbVxIiEDI4PP0rlNRl E07bPuA4FVBXeopPQhZ3nZnbkmrkH2uyDGPOw/wmorBFlmjjPQyKDV29uQL+YHIXPyjtitn2MxId XO7ZcIfep2jtLzO3ANVZGUwiQKp38fSmiGR0M0C8r98VDityiOeAxSDptHAIqWUhk3gcdKu3Ft5d gkkvMkhGB6VRjyQY8cZpXuA0xl3UL1I6V0FjpyRyoT1xnH4VlWSo11k9VOa6RUKHzD/dxUPV2Gc3 dRSLfzBHVMOcfL2pm0lgm9iAenvVxyZdSbPPHSkaJY7hWHc4rS4kZ87SSSTKzHaDkA1q2evoiqk4 ORwWFZ2qL5UiyL0OQaoEAk4Oc0RKZ1E2uWbRsiksX4xiqslsWQFfu5BrA8omRGHTPNdHJeRwWaIz DcRQ0nsTsYeouHmMYGNlVoFHJJp0u6SQsTlic06MERv8uSRj6VaVlYV7ieXubd2p8Yydy8EcilVl 2bCatxxLsGMcCobsOwyJSCMdKu3qxPbQMg+cttqq0ywj5iAKWy33M/msMRqPl/xqUm9R7ErpsmGw c4q3EN0W7PBFQPnzCx7n9Krx3zxq8ezcEJ5HpTtcL2LLlY0IJqCwcR6hFnoSRVK4vPOlUjgAVNaS Ca6D8DAzmjkaQrmlqjm2u8gcNzV6OdLy3yvc7T9aoXMq6lErQ/M6Dawp+nWskcEvXJxx6EGodoj3 K13czWgaONcr39qo/a43C7+D0zWtqsqRTgOOJF+asiW1hNkXRgXU5rZaol6GzeLBLpG2J1LIMjBr Lt7Py1BfqeaZp+UgwR1arjthgtTJ2dkNId1+VenrSEDncaToOKD83SgBFVQ4fjI6Utw+5flJQ57G mhc8GkdC2AenrRcQ66kEsWAearaZJ5bzIx6GpCAq+mKijgOXlz1p9BlmP5nZ/fmmXmFhL9ww/nTr dsKu/jI5qZ4hNtQEbScnNZW1uX0Mi/Ja6JTlQAM1GoYYYDr0rTlVILkrgOlW2sYJAuzgdsVfNboQ YzEvjI7VEVZXzWneWLQEbTuz2qsUPG4YNHMMrRu28jotShjuJofADVWCzk8KcU0uYV7Gpaqs4w74 BqtqVilsitG2Q3aoYUuIxnBxmpXfzU2yZ/GnqgKsDjy/mpPLR2Hy/LSFAknlg5B6VImeQB0q9tRb jt2wlQcEelRSb5XPcgVJgSNzwRUyIbaZJQu5Qfm+lLYCqm3vwaUyBG+U1DcyAysyLtBOcU+2hMpA PU1VurFcmW6ce4qSC4KyZ24B9KuLZRRQkt94jpTVhXAwKzc0yrF+w+e5j78Va1wILYSNwQcUumQr FH5kmAx6VU8QSfaYRHH91TnPrULcDm7eZo7gOp6HIrtLSZZYA3WuRtbRndQRjdnH4VrWd4IYjG3G QRmrmr7CQagiLcNs6Hn6VSxmpb0Kx8yKTLbeazRNLilGOgXLTIAetOHLAjtVETOzfNVuE5X3FU4t CujQiOVzUoqCI/KKnXpTESDpT1NMFOWkAw0wipxGTR5JqhFfFLzirHk0GPHai4FbbSFT6VZ2AUu0 UXAq7CaDDxVraKUrxSAomDPWjyBVzZRsouMpiEZoe3U9RmreyhkzSApeQg6KKXyU/uirJjoKYoAr GMdhSeX6irOykKc0wKrQg9qia1U1e2H0o2e1FxWKH2TaODwaSS2BHynHFaPlH0pRB60D2MV7SRm3 byTTPschPJJrfECjtThEB2p8wjEhtJRnPQ1chtGXaXbOKvlKTaaTdxleSPcuKh8h1+62D6irbDFM xmhAU5PPx/rM49afCkzDfK7YHQA4q5HDu5PSnMuOO1GgXZj3xbuTVWK6MT5B4zyK0723837tZzWL jtmqVrWYjRWVZ4sjFRrgyH2HFU0SWFhgfhV2LqG6ZrNrlKTuPngXymYjBAqkIW8xQhwTV64l3IFx TbSVGJGRuBqYtpFGjbWMcqqTxIozyavLeRW6Yc4xwAO9VoShU56nuKlWwiZQV6570nZhsaEVxE0H nZAUDJz2rktWv/tt4XTiNRtX+tW9alNtG0KNgMMMBWCNzvsj5JBrSMRXHrchcoc07zF+8tOs7NpA waiSyeJtqDPPNVoLUtWVzFGpMuSSatnUhKwRIsR561StbRmfMoworRiiiLjAHFZtK9yrssBUxvUk DHNX7RguAP46ypX2SgIMg/eFWI3aMn+6Bx60rWAl1QATbT6VWtbVJUO7rTryXzWDd9tLZTJHlX4J 5FQtxkEmnfvjzkVItuqoFLnPoKZeX0ccmFOfXFZ82ouU64rRREaZvHgCxgA9s5qu91LOpBJAz2rI luZAylSSRV2xuA6MMjdjpTcbK4XL9haiSEyP0OQKt2179lk2OxdM9fSsp7h4ovLVuDT4Z0ACyfeP NJgdDcatbxR8Nlj2FULvUpZGMEbAYxkjvxWDcOHlwpyO9NDMkwINWI14JFaWUZwN2BVW7hlMixuu SScN6g4xVdWbaWX6mt6IG5s4scuOh+lRYZnQaW+VLdDUl7AkEYUdzitKWZ4YQSnzelZst1HJKd4z 2AqEn1HdGc2myWUpnBJ+bgitKfWw1sqqp80DGavQMlzbhSVIxjFZ8thCCQOGXn61XNfcCJ3MNhvY 7pZuST71kqm4PntV7UpQZ1ReiqKqKdiux9KpXtcXUm0uPY5mcgKh6n1p1/Mkk+59pA4GKrBjOUhj BCDlj6mrsWkM7jzDxmm2luJK5CkiFflHHSntcyRlktm4ZcManv8AR5YVTyuR3qtCv2RZFnGGbGKV 10A2LtXudPtZFGccNj6UWOlvLhjwM5pi3y22nBIiCxPGa0hqUNvaLJuBYoML6moUW2NsrxafHbXX I75Jqzqd1/ohSMHcfSsiPVne4leUcP0HpV6G8jKEyDJHQU23Fha5QtUdJfNPVRU853Rl16f1omvE kfCLgU0HEBBHDc1N7lWKNxMbyJhswY+T7iqcShRk1YjP+lBM8SKU/wAKigXLlSOhxWgiaIAxMDTN Uh+WGVTkeWAR9KsW0QZtjDhjT7mzZkjUHhAQffmoUrMbWhkr6+lXLRfNHoSTmqssf2ed4wcgHiru mYebae/StZbXIW9iWWyj2ZNM+zpxtdlGMHmthrUYyefakNogwQOM9Kx57F2MV9PSRwS7N9a1Ioik YUDaBxVtIAeQoGKrXc626Ek5x0o5m9hWSK91PHCQH/iBUfXBrMtnw7qOjDmnRN9tvIWlB8vf830q zNaLaXJyfkOcfStLWVguZ8sRRg+3K5qS2tJZJcoSq46+1WmuI5P3SruHsKSSeSF1jCY44oTYrIns oPscm6Nuf51ah1RYGcSEHucdqzfLuJM/MQMZNUSo+1SIp4IxSSTA3Jpob+Tkjnis+8ja0z8m5KgV GVRIrbSKutdJPZnePm6U9gBEG1NvQjNTBMtubqahtCPKHcLwamEqZJ3DAqRjj94LTXwgPc07hndl 6HkUigPk0XsBXZiDk8cVLEQ8Q55xVOcSXEnynai8fWmu5gAUNTauBYnIYcH60gmThM5z1rOlnIyo PB70+1ZY97v26U+XQE9TRuJFAAAwBVV55SS6NhQuAPWqs0zynOCFq9ahGXDjIxSUeVag5XdiNZ95 AIw1XrOQM2zJzVC5hMLbwcqDkfSprLLXC464OfyoAnlu3lb5CCOmTT0iWRD5pAPtWRE8oQgDjPU1 LazuzujN24oaELOUjlwvPNPDjYeeah2bp256dDRn5sUwJ1uggIxkUxissTqMcnI/KkSAtx3PQVZu LUQI6g4+TcKm4zGbhvXFW4flT6iqbcmp4Zgw24zWr1RHUsQRBnyT1q4YmiIKnKntWZLOYcMARU0G prIAH4IqXF7lXQ65jiclguGHapdMjDM8h6LUM7AsMDrVv5bXT3APzPzSb0sK2o1pxNO2PujpV6xt xO/zHCL1rLs48wgn7xNaJ8xIzFH68n1qJdii9MFuJgqHEcY2/WqWpzw2yqrDOakhlMcJ3LjBrJvU lmnLupIbpVJIkWG/BlUhOF6VPcCN1LY2k1mRQyR3IJ4X0q7LG0jZ3cVbXYVyrhhn0phXJwB1q55R HFIkZUknmhXFcabEKqleSRzTliwelWkbI5pxANWTcYgwKmWmBfSnrUsaZItPFMFPFIZZpQM0oFO2 4piIyKMVJijGaAItlGwCpMUbaQEW2jFS7aAlAyLFJtqcIO9LtFAFfbRsJqfbijFAEPlUvlDvUppM ZoAj8oUnlipdppNtAEewelBixzipMUpoAixSbc1LtpQuKQEax460pUVMFDDrQUxQBBtpGBqfApNt AFYx5xmgRL1qUqaaQaADgdKNm/g0BSKcARQBC9oMEiq5iwcEVpKeKCgYUwMloh6UnlDitJoA3aov IoApiMBskZqqumhWLAnJOa1/JpPIb0pbAVIoHjH381YDyp9007YQeRS4pOKGmZd1avPcNI5Jz0pI LMRyBsdK1So9KPLzVJ6WJKjgRqCgq1awq6736mgwinKmBxU2KuSyWseD81VZ4/JJA6KAc/WptpoY FgQeRQ0FyvbsizoHGQy5JrRuUimTcjAEDtVUQ4wRTimaLIGyjczLby/MNw9BUUmy8BMIZdo6mr72 au249aILf7OW2dD2o2QFOw02STc8uPbNRXtkkbKTxycitNjOD8nAqC5t2uB+89MUtb3HcxXMe5gr DGKrxF1lDKOM1sf2fGvRP0p4tQO1WtBXH28UVxbhv4sc1TuoMzemBV6NPK+7xTJAzdeanld7od0U BAVb1p0i5IIHNStG4OVGMU1t+RlOlPUV0Q7cnDcZq3aahLaYA+YVAzAjkGo/4eOtFmFzT/tiR7iM uo2L1FVp5Inv8x/cYfkaqANnoeKa25XVlUjtTAtxzPFIdhxUz3LzKyE4YrjNV/T25oOG5FDVwuMk 0+eVlOcD19aiitnd8O3A7VbWZxGQzHGaa0205HelqUhyQmIhlGcVZiu3Z1Vl2jPfvVeO7Qna3FRX VwqzRlDnHWo1vZjOskGRtPIqrcWUFxEQ6jilsLsXVnHJ/EPlP4VYAD8Y4PNQ9GBzV3YvFt8sFl61 XS3uHbCoa6vbECqswFSCCNBnIAqk5WE7GFb6KzAmRuetXo7KK2XcxzjrmrEt1BAp+bPsKx72+e4t ZR/qkGck9TRZvcLlWK5jW7mIGUZyVPtmtKMpLEHQ/LWEnCD0xxVyKQx2K7SckkEVcohcLlo0clT8 wORS3CKjGRPuyqHH9aYnl7QTzJ34pXmD2xRvlZDkD2pWC5chcGJSgyxqLUTPBabg+QCM8VSsr3yy wHIp97qEk9u0ZjADDvRGNgbM/cXJJOT1zVu1bYd+SCgJ4qmiMIw/8JOM1YtpQkmG6EYP41q9iDZt 9Xjkjwxx9TUj6nCBwcmsaSzMQ3RncPaiNSR901lyxZfMy1c6vcMSsQCg96pR3UiS/vvnB65qTyGx 90k/Sj7LJI5+Q9PSqTSQi0jK0WY8AUybzJZAH5HSlgtZYsDaSO4q8LZm+baaQFSEJC27GSKq3F1G p3ucse1aZ053B7ZqpcaBI+0qRwKas9wua4jjv7JHiYAEDOKzjp/2Z2BUnOTml061vbQFP4e1aSpP LC6SLz2NS10QHPEgKVPRhT0aI/IcZq6+jztxwKdBoZSZZGPIp7hczJg1sMj7j9arXD5QGME8811d zpkFzEqMMY6YqmdAjH3GIql5iuY8GoMq7XHGKsHUEEZEfLNWqmiwgYcZqYaNbJjbGKNH0C5gwyME KhSxNNe2uJT8sZ/GumSyRPuqKkEIHQUrDuckdHuWx8tSro1w+AzACurCUuwVWpJz8WkMi4Y5H0pf 7LZMbG6Gug2jFN8sGlYZhTWTyR47gVMbVoYgUwWKYJrUMPpTDGR2qbBc55rWX7pTC+1VpUaF8eWf riuo2eopjwq33lBo5R3OTJk4wpHetXTbAyp5kvGT3rUa3jYAFBxUmwbAoGAKctVZCT1KzRW9uxky CR2rGvd91K0g3D29q3fs6HtSGEDjaKlRtqNyOXEBUMSpqqY5I58KCM12BhT+6Ka9tExyVGa0TsSz nhmRB5idPSmG0UNvUEjGa6E20fYU02ygcCk32Ay7SESkO46Ci/feRGhzkAcVpiNVQqBVJtNDPuVi CDmpS1uVckazkt7RXzyq5xUUWok8FDxWrcSLLEA4J9aoi0XduxinZPcV2AuncACPrRK8qLll/CrM UeBSvDu60rILmcwMjbiOaeq1b+z+lAgOeKu5JXMZbpT1tCRVxIQnXrT6LgUTaMOhpPIcVeop3CxS 8px2pQjjtV4YowKLisVQp9KcI29Ks4FGKQyfbikoOaSgBSooxRQDSGIaKU0UANpaMUooAbSiloxx QAlGKXFAFACYpVFLRjigBmeTSY5p+MUBaAGEU7bTsUdqAG4xRQRRikMQVMh3CoKeCR0ouBIyDFRf dNSBjjmmMOaAAjPNNIFShRjIprLSAj20Y7VIBkUmMUAN28UAdqlC8U4JgdKYERG0U0VK61HQAUYz S4pQKABkHBxTDGDU7DgU3GaAK5jo2VPik20AQ7KXy6kxS0AReXR5dPxS4oAZsNGw1JilFAEWKMc1 Lgd6UKKAIcUu3PapSvpTcUARmMHtSGAHtUtKDQBVMIpphHpVzANGwGgCkYRTTCD2q8Y6b5ee1AWK DWyntTTaJ2FaBhpDDQFigLdR2pktvkcCtHyDTfKI7U7isYzRsOCDUeAh68VtmI91qN7NG6pSGZb4 Kn0xUZTeMAVr/Y0/u04W4HRKSC5gvY3DNlMYNSWenSrchpeRj9a3fJI7UeWfSquIqWxksXbahMTd h2NNbVrxGfEHy9Fq/tPpTTHnqKlJDuzMSaaZleQEN6VckmfyxnJ9qm8r2p2z2pOLY0yCTcbZmWPg dao36+dGIV4BwWrZBbYV7HrUZt1JzilGNncG9DEitNqgEk4q0kOEKjvWiLZfSnC3XFaXuLUzI7NU 5pWsY5GLMDk8VqLCM04RKO1AjKXT4hjCdPapTYowOVzmtLYB2pcD0oCxmLpabduMKTnFPXSIOpWt CnUDK0dnFGMKtSLBGOiipQKMUAMEKf3RSiJR0FPFLijQBmwelOApaXFACgcUoFFKKYhQAKXpSUZx QAuQaQjNKcGm8jpQAuMUYpN+ODThj1pgKOlBPFGQaaTQAZo4xSZpKAFzRmk+lFABRRRQIM07OaZS igYpANJsU9qU0UgGmEdqjMR7VPmigCqY2HamketXcCgxqe1AFDbTDV5oB2qJrf0pAVMUmKnMLDtT ChHUUAQstIAKlK0zbSAjYUxc81NtpQmaAEUYFPHNPVQKcAKAIwlLtNP+lI1MBhU0mDTqXrQAyjFL ilCk9qAG04U7y29KcIzTEMAp+KcIzTxETQA00lPK00qRQAlLSUUhhS4oFBNABijAopQAaAE7UlP2 0YxQA3FPxmgCnAUAN20Bac1JigBMUnenGkIpDGmgDilxSqKAGkUhGKkcc03FIBgXFOAFKeaCOaBi haMDoaVaGU5oAaPlPFB5p4Tjml20ARqM0/aKVAQealABFADABQQccU8r6UwnBxQIjYZpgFSkcGmb aYDcZFKBTgtOxzxQApFMK4qVhTMUwG4oxxTiKBwKQDMZpNtSkUmKAIipoxUmKXAoAjxSinbaUrgU AMNGKUrSAGgAFFLilxQA0gUbadijFADdtLilFLQAnNLRigigAwKMUUtADaOKdRigBuB6UbR6U7FB GKAG7RS4FLQBQA3AowPSnYoxQA3A9KAo9KdigigBpUelJsHpTqUGgBoQelLsHpTs0UwG+WKBGKdS 0AM8sUeUKkAooAi8rmjyzUwwTQKAIdhFJg1YxScUAQgUtS4FBWgCMDilxTsUUANAxTwqmkxxQOKA EMZFAzTw3FKp45p2AbSEZpxo5FAhneg5FOxmkpDGtyM96aGpxGKbjmgB+aDTad2pgGKXaKAc0tAg wKMClpD0oAO1JigUpoATFJinZpCaAEIop3UU2gANJnmlxSHigBwNOzTBQelAElGKYDShuaAFx600 op7UbiTS0ARPbqfaojat2NW6KLCKX2YjqKcIParZNCAd6LAVTCfSmmPFXioao2iB4osBU2Y700gn tVswgUmziiw7lbymNOWH1qfGKBRYRGIgO1OCgdqd9KME0wExSgClC08KKYDQopw4paTigCLOVpoO eoqUYHFIQKLIRHwaNoPFSBADmlMYJzSsFyPywBSeWKc6ntSBWIosFxPKpu0inksopocnqKVh3E5F KMk0gc7sYqUFQRSsFwC4FJUnHelCg9KBkJoyRU20ZoKCkBDmkNSlKay0DGUoGKXbQRQA080hHFOo NADRR0paKQxVOKcWHUUzilxQIN5zTlYEe9NwKUCgLi5pQ9JRTsBIH4pDg9abRniiwCkAjimEUuTS c0AKBSgc0gFKOtADmoC0p45NBpgNwKTPGKU0lIBAaKMUtADe9LijFLikAAUUCnYpgNxScU6k6UAN NFOowKBjaKdijFADaKdijFIAFFJilpiALmjbSg4FApAJilxRRTGGKMetFFACEUU7NFIQ2jFOpKYA KdgGm0tAAVpNtPxRQAzFLjinEZpQtMBgFLilK0mDQAYoo7UdKADvRiiikA49KSkpc0wFxS9qTtRi gAxSYFOpMUAJxSYp2KWgBuKWig8GgAxRRRQAhPNMPFPYd6TqKAE6jmmladjnmlIoAYKUClxmngAU IBu007FFFMQhopcZoxQA08UlPK8U0r6UDExS44pQDS9KAGAU7aKTvTu1ADe1NboDTuxpAODQAgNH agClFIBBR3pQKMUCCjNFJ3oAXNBNJR2oAM05elNpaYDg1JmkpccUxDSTSZNO20YFIBvWlCGjcBSF 6LjHkAUZFR7s0maLiJM0heo80Hmi4Dy2aQNTe1Jg0XA//9k= ------=_NextPart_000_044F_0116071A.196A1590-- From SRS0+X4no+20+fromorbit.com=david@internode.on.net Fri Dec 17 17:52:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBHNqJCq007121 for ; Fri, 17 Dec 2010 17:52:20 -0600 X-ASG-Debug-ID: 1292630051-2c6302560000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EBDB91CDA97C for ; Fri, 17 Dec 2010 15:54:12 -0800 (PST) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id h9psjZX8zq7Lruzf for ; Fri, 17 Dec 2010 15:54:12 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 38885641-1927428 for multiple; Sat, 18 Dec 2010 10:24:10 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PTk7l-0003cz-26; Sat, 18 Dec 2010 10:54:09 +1100 Date: Sat, 18 Dec 2010 10:54:09 +1100 From: Dave Chinner To: Nick Piggin Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Another questionable lock order bug Subject: Re: Another questionable lock order bug Message-ID: <20101217235408.GF5193@dastard> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1292630053 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49735 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, Dec 18, 2010 at 04:40:23AM +1100, Nick Piggin wrote: > With the iprune_sem and iolock lock order warnings taken care of, > lockdep soon after chokes on i_lock What kernel are you running? It does not appear to be vanilla XFS, as: > [ 716.364005] inconsistent {RECLAIM_FS-ON-R} -> {IN-RECLAIM_FS-W} usage. > [ 716.364005] cp/8370 [HC0[0]:SC0[0]:HE1:SE1] takes: > [ 716.364005] (&(&ip->i_lock)->mr_lock){++++-?}, at: > [] xfs_ilock+0x8c/0x150 [xfs] > [ 716.364005] {RECLAIM_FS-ON-R} state was registered at: > [ 716.364005] [] mark_held_locks+0x6b/0xa0 > [ 716.364005] [] lockdep_trace_alloc+0x91/0xd0 > [ 716.364005] [] __kmalloc+0x5a/0x220 > [ 716.364005] [] kmem_alloc+0x87/0xd0 [xfs] > [ 716.364005] [] xfs_attr_shortform_list+0xfb/0x480 [xfs] > [ 716.364005] [] xfs_attr_list_int+0xd8/0xe0 [xfs] > [ 716.364005] [] xfs_vn_listxattr+0x7f/0x160 [xfs] > [ 716.364005] [] vfs_listxattr+0x1f/0x30 > [ 716.364005] [] listxattr+0x3f/0xf0 > [ 716.364005] [] sys_flistxattr+0x44/0x70 > [ 716.364005] [] system_call_fastpath+0x16/0x1b[ > 716.364005] irq event stamp: 322521151 > [ 716.364005] hardirqs last enabled at (322521151): > [] mutex_trylock+0x11d/0x190 > [ 716.364005] hardirqs last disabled at (322521150): > [] mutex_trylock+0x3e/0x190 > [ 716.364005] softirqs last enabled at (322518910): > [] __do_softirq+0x16e/0x360 > [ 716.364005] softirqs last disabled at (322518881): > [] call_softirq+0x1c/0x50 > [ 716.364005] > [ 716.364005] other info that might help us debug this: > [ 716.364005] 3 locks held by cp/8370: > [ 716.364005] #0: (xfs_iolock_active){++++++}, at: ^^^^^^^^^^^^^^^^^ This patch is not yet mainline. If you really want to do significant XFS scalability testing for .38, you should probably pull these branches in for testing: git://git.kernel.org/pub/scm/linux/dgc/xfsdev.git inode-scale git://git.kernel.org/pub/scm/linux/dgc/xfsdev.git xfs-for-2.6.38 > [] xfs_ilock+0xa5/0x150 [xfs] > [ 716.364005] #1: (shrinker_rwsem){++++..}, at: > [] shrink_slab+0x38/0x190 > [ 716.364005] #2: (&pag->pag_ici_reclaim_lock){+.+...}, at: > [] xfs_reclaim_inodes_ag+ > 0xa4/0x360 [xfs] > [ 716.364005] > [ 716.364005] stack backtrace: > [ 716.364005] Pid: 8370, comm: cp Not tainted 2.6.37-rc6+ #116 > [ 716.364005] Call Trace: > [ 716.364005] [] print_usage_bug+0x170/0x180 > [ 716.364005] [] mark_lock+0x211/0x400 > [ 716.364005] [] __lock_acquire+0x40e/0x1490 > [ 716.364005] [] lock_acquire+0x95/0x1b0 > [ 716.364005] [] ? xfs_ilock+0x8c/0x150 [xfs] > [ 716.364005] [] ? rcu_read_lock_held+0x2c/0x30 > [ 716.364005] [] down_write_nested+0x4a/0x70 > [ 716.364005] [] ? xfs_ilock+0x8c/0x150 [xfs] > [ 716.364005] [] xfs_ilock+0x8c/0x150 [xfs] > [ 716.364005] [] xfs_reclaim_inode+0x36/0x270 [xfs] > [ 716.364005] [] xfs_reclaim_inodes_ag+0x20f/0x360 [xfs] > [ 716.364005] [] xfs_reclaim_inode_shrink+0x78/0x80 [xfs] > [ 716.364005] [] shrink_slab+0x127/0x190 > [ 716.364005] [] zone_reclaim+0x349/0x420 > > I assume this should be a false positive too, for the same reason, > and could be handled the same way as iolock. The ilock is very different to the iolock in terms of usage - the ilock is required in the writeback path (for block mapping, allocation and file size updates) while the iolock is not. Hence this is indicative of a potential deadlock and we shouldn't be doing memory allocation with the ilock outside a transaction. Allocations inside transactions are transformed to GFP_NOFS so are safe against such lock recursion, but outside transactions we need to use KM_NOFS directly. I'll send out a patch on Monday after I've looked at the code in more detail.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+8/6Q+21+fromorbit.com=david@internode.on.net Fri Dec 17 18:02:09 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBI029GD007603 for ; Fri, 17 Dec 2010 18:02:09 -0600 X-ASG-Debug-ID: 1292630568-104e000f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D8C511FEEB0 for ; Fri, 17 Dec 2010 16:02:48 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id NQv2WLoZ5I5XdST1 for ; Fri, 17 Dec 2010 16:02:48 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50756559-1927428 for multiple; Sat, 18 Dec 2010 10:32:47 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PTkG6-0003e9-1F; Sat, 18 Dec 2010 11:02:46 +1100 Date: Sat, 18 Dec 2010 11:02:45 +1100 From: Dave Chinner To: Nick Piggin Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_efi_item slab leak Subject: Re: xfs_efi_item slab leak Message-ID: <20101218000245.GG5193@dastard> References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1292630569 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49735 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, Dec 18, 2010 at 05:04:40AM +1100, Nick Piggin wrote: > After running xfstests and then unmounting and rmmodding xfs, I get this bug > > [ 3473.194517] ============================================================================= > [ 3473.194697] BUG xfs_efi_item: Objects remaining on kmem_cache_close() > [ 3473.194793] ----------------------------------------------------------------------------- > [ 3473.194794] > [ 3473.195056] INFO: Slab 0xffffea0006ad5e00 objects=35 used=2 > fp=0xffff8801e8640e80 flags=0xc000000000004080 > [ 3473.195201] Pid: 22011, comm: rmmod Not tainted 2.6.37-rc6+ #116 > [ 3473.195201] Call Trace: > [ 3473.195201] [] slab_err+0x91/0xa0 > [ 3473.195201] [] ? __slab_alloc+0x138/0x480 > [ 3473.195201] [] ? trace_hardirqs_off+0xd/0x10 > [ 3473.195201] [] ? kmem_cache_destroy+0x154/0x3e0 > [ 3473.195201] [] ? trace_hardirqs_off+0xd/0x10 > [ 3473.195201] [] ? __kmalloc+0x104/0x220 > [ 3473.195201] [] kmem_cache_destroy+0x177/0x3e0 > [ 3473.195201] [] xfs_destroy_zones+0x37/0x100 [xfs] > [ 3473.195201] [] exit_xfs_fs+0x33/0x3d [xfs] > [ 3473.195201] [] sys_delete_module+0x17a/0x270 > [ 3473.195201] [] ? lockdep_sys_exit_thunk+0x35/0x67 > [ 3473.195201] [] system_call_fastpath+0x16/0x1b > [ 3473.195201] INFO: Object 0xffff8801e8640910 @offset=2320 > [ 3473.195201] INFO: Allocated in kmem_zone_alloc+0x8c/0xd0 [xfs] > age=2263917 cpu=15 pid=4514 > [ 3473.195201] INFO: Freed in xfs_efi_item_free+0x19/0x30 [xfs] > age=2263918 cpu=15 pid=4514 > [ 3473.195201] INFO: Object 0xffff8801e86427e0 @offset=10208 > [ 3473.195201] INFO: Allocated in kmem_zone_alloc+0x8c/0xd0 [xfs] > age=2103034 cpu=15 pid=22329 > [ 3473.195201] INFO: Freed in xfs_efi_item_free+0x19/0x30 [xfs] > age=2103034 cpu=15 pid=22329 > [ 3473.197616] SLUB xfs_efi_item: kmem_cache_destroy called for cache > that still has objects. > [ 3473.197794] Pid: 22011, comm: rmmod Not tainted 2.6.37-rc6+ #116 > [ 3473.197892] Call Trace: > [ 3473.197980] [] kmem_cache_destroy+0x357/0x3e0 > [ 3473.198120] [] xfs_destroy_zones+0x37/0x100 [xfs] > [ 3473.198240] [] exit_xfs_fs+0x33/0x3d [xfs] > [ 3473.198337] [] sys_delete_module+0x17a/0x270 > [ 3473.198435] [] ? lockdep_sys_exit_thunk+0x35/0x67 > [ 3473.198534] [] system_call_fastpath+0x16/0x1b Ok, after unmounting everything I can see two items in remaining in the xfs_efi_item cache after an xfstests run. Іt's probably to do with a filesystem shutdown not cleaning them up correctly. I'll put it on my list of stuff to track down. Cheers, Dave. -- Dave Chinner david@fromorbit.com From npiggin@gmail.com Fri Dec 17 20:03:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBI23Djp013939 for ; Fri, 17 Dec 2010 20:03:13 -0600 X-ASG-Debug-ID: 1292637906-3a2503a70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-wy0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8FE6A14653BB for ; Fri, 17 Dec 2010 18:05:06 -0800 (PST) Received: from mail-wy0-f181.google.com (mail-wy0-f181.google.com [74.125.82.181]) by cuda.sgi.com with ESMTP id 4wx52XqxBGMf47Sf for ; Fri, 17 Dec 2010 18:05:06 -0800 (PST) Received: by wyf22 with SMTP id 22so1291421wyf.26 for ; Fri, 17 Dec 2010 18:05:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:cc:content-type :content-transfer-encoding; bh=/p8qwKDjPzB9UXLc07Nwr7ySSpVPqEQI+LPmlG0L/Q8=; b=SNLLkrHxJYVFQzwufoe0eALe9juwOBW6oaBQuU4fntxfK08Qqk6Oo5ui29iZNYHLTZ yKVlfEru+ES8X19zV+W0Wu3HYnGQLMSFtctTXhK0QRzdSx4EE7UvHMt+1vhz5Jgxneql cP8U/1d/MKzjPfBXQLmwG1NAYZZwvmb84eYKE= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:content-transfer-encoding; b=SXZdf6s7mRCGjHleNxRLNUkt8E2BPPLV7RlSgWwctoP3f8mMjlp8IONP55hRlJVqOy u7wpte1uIw+42ysjo9FfnyNEkJ9rHMtN+1GdCu+x/UlDfuFzDdqrBQy4oVfnVWqnIfom s3jw2xuswPT+v+03Gj3ndHMTU5vUhngw1Q9oM= MIME-Version: 1.0 Received: by 10.216.155.75 with SMTP id i53mr1535021wek.27.1292637905805; Fri, 17 Dec 2010 18:05:05 -0800 (PST) Received: by 10.216.21.84 with HTTP; Fri, 17 Dec 2010 18:05:05 -0800 (PST) In-Reply-To: <20101217235408.GF5193@dastard> References: <20101217235408.GF5193@dastard> Date: Sat, 18 Dec 2010 13:05:05 +1100 Message-ID: X-ASG-Orig-Subj: Re: Another questionable lock order bug Subject: Re: Another questionable lock order bug From: Nick Piggin To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-wy0-f181.google.com[74.125.82.181] X-Barracuda-Start-Time: 1292637907 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49742 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, Dec 18, 2010 at 10:54 AM, Dave Chinner wrote: > On Sat, Dec 18, 2010 at 04:40:23AM +1100, Nick Piggin wrote: >> With the iprune_sem and iolock lock order warnings taken care of, >> lockdep soon after chokes on i_lock > > What kernel are you running? It does not appear to be vanilla XFS, > as: It's just vanilla plus your patch to fix iolock and Christoph's iprune patc= h to fix that one -- lockdep doesn't get very far without them. >> [ =A0716.364005] inconsistent {RECLAIM_FS-ON-R} -> {IN-RECLAIM_FS-W} usa= ge. >> [ =A0716.364005] cp/8370 [HC0[0]:SC0[0]:HE1:SE1] takes: >> [ =A0716.364005] =A0(&(&ip->i_lock)->mr_lock){++++-?}, at: >> [] xfs_ilock+0x8c/0x150 [xfs] >> [ =A0716.364005] {RECLAIM_FS-ON-R} state was registered at: >> [ =A0716.364005] =A0 [] mark_held_locks+0x6b/0xa0 >> [ =A0716.364005] =A0 [] lockdep_trace_alloc+0x91/0xd0 >> [ =A0716.364005] =A0 [] __kmalloc+0x5a/0x220 >> [ =A0716.364005] =A0 [] kmem_alloc+0x87/0xd0 [xfs] >> [ =A0716.364005] =A0 [] xfs_attr_shortform_list+0xfb/0= x480 [xfs] >> [ =A0716.364005] =A0 [] xfs_attr_list_int+0xd8/0xe0 [x= fs] >> [ =A0716.364005] =A0 [] xfs_vn_listxattr+0x7f/0x160 [x= fs] >> [ =A0716.364005] =A0 [] vfs_listxattr+0x1f/0x30 >> [ =A0716.364005] =A0 [] listxattr+0x3f/0xf0 >> [ =A0716.364005] =A0 [] sys_flistxattr+0x44/0x70 >> [ =A0716.364005] =A0 [] system_call_fastpath+0x16/0x1b= [ >> 716.364005] irq event stamp: 322521151 >> [ =A0716.364005] hardirqs last =A0enabled at (322521151): >> [] mutex_trylock+0x11d/0x190 >> [ =A0716.364005] hardirqs last disabled at (322521150): >> [] mutex_trylock+0x3e/0x190 >> [ =A0716.364005] softirqs last =A0enabled at (322518910): >> [] __do_softirq+0x16e/0x360 >> [ =A0716.364005] softirqs last disabled at (322518881): >> [] call_softirq+0x1c/0x50 >> [ =A0716.364005] >> [ =A0716.364005] other info that might help us debug this: >> [ =A0716.364005] 3 locks held by cp/8370: >> [ =A0716.364005] =A0#0: =A0(xfs_iolock_active){++++++}, at: > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0^^^^^^^^^^^^^^^^^ > > This patch is not yet mainline. If you really want to do significant > XFS scalability testing for .38, you should probably pull these branches > in for testing: > > git://git.kernel.org/pub/scm/linux/dgc/xfsdev.git inode-scale > git://git.kernel.org/pub/scm/linux/dgc/xfsdev.git xfs-for-2.6.38 OK I'll keep it in mind, however in this case I was stress testing some other patches which required that lockdep stay up. > >> [] xfs_ilock+0xa5/0x150 [xfs] >> [ =A0716.364005] =A0#1: =A0(shrinker_rwsem){++++..}, at: >> [] shrink_slab+0x38/0x190 >> [ =A0716.364005] =A0#2: =A0(&pag->pag_ici_reclaim_lock){+.+...}, at: >> [] xfs_reclaim_inodes_ag+ >> 0xa4/0x360 [xfs] >> [ =A0716.364005] >> [ =A0716.364005] stack backtrace: >> [ =A0716.364005] Pid: 8370, comm: cp Not tainted 2.6.37-rc6+ #116 >> [ =A0716.364005] Call Trace: >> [ =A0716.364005] =A0[] print_usage_bug+0x170/0x180 >> [ =A0716.364005] =A0[] mark_lock+0x211/0x400 >> [ =A0716.364005] =A0[] __lock_acquire+0x40e/0x1490 >> [ =A0716.364005] =A0[] lock_acquire+0x95/0x1b0 >> [ =A0716.364005] =A0[] ? xfs_ilock+0x8c/0x150 [xfs] >> [ =A0716.364005] =A0[] ? rcu_read_lock_held+0x2c/0x30 >> [ =A0716.364005] =A0[] down_write_nested+0x4a/0x70 >> [ =A0716.364005] =A0[] ? xfs_ilock+0x8c/0x150 [xfs] >> [ =A0716.364005] =A0[] xfs_ilock+0x8c/0x150 [xfs] >> [ =A0716.364005] =A0[] xfs_reclaim_inode+0x36/0x270 [x= fs] >> [ =A0716.364005] =A0[] xfs_reclaim_inodes_ag+0x20f/0x3= 60 [xfs] >> [ =A0716.364005] =A0[] xfs_reclaim_inode_shrink+0x78/0= x80 [xfs] >> [ =A0716.364005] =A0[] shrink_slab+0x127/0x190 >> [ =A0716.364005] =A0[] zone_reclaim+0x349/0x420 >> >> I assume this should be a false positive too, for the same reason, >> and could be handled the same way as iolock. > > The ilock is very different to the iolock in terms of usage - the > ilock is required in the writeback path (for block mapping, > allocation and file size updates) while the iolock is not. > > Hence this is indicative of a potential deadlock and we shouldn't > be doing memory allocation with the ilock outside a transaction. > Allocations inside transactions are transformed to GFP_NOFS so are > safe against such lock recursion, but outside transactions we need > to use KM_NOFS directly. I'll send out a patch on Monday after I've > looked at the code in more detail.. OK, good to know it uncovered a real problem. Thanks, Nick From xfs@pzystorm.de Sat Dec 18 05:24:16 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBIBOGZQ044796 for ; Sat, 18 Dec 2010 05:24:16 -0600 X-ASG-Debug-ID: 1292671570-305a02b20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.pzystorm.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 36865203F3C for ; Sat, 18 Dec 2010 03:26:10 -0800 (PST) Received: from mail.pzystorm.de (mail.pzystorm.de [188.40.193.4]) by cuda.sgi.com with ESMTP id IDINfOPWwHrKapg1 for ; Sat, 18 Dec 2010 03:26:10 -0800 (PST) Received: from 77-22-192-189-dynip.superkabel.de ([77.22.192.189] helo=[192.168.178.27]) by mail.pzystorm.de with esmtpsa (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.69) (envelope-from ) id 1PTuvR-00079p-AC for xfs@oss.sgi.com; Sat, 18 Dec 2010 12:26:09 +0100 Message-ID: <4D0C9A4F.4040108@pzystorm.de> Date: Sat, 18 Dec 2010 12:26:07 +0100 From: Kevin Richter Reply-To: xfs@pzystorm.de MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Problem with XFS on USB 2TB HD Subject: Problem with XFS on USB 2TB HD Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail.pzystorm.de[188.40.193.4] X-Barracuda-Start-Time: 1292671571 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49781 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi, I have an external USB 2TB harddisk with an XFS filesystem connected to a Debian Lenny with a 2.6.33.4 kernel. 5 days ago I backuped my data to this external drive. While this backup process the USB port got reset and now all the data on the xfs is lost. I cannot mount the filesystem anymore. home:/# mount /dev/mapper/backup /mnt/backup/ mount: wrong fs type, bad option, bad superblock on /dev/mapper/backup, missing codepage or helper program, or other error In some cases useful info is found in syslog - try dmesg | tail or so home:/# mount -t xfs /dev/mapper/backup /mnt/backup/ mount: wrong fs type, bad option, bad superblock on /dev/mapper/backup, missing codepage or helper program, or other error In some cases useful info is found in syslog - try dmesg | tail or so The XFS is in a LUKS volume, but the luksOpen works flawlessly (cryptsetup luksOpen /dev/sdb4 backup). The syslog at the time of the backup process: Dec 13 22:34:26 home kernel: usb 1-5: reset high speed USB device using ehci_hcd and address 5 Dec 13 22:34:37 home kernel: usb 1-5: reset high speed USB device using ehci_hcd and address 5 Dec 13 22:35:15 home kernel: d2fd1000: c2 5b ed 04 29 c1 19 04 dd 51 f8 84 5c ca 33 79 .[..)....Q..\.3y Dec 13 22:35:15 home kernel: Filesystem "dm-0": XFS internal error xfs_da_do_buf(2) at line 2113 of file fs/xfs/xfs_da_btree.c. Caller 0xc115d3cf Dec 13 22:35:15 home kernel: Dec 13 22:35:15 home kernel: Pid: 30113, comm: smbd Not tainted 2.6.33.4 #4 Dec 13 22:35:15 home kernel: Call Trace: Dec 13 22:35:15 home kernel: [] xfs_error_report+0x2c/0x2e Dec 13 22:35:15 home kernel: [] xfs_corruption_error+0x35/0x40 Dec 13 22:35:15 home kernel: [] ? xfs_da_read_buf+0x18/0x1d Dec 13 22:35:15 home kernel: [] xfs_da_do_buf+0x571/0x629 Dec 13 22:35:15 home kernel: [] ? xfs_da_read_buf+0x18/0x1d Dec 13 22:35:15 home kernel: [] ? ip_output+0x78/0x7d Dec 13 22:35:15 home kernel: [] ? ip_queue_xmit+0x2ce/0x304 Dec 13 22:35:15 home kernel: [] xfs_da_read_buf+0x18/0x1d Dec 13 22:35:15 home kernel: [] ? xfs_dir2_block_lookup_int+0x39/0x17c Dec 13 22:35:15 home kernel: [] xfs_dir2_block_lookup_int+0x39/0x17c Dec 13 22:35:15 home kernel: [] ? __ext3_get_inode_loc+0xc6/0x260 Dec 13 22:35:15 home kernel: [] ? xfs_bmap_last_offset+0xe8/0xfc Dec 13 22:35:15 home kernel: [] xfs_dir2_block_lookup+0x16/0xa2 Dec 13 22:35:15 home kernel: [] xfs_dir_lookup+0x98/0x100 Dec 13 22:35:15 home kernel: [] xfs_lookup+0x3d/0x94 Dec 13 22:35:15 home kernel: [] xfs_vn_lookup+0x38/0x70 Dec 13 22:35:15 home kernel: [] do_lookup+0xd0/0x16f Dec 13 22:35:15 home kernel: [] link_path_walk+0x63b/0x9dc Dec 13 22:35:15 home kernel: [] path_walk+0x50/0xb2 Dec 13 22:35:15 home kernel: [] do_path_lookup+0x21/0x42 Dec 13 22:35:15 home kernel: [] user_path_at+0x3c/0x67 Dec 13 22:35:15 home kernel: [] vfs_fstatat+0x2d/0x54 Dec 13 22:35:15 home kernel: [] vfs_stat+0x13/0x15 Dec 13 22:35:15 home kernel: [] sys_stat64+0x14/0x28 Dec 13 22:35:15 home kernel: [] sysenter_do_call+0x12/0x26 The current XFS header bytes of the /dev/mapper/backup volume: 00000000 58 46 53 42 00 00 10 00 00 00 00 00 1c d8 c3 a4 |XFSB.........ØÃ¤| 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000020 ec 24 29 ae 9c 2f 4a 75 a8 59 58 14 b5 2d 5e ac |ì$)®./Ju¨YX.µ-^¬| 00000030 00 00 00 00 10 00 00 04 00 00 00 00 00 00 00 80 |................| 00000040 98 55 e4 53 ef e6 e9 03 9a 71 4f 19 3f 8b 6f 14 |.UäSïæé..qO.?.o.| 00000050 75 d6 51 9a dd 84 53 3e c4 80 ae a1 c2 83 53 5e |uÖQ.Ã.S>Ä.®¡Â.S^| 00000060 69 c3 f8 1b 35 0b 15 f2 4f 15 46 42 79 6f 8b 13 |iÃø.5..òO.FByo..| 00000070 4c 65 64 ba 38 cd 51 8b 00 00 00 00 2c f9 ac 2c |Ledº8ÃQ.....,ù¬,| 00000080 47 91 80 45 73 3e 93 77 8f 95 80 81 ab 8b b8 eb |G..Es>.w....«.¸ë| 00000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 000000a0 ec 24 29 ae 9c 2f 4a 75 a8 59 58 14 b5 2d 5e ac |ì$)®./Ju¨YX.µ-^¬| 000000b0 00 00 00 00 10 00 00 04 00 00 00 00 00 00 00 80 |................| 000000c0 98 55 e4 53 ef e6 e9 03 9a 71 4f 19 3f 8b 6f 14 |.UäSïæé..qO.?.o.| 000000d0 75 d6 51 9a dd 84 53 3e c4 80 ae a1 c2 83 53 5e |uÖQ.Ã.S>Ä.®¡Â.S^| 000000e0 69 c3 f8 1b 35 0b 15 f2 4f 15 46 42 79 6f 8b 13 |iÃø.5..òO.FByo..| 000000f0 4c 65 64 ba 38 cd 51 8b 00 00 00 00 2c f9 ac 2c |Ledº8ÃQ.....,ù¬,| 00000100 47 91 80 45 73 3e 93 77 8f 95 80 81 ab 8b b8 eb |G..Es>.w....«.¸ë| 00000110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000120 ec 24 29 ae 9c 2f 4a 75 a8 59 58 14 b5 2d 5e ac |ì$)®./Ju¨YX.µ-^¬| 00000130 00 00 00 00 10 00 00 04 00 00 00 00 00 00 00 80 |................| 00000140 98 55 e4 53 ef e6 e9 03 9a 71 4f 19 3f 8b 6f 14 |.UäSïæé..qO.?.o.| 00000150 75 d6 51 9a dd 84 53 3e c4 80 ae a1 c2 83 53 5e |uÖQ.Ã.S>Ä.®¡Â.S^| 00000160 69 c3 f8 1b 35 0b 15 f2 4f 15 46 42 79 6f 8b 13 |iÃø.5..òO.FByo..| 00000170 4c 65 64 ba 38 cd 51 8b 00 00 00 00 2c f9 ac 2c |Ledº8ÃQ.....,ù¬,| 00000180 47 91 80 45 73 3e 93 77 8f 95 80 81 ab 8b b8 eb |G..Es>.w....«.¸ë| 00000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 000001a0 ec 24 29 ae 9c 2f 4a 75 a8 59 58 14 b5 2d 5e ac |ì$)®./Ju¨YX.µ-^¬| 000001b0 00 00 00 00 10 00 00 04 00 00 00 00 00 00 00 80 |................| 000001c0 98 55 e4 53 ef e6 e9 03 9a 71 4f 19 3f 8b 6f 14 |.UäSïæé..qO.?.o.| 000001d0 75 d6 51 9a dd 84 53 3e c4 80 ae a1 c2 83 53 5e |uÖQ.Ã.S>Ä.®¡Â.S^| 000001e0 69 c3 f8 1b 35 0b 15 f2 4f 15 46 42 79 6f 8b 13 |iÃø.5..òO.FByo..| 000001f0 4c 65 64 ba 38 cd 51 8b 00 00 00 00 2c f9 ac 2c |Ledº8ÃQ.....,ù¬,| xfs_repair runs since a few hours, but has just printed a bunch of dots. The first line of xfs_repair is "bad or unsupported version" and that it cant find a superblock. Some ideas? What happened? Do I use a buggy version? I have 2.9.8 (http://packages.debian.org/lenny/xfsprogs) What can I do to avoid these problems in the future? It is a problem with the interaction of LUKS, XFS and USB? Thanks in advance Kevin From anonymous@mail.ameanet.com Sat Dec 18 09:54:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.5 required=5.0 tests=BAYES_50,URIBL_BLACK autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBIFsI9c065872 for ; Sat, 18 Dec 2010 09:54:19 -0600 X-ASG-Debug-ID: 1292687773-4e84020f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.ameanet.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3110514665B5 for ; Sat, 18 Dec 2010 07:56:13 -0800 (PST) Received: from mail.ameanet.com (mail.ameanet.com [67.192.184.59]) by cuda.sgi.com with ESMTP id 4uuD9T1oAIOb5auA for ; Sat, 18 Dec 2010 07:56:13 -0800 (PST) Received: (qmail 15973 invoked by uid 48); 18 Dec 2010 16:56:13 +0100 Date: 18 Dec 2010 16:56:13 +0100 Message-ID: <20101218155613.15971.qmail@mail.ameanet.com> To: xfs@oss.sgi.com X-ASG-Orig-Subj: Postcard system recommendation for Hey! Subject: Postcard system recommendation for Hey! From: AmeaNet // Erotic Postcards X-Barracuda-Connect: mail.ameanet.com[67.192.184.59] X-Barracuda-Start-Time: 1292687774 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4995 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.19 X-Barracuda-Spam-Status: No, SCORE=1.19 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=EARN_PER_WEEK X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49798 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.19 EARN_PER_WEEK BODY: Contains 'earn $something per week' X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Would you like to earn up to $8,847 per month working from home? Do you have access to a computer? Want to make extra money in your spare time working from the comfort of your own home? Now you can! Be your own boss and recession proof your income! Just visit this link, and buckle up, we're moving VERY fast: http://www.romamoney.co.cc/s.php?un=dvg1&e=xfs@oss.sgi.com Don't forget to take a free tour today! Keep in mind, this is happening without you doing ANYTHING. Together in Success, Melissa Removal link: http://www.romamoney.co.cc/u.php?un=dvg1&e=xfs@oss.sgi.com From xfs@pzystorm.de Sat Dec 18 20:02:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=BAYES_00,LONGWORDS autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBJ22XQP138861 for ; Sat, 18 Dec 2010 20:02:33 -0600 X-ASG-Debug-ID: 1292724267-1a6d00e90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.pzystorm.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 828F31CDCA2F for ; Sat, 18 Dec 2010 18:04:27 -0800 (PST) Received: from mail.pzystorm.de (mail.pzystorm.de [188.40.193.4]) by cuda.sgi.com with ESMTP id tOWyz3FXVzZp4cH0 for ; Sat, 18 Dec 2010 18:04:27 -0800 (PST) Received: from hnvr-4d078b75.pool.mediaways.net ([77.7.139.117] helo=[192.168.0.72]) by mail.pzystorm.de with esmtpsa (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.69) (envelope-from ) id 1PU8dO-0007Sy-Kf for xfs@oss.sgi.com; Sun, 19 Dec 2010 03:04:26 +0100 Message-ID: <4D0D6825.9010209@pzystorm.de> Date: Sun, 19 Dec 2010 03:04:21 +0100 From: Kevin Richter Reply-To: xfs@pzystorm.de MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Problem with XFS on USB 2TB HD Subject: Re: Problem with XFS on USB 2TB HD References: <4D0C9A4F.4040108@pzystorm.de> In-Reply-To: <4D0C9A4F.4040108@pzystorm.de> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail.pzystorm.de[188.40.193.4] X-Barracuda-Start-Time: 1292724268 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.18 X-Barracuda-Spam-Status: No, SCORE=1.18 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=LONGWORDS, LONGWORDS_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49839 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 LONGWORDS Long string of long words 3.20 LONGWORDS_2 Long string of long words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean ... the xfs_repair process did succeed. But in the end I still cannot mount the volume. In the following there is a log of my actions with the appropriate syslog messages. The xfs_check (see below) says that there is a bug in xfs. So I am writing to this list a second time asking for help :) Thanks, Kevin [xfs_repair: after 500 screens of dots...] .................................................................found candidate secondary superblock... verified secondary superblock... writing modified primary superblock sb realtime bitmap inode 18446744073709551615 (NULLFSINO) inconsistent with calculated value 129 resetting superblock realtime bitmap ino pointer to 129 sb realtime summary inode 18446744073709551615 (NULLFSINO) inconsistent with calculated value 130 resetting superblock realtime summary ino pointer to 130 Phase 2 - using internal log - zero log... ERROR: The filesystem has valuable metadata changes in a log which needs to be replayed. Mount the filesystem to replay the log, and unmount it before re-running xfs_repair. If you are unable to mount the filesystem, then use the -L option to destroy the log and attempt a repair. Note that destroying the log may cause corruption -- please attempt a mount of the filesystem before doing this. home:/# mount -t xfs /dev/mapper/backup /mnt/backup/ mount: Nicht genügend Hauptspeicher verfügbar (engl. out of memory) syslog: Dec 18 21:53:25 home kernel: XFS mounting filesystem dm-0 Dec 18 21:53:26 home kernel: XFS: nil uuid in log - IRIX style log Dec 18 21:53:26 home kernel: Starting XFS recovery on filesystem: dm-0 (logdev: internal) Dec 18 21:53:26 home kernel: XFS: Invalid block length (0x16d283) given for buffer Dec 18 21:53:26 home kernel: XFS: log mount/recovery failed: error 12 Dec 18 21:53:26 home kernel: XFS: log mount failed home:/# mount -t xfs /dev/mapper/backup /mnt/backup/ mount: Die Struktur muss bereinigt werden (engl. structure needs cleaning) syslog: Dec 18 21:53:40 home kernel: XFS mounting filesystem dm-0 Dec 18 21:53:40 home kernel: XFS: nil uuid in log - IRIX style log Dec 18 21:53:40 home kernel: Starting XFS recovery on filesystem: dm-0 (logdev: internal) Dec 18 21:53:40 home kernel: XFS: dirty log written in incompatible format - can't recover Dec 18 21:53:40 home kernel: XFS: log mount/recovery failed: error 5 Dec 18 21:53:40 home kernel: XFS: log mount failed home:/# mount -t xfs /dev/mapper/backup /mnt/backup/ mount: /dev/mapper/backup: can't read superblock syslog: Dec 18 21:55:40 home kernel: XFS mounting filesystem dm-0 Dec 18 21:55:41 home kernel: XFS: nil uuid in log - IRIX style log Dec 18 21:55:41 home kernel: Starting XFS recovery on filesystem: dm-0 (logdev: internal) Dec 18 21:55:41 home kernel: Filesystem "dm-0": corrupt inode 128 ((a)extents = 316629094). Unmount and run xfs_repair. Dec 18 21:55:41 home kernel: c77f9000: 49 4e 41 ed 02 02 00 00 00 00 00 00 00 00 00 00 INA............. Dec 18 21:55:41 home kernel: Filesystem "dm-0": XFS internal error xfs_iformat_extents(1) at line 558 of file fs/xfs/xfs_inode.c. Caller 0xc116f10b Dec 18 21:55:41 home kernel: Dec 18 21:55:41 home kernel: Pid: 23696, comm: mount Not tainted 2.6.33.4 #4 Dec 18 21:55:41 home kernel: Call Trace: Dec 18 21:55:41 home kernel: [] xfs_error_report+0x2c/0x2e Dec 18 21:55:41 home kernel: [] xfs_corruption_error+0x35/0x40 Dec 18 21:55:41 home kernel: [] ? xfs_iformat+0x314/0x499 Dec 18 21:55:41 home kernel: [] xfs_iformat_extents+0xba/0x1bc Dec 18 21:55:41 home kernel: [] ? xfs_iformat+0x314/0x499 Dec 18 21:55:41 home kernel: [] xfs_iformat+0x314/0x499 Dec 18 21:55:41 home kernel: [] xfs_iread+0xa3/0x160 Dec 18 21:55:41 home kernel: [] xfs_iget+0x1a6/0x2b7 Dec 18 21:55:41 home kernel: [] xfs_mountfs+0x35e/0x594 Dec 18 21:55:41 home kernel: [] ? kmem_alloc+0x59/0xab Dec 18 21:55:41 home kernel: [] ? kmem_zalloc+0x10/0x25 Dec 18 21:55:41 home kernel: [] ? xfs_mru_cache_create+0xe9/0x121 Dec 18 21:55:41 home kernel: [] xfs_fs_fill_super+0x14e/0x292 Dec 18 21:55:41 home kernel: [] get_sb_bdev+0xf9/0x137 Dec 18 21:55:41 home kernel: [] ? kstrdup+0x29/0x3a Dec 18 21:55:41 home kernel: [] xfs_fs_get_sb+0x13/0x15 Dec 18 21:55:41 home kernel: [] ? xfs_fs_fill_super+0x0/0x292 Dec 18 21:55:41 home kernel: [] vfs_kern_mount+0x86/0x11f Dec 18 21:55:41 home kernel: [] do_kern_mount+0x32/0xbe Dec 18 21:55:41 home kernel: [] do_mount+0x5a9/0x5fb Dec 18 21:55:41 home kernel: [] ? strndup_user+0x48/0x67 Dec 18 21:55:41 home kernel: [] sys_mount+0x61/0x94 Dec 18 21:55:41 home kernel: [] sysenter_do_call+0x12/0x26 Dec 18 21:55:41 home kernel: XFS: failed to read root inode # SWAP SPACE ADDED: Dec 19 02:32:26 home kernel: Adding 7815612k swap on /dev/sda2. Priority:-2 extents:1 across:7815612k xfs_repair executed home:/# mount -t xfs /dev/mapper/backup /mnt/backup/ mount: Die Struktur muss bereinigt werden (engl. structure needs cleaning) syslog: Dec 19 02:33:23 home kernel: XFS mounting filesystem dm-0 Dec 19 02:33:24 home kernel: Starting XFS recovery on filesystem: dm-0 (logdev: internal) Dec 19 02:33:24 home kernel: Filesystem "dm-0": corrupt inode 128 ((a)extents = 316629094). Unmount and run xfs_repair. Dec 19 02:33:24 home kernel: d21fb000: 49 4e 41 ed 02 02 00 00 00 00 00 00 00 00 00 00 INA............. Dec 19 02:33:24 home kernel: Filesystem "dm-0": XFS internal error xfs_iformat_extents(1) at line 558 of file fs/xfs/xfs_inode.c. Caller 0xc116f10b Dec 19 02:33:24 home kernel: Dec 19 02:33:24 home kernel: Pid: 24735, comm: mount Not tainted 2.6.33.4 #4 Dec 19 02:33:24 home kernel: Call Trace: Dec 19 02:33:24 home kernel: [] xfs_error_report+0x2c/0x2e Dec 19 02:33:24 home kernel: [] xfs_corruption_error+0x35/0x40 Dec 19 02:33:24 home kernel: [] ? xfs_iformat+0x314/0x499 Dec 19 02:33:24 home kernel: [] xfs_iformat_extents+0xba/0x1bc Dec 19 02:33:24 home kernel: [] ? xfs_iformat+0x314/0x499 Dec 19 02:33:24 home kernel: [] xfs_iformat+0x314/0x499 Dec 19 02:33:24 home kernel: [] xfs_iread+0xa3/0x160 Dec 19 02:33:24 home kernel: [] xfs_iget+0x1a6/0x2b7 Dec 19 02:33:24 home kernel: [] xfs_mountfs+0x35e/0x594 Dec 19 02:33:24 home kernel: [] ? kmem_alloc+0x59/0xab Dec 19 02:33:24 home kernel: [] ? kmem_zalloc+0x10/0x25 Dec 19 02:33:24 home kernel: [] ? xfs_mru_cache_create+0xe9/0x121 Dec 19 02:33:24 home kernel: [] xfs_fs_fill_super+0x14e/0x292 Dec 19 02:33:24 home kernel: [] get_sb_bdev+0xf9/0x137 Dec 19 02:33:24 home kernel: [] ? kstrdup+0x29/0x3a Dec 19 02:33:24 home kernel: [] xfs_fs_get_sb+0x13/0x15 Dec 19 02:33:24 home kernel: [] ? xfs_fs_fill_super+0x0/0x292 Dec 19 02:33:24 home kernel: [] vfs_kern_mount+0x86/0x11f Dec 19 02:33:24 home kernel: [] do_kern_mount+0x32/0xbe Dec 19 02:33:24 home kernel: [] do_mount+0x5a9/0x5fb Dec 19 02:33:24 home kernel: [] ? strndup_user+0x48/0x67 Dec 19 02:33:24 home kernel: [] sys_mount+0x61/0x94 Dec 19 02:33:24 home kernel: [] sysenter_do_call+0x12/0x26 Dec 19 02:33:24 home kernel: XFS: failed to read root inode home:/# xfs_repair /dev/mapper/backup Phase 1 - find and verify superblock... sb realtime bitmap inode 18446744073709551615 (NULLFSINO) inconsistent with calculated value 129 resetting superblock realtime bitmap ino pointer to 129 sb realtime summary inode 18446744073709551615 (NULLFSINO) inconsistent with calculated value 130 resetting superblock realtime summary ino pointer to 130 Phase 2 - using internal log - zero log... ERROR: The filesystem has valuable metadata changes in a log which needs to be replayed. Mount the filesystem to replay the log, and unmount it before re-running xfs_repair. If you are unable to mount the filesystem, then use the -L option to destroy the log and attempt a repair. Note that destroying the log may cause corruption -- please attempt a mount of the filesystem before doing this. home:/# xfs_check /dev/mapper/backup corrupt inode 128 ((a)extents = 316629094). This is a bug. Please capture the filesystem metadata with xfs_metadump and report it to xfs@oss.sgi.com. cache_node_purge: refcount was 1, not zero (node=0x80dba08) xfs_check: cannot read root inode (117) ERROR: The filesystem has valuable metadata changes in a log which needs to be replayed. Mount the filesystem to replay the log, and unmount it before re-running xfs_check. If you are unable to mount the filesystem, then use the xfs_repair -L option to destroy the log and attempt a repair. Note that destroying the log may cause corruption -- please attempt a mount of the filesystem before doing this. From stan@hardwarefreak.com Sat Dec 18 20:35:40 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBJ2ZdfJ142982 for ; Sat, 18 Dec 2010 20:35:40 -0600 X-ASG-Debug-ID: 1292726253-7a9400a50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8F5D71466C68 for ; Sat, 18 Dec 2010 18:37:33 -0800 (PST) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id bfgBa6VobzDufjSR for ; Sat, 18 Dec 2010 18:37:33 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id E7D9B6C068 for ; Sat, 18 Dec 2010 20:37:32 -0600 (CST) Message-ID: <4D0D6FEC.70900@hardwarefreak.com> Date: Sat, 18 Dec 2010 20:37:32 -0600 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Problem with XFS on USB 2TB HD Subject: Re: Problem with XFS on USB 2TB HD References: <4D0C9A4F.4040108@pzystorm.de> <4D0D6825.9010209@pzystorm.de> In-Reply-To: <4D0D6825.9010209@pzystorm.de> 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: 1292726255 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0523 1.0000 -1.6854 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.09 X-Barracuda-Spam-Status: No, SCORE=-1.09 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49842 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Kevin Richter put forth on 12/18/2010 8:04 PM: > ... the xfs_repair process did succeed. > But in the end I still cannot mount the volume. > In the following there is a log of my actions with the appropriate > syslog messages. > > The xfs_check (see below) says that there is a bug in xfs. So I am > writing to this list a second time asking for help :) I don't have a solution to your problem unfortunately. Keep in mind you posted this problem on a weekend, and one week before Christmas no less. Your timing is not optimal for receiving a prompt response. It's possible you may have to wait until Monday for help. :( -- Stan From lists@nabble.com Sun Dec 19 08:35:57 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBJEZvIo228290 for ; Sun, 19 Dec 2010 08:35:57 -0600 X-ASG-Debug-ID: 1292769466-7e1301370000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from sam.nabble.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 85CDC1CDD282 for ; Sun, 19 Dec 2010 06:37:47 -0800 (PST) Received: from sam.nabble.com (sam.nabble.com [216.139.236.26]) by cuda.sgi.com with ESMTP id C270PbBkab21QHCD for ; Sun, 19 Dec 2010 06:37:47 -0800 (PST) Received: from isper.nabble.com ([192.168.236.156]) by sam.nabble.com with esmtp (Exim 4.69) (envelope-from ) id 1PUKOQ-0001hs-Dt for xfs@oss.sgi.com; Sun, 19 Dec 2010 06:37:46 -0800 Message-ID: <30492876.post@talk.nabble.com> Date: Sun, 19 Dec 2010 06:37:46 -0800 (PST) From: johahoff To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Fwd: xfs - fixing wrong xfs size Subject: Re: Fwd: xfs - fixing wrong xfs size In-Reply-To: <4CE15F39.2010904@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Nabble-From: jh@not-dark-yet.de References: <49E353FD.5060207@sandeen.net> <4BE1EF9D.2030901@sandeen.net> <30211747.post@talk.nabble.com> <4CE15F39.2010904@sandeen.net> X-Barracuda-Connect: sam.nabble.com[216.139.236.26] X-Barracuda-Start-Time: 1292769467 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49889 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean That worked perfectly, thanks a lot, Eric! One minor issue: I had to use 'xfs_db -x', not '-w', but probably that's because of an old version of xfs-utils on the SystemRescueCD I was using. Just a hint if anybody is wondering. Thanks again, Johannes -- View this message in context: http://old.nabble.com/xfs---fixing-wrong-xfs-size-tp23023562p30492876.html Sent from the Xfs - General mailing list archive at Nabble.com. From eflorac@intellique.com Sun Dec 19 08:55:21 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBJEtLg2230264 for ; Sun, 19 Dec 2010 08:55:21 -0600 X-ASG-Debug-ID: 1292770634-7307010a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B02C71467D3A for ; Sun, 19 Dec 2010 06:57:15 -0800 (PST) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id aEmL1BSRm2VR16j5 for ; Sun, 19 Dec 2010 06:57:15 -0800 (PST) Received: from galadriel.home (unknown [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP id 9E299A611A; Sun, 19 Dec 2010 15:57:09 +0100 (CET) Date: Sun, 19 Dec 2010 15:57:03 +0100 From: Emmanuel Florac To: xfs@pzystorm.de Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Problem with XFS on USB 2TB HD Subject: Re: Problem with XFS on USB 2TB HD Message-ID: <20101219155703.0dba96ff@galadriel.home> In-Reply-To: <4D0D6825.9010209@pzystorm.de> References: <4D0C9A4F.4040108@pzystorm.de> <4D0D6825.9010209@pzystorm.de> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.20.1; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1292770637 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49890 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Sun, 19 Dec 2010 03:04:21 +0100 vous =C3=A9criviez: > ERROR: The filesystem has valuable metadata changes in a log which > needs to be replayed. Given this message, you'll have to run xfs_repair with the zero log option ( -L ). This is dangerous, but it can't get much worse anyway. Run xfs_repair -L /device , you should be able to mount your filesystem afterwards, however any data under change at the time of failure will most probably be lost. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From sandeen@sandeen.net Sun Dec 19 11:26:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBJHQ5sT246787 for ; Sun, 19 Dec 2010 11:26:06 -0600 X-ASG-Debug-ID: 1292779680-3cde03540000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0C9EC1468315 for ; Sun, 19 Dec 2010 09:28:00 -0800 (PST) Received: from mail.sandeen.net (64-131-28-21.usfamily.net [64.131.28.21]) by cuda.sgi.com with ESMTP id IRDwyeZ13uM7I6nh for ; Sun, 19 Dec 2010 09:28:00 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 88C0148406ED; Sun, 19 Dec 2010 11:27:59 -0600 (CST) Message-ID: <4D0E409F.8060905@sandeen.net> Date: Sun, 19 Dec 2010 11:27:59 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: johahoff CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Fwd: xfs - fixing wrong xfs size Subject: Re: Fwd: xfs - fixing wrong xfs size References: <49E353FD.5060207@sandeen.net> <4BE1EF9D.2030901@sandeen.net> <30211747.post@talk.nabble.com> <4CE15F39.2010904@sandeen.net> <30492876.post@talk.nabble.com> In-Reply-To: <30492876.post@talk.nabble.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-28-21.usfamily.net[64.131.28.21] X-Barracuda-Start-Time: 1292779682 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49900 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 12/19/10 8:37 AM, johahoff wrote: > > That worked perfectly, thanks a lot, Eric! > > One minor issue: I had to use 'xfs_db -x', not '-w', but probably that's > because of an old version of xfs-utils on the SystemRescueCD I was using. > Just a hint if anybody is wondering. Nah that was me misremembering debugfs vs. xfs_db arguments :) -Eric > Thanks again, > Johannes From sandeen@sandeen.net Sun Dec 19 11:28:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBJHSjMr246944 for ; Sun, 19 Dec 2010 11:28:45 -0600 X-ASG-Debug-ID: 1292779839-4ddf01bd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B2F5C1468329 for ; Sun, 19 Dec 2010 09:30:40 -0800 (PST) Received: from mail.sandeen.net (64-131-28-21.usfamily.net [64.131.28.21]) by cuda.sgi.com with ESMTP id gfLiOZ91LbopBCsI for ; Sun, 19 Dec 2010 09:30:40 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 57E3F48BC887; Sun, 19 Dec 2010 11:30:39 -0600 (CST) Message-ID: <4D0E413F.50204@sandeen.net> Date: Sun, 19 Dec 2010 11:30:39 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: Emmanuel Florac CC: xfs@pzystorm.de, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Problem with XFS on USB 2TB HD Subject: Re: Problem with XFS on USB 2TB HD References: <4D0C9A4F.4040108@pzystorm.de> <4D0D6825.9010209@pzystorm.de> <20101219155703.0dba96ff@galadriel.home> In-Reply-To: <20101219155703.0dba96ff@galadriel.home> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: 64-131-28-21.usfamily.net[64.131.28.21] X-Barracuda-Start-Time: 1292779841 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49900 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 12/19/10 8:57 AM, Emmanuel Florac wrote: > Le Sun, 19 Dec 2010 03:04:21 +0100 vous écriviez: > >> ERROR: The filesystem has valuable metadata changes in a log which >> needs to be replayed. > > Given this message, you'll have to run xfs_repair with the zero log > option ( -L ). This is dangerous, but it can't get much worse anyway. I agree with that approach. > Run xfs_repair -L /device , you should be able to mount your filesystem > afterwards, however any data under change at the time of failure will > most probably be lost. And something seems to have really whacked your filesystem; odds are the USB transport was lying to xfs one way or another about completed writes, and when it went away, things were not consistent on disk as expected. -Eric From SRS0++t02+23+fromorbit.com=david@internode.on.net Sun Dec 19 18:08:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBK08XYF026626 for ; Sun, 19 Dec 2010 18:08:34 -0600 X-ASG-Debug-ID: 1292803827-692000ed0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 912721466A1D for ; Sun, 19 Dec 2010 16:10:28 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id v0Yk8QFgv09urIPV for ; Sun, 19 Dec 2010 16:10:28 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50402467-1927428 for multiple; Mon, 20 Dec 2010 10:40:26 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PUTKb-00070p-1C; Mon, 20 Dec 2010 11:10:25 +1100 Date: Mon, 20 Dec 2010 11:10:24 +1100 From: Dave Chinner To: Kevin Richter Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Problem with XFS on USB 2TB HD Subject: Re: Problem with XFS on USB 2TB HD Message-ID: <20101220001024.GH5193@dastard> References: <4D0C9A4F.4040108@pzystorm.de> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <4D0C9A4F.4040108@pzystorm.de> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1292803829 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, Dec 18, 2010 at 12:26:07PM +0100, Kevin Richter wrote: > Hi, > > I have an external USB 2TB harddisk with an XFS filesystem connected to > a Debian Lenny with a 2.6.33.4 kernel. > > 5 days ago I backuped my data to this external drive. While this backup > process the USB port got reset and now all the data on the xfs is lost. There's been garbage written all over this superblock: > The current XFS header bytes of the /dev/mapper/backup volume: > 00000000 58 46 53 42 00 00 10 00 00 00 00 00 1c d8 c3 a4 |XFSB.........ØÃ¤| > 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| > 00000020 ec 24 29 ae 9c 2f 4a 75 a8 59 58 14 b5 2d 5e ac |ì$)®./Ju¨YX.µ-^¬| > 00000030 00 00 00 00 10 00 00 04 00 00 00 00 00 00 00 80 |................| Ok up to here (first 64 bytes) > 00000040 98 55 e4 53 ef e6 e9 03 9a 71 4f 19 3f 8b 6f 14 |.UäSïæé..qO.?.o.| > 00000050 75 d6 51 9a dd 84 53 3e c4 80 ae a1 c2 83 53 5e |uÖQ.Ý.S>Ä.®¡Â.S^| > 00000060 69 c3 f8 1b 35 0b 15 f2 4f 15 46 42 79 6f 8b 13 |iÃø.5..òO.FByo..| > 00000070 4c 65 64 ba 38 cd 51 8b 00 00 00 00 2c f9 ac 2c |Ledº8ÍQ.....,ù¬,| > 00000080 47 91 80 45 73 3e 93 77 8f 95 80 81 ab 8b b8 eb |G..Es>.w....«.¸ë| This is all garbage (second 64 bytes) > 00000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| Might be ok. > 000000a0 ec 24 29 ae 9c 2f 4a 75 a8 59 58 14 b5 2d 5e ac |ì$)®./Ju¨YX.µ-^¬| Garbage > 000000b0 00 00 00 00 10 00 00 04 00 00 00 00 00 00 00 80 |................| Might be ok > 000000c0 98 55 e4 53 ef e6 e9 03 9a 71 4f 19 3f 8b 6f 14 |.UäSïæé..qO.?.o.| > 000000d0 75 d6 51 9a dd 84 53 3e c4 80 ae a1 c2 83 53 5e |uÖQ.Ý.S>Ä.®¡Â.S^| > 000000e0 69 c3 f8 1b 35 0b 15 f2 4f 15 46 42 79 6f 8b 13 |iÃø.5..òO.FByo..| > 000000f0 4c 65 64 ba 38 cd 51 8b 00 00 00 00 2c f9 ac 2c |Ledº8ÍQ.....,ù¬,| > 00000100 47 91 80 45 73 3e 93 77 8f 95 80 81 ab 8b b8 eb |G..Es>.w....«.¸ë| Garbage. > 00000110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| > 00000120 ec 24 29 ae 9c 2f 4a 75 a8 59 58 14 b5 2d 5e ac |ì$)®./Ju¨YX.µ-^¬| > 00000130 00 00 00 00 10 00 00 04 00 00 00 00 00 00 00 80 |................| > 00000140 98 55 e4 53 ef e6 e9 03 9a 71 4f 19 3f 8b 6f 14 |.UäSïæé..qO.?.o.| > 00000150 75 d6 51 9a dd 84 53 3e c4 80 ae a1 c2 83 53 5e |uÖQ.Ý.S>Ä.®¡Â.S^| > 00000160 69 c3 f8 1b 35 0b 15 f2 4f 15 46 42 79 6f 8b 13 |iÃø.5..òO.FByo..| > 00000170 4c 65 64 ba 38 cd 51 8b 00 00 00 00 2c f9 ac 2c |Ledº8ÍQ.....,ù¬,| > 00000180 47 91 80 45 73 3e 93 77 8f 95 80 81 ab 8b b8 eb |G..Es>.w....«.¸ë| > 00000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| > 000001a0 ec 24 29 ae 9c 2f 4a 75 a8 59 58 14 b5 2d 5e ac |ì$)®./Ju¨YX.µ-^¬| > 000001b0 00 00 00 00 10 00 00 04 00 00 00 00 00 00 00 80 |................| > 000001c0 98 55 e4 53 ef e6 e9 03 9a 71 4f 19 3f 8b 6f 14 |.UäSïæé..qO.?.o.| > 000001d0 75 d6 51 9a dd 84 53 3e c4 80 ae a1 c2 83 53 5e |uÖQ.Ý.S>Ä.®¡Â.S^| > 000001e0 69 c3 f8 1b 35 0b 15 f2 4f 15 46 42 79 6f 8b 13 |iÃø.5..òO.FByo..| > 000001f0 4c 65 64 ba 38 cd 51 8b 00 00 00 00 2c f9 ac 2c |Ledº8ÍQ.....,ù¬,| These should all be zero. Basically, whatever happened to cause the USB reset has resulted in corruption of various sectors of the hard drive. If you can't get your usb drive to work reliably, then don't expect the filesystem to stay intact. I'd start by replacing the USB cable and probably the enclosure, writing a pattern to the entire harddrive (e.g. 0xa5a55a5a) and verifying you can read it back without corruption or USB resets. If you can't get your USB drive to work reliably, then it's not a good medium for storing backups.... If that is fine, mkfs the filesystem on it and redo your backup again. > It is a problem with the interaction of LUKS, XFS and USB? You are encrypting the external drive? That would explain the garbage then - a single bit error in a sector will render it completely incorrect.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+FKRz+23+fromorbit.com=david@internode.on.net Sun Dec 19 18:58:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_21 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBK0wIKs031736 for ; Sun, 19 Dec 2010 18:58:18 -0600 X-ASG-Debug-ID: 1292806813-4b3900b50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2152A208953 for ; Sun, 19 Dec 2010 17:00:13 -0800 (PST) Received: from mail.internode.on.net (bld-mail20.adl6.internode.on.net [150.101.137.105]) by cuda.sgi.com with ESMTP id OKF2BwDNQ8HD2aCl for ; Sun, 19 Dec 2010 17:00:13 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 5205026-1927428 for multiple; Mon, 20 Dec 2010 11:30:12 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PUU6k-00074W-Li; Mon, 20 Dec 2010 12:00:10 +1100 Date: Mon, 20 Dec 2010 12:00:10 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/9] xfs: Pull EFI/EFD handling out from under the AIL lock Subject: Re: [PATCH 2/9] xfs: Pull EFI/EFD handling out from under the AIL lock Message-ID: <20101220010010.GI5193@dastard> References: <1292214743-18073-1-git-send-email-david@fromorbit.com> <1292214743-18073-3-git-send-email-david@fromorbit.com> <20101217112254.GB12965@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101217112254.GB12965@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail20.adl6.internode.on.net[150.101.137.105] X-Barracuda-Start-Time: 1292806815 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49931 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, Dec 17, 2010 at 06:22:54AM -0500, Christoph Hellwig wrote: > Looks good, > > Reviewed-by: Christoph Hellwig > > Some minor comments below: > > > +STATIC void > > +__xfs_efi_release( > > + struct xfs_efi_log_item *efip) > > +{ > > + struct xfs_ail *ailp = efip->efi_item.li_ailp; > > + > > + if (!test_and_clear_bit(XFS_EFI_COMMITTED, &efip->efi_flags)) { > > + spin_lock(&ailp->xa_lock); > > + /* xfs_trans_ail_delete() drops the AIL lock. */ > > + xfs_trans_ail_delete(ailp, (xfs_log_item_t *)efip); > > The second argument should be &efip->efi_item to preserve ty;e safety. > > > void > > xfs_efi_release(xfs_efi_log_item_t *efip, > > uint nextents) > > { > > + ASSERT(atomic_read(&efip->efi_next_extent) >= nextents); > > + if (!atomic_sub_and_test(nextents, &efip->efi_next_extent)) > > + return; > > > > + __xfs_efi_release(efip); > > Why not just: > > if (atomic_sub_and_test(nextents, &efip->efi_next_extent)) > __xfs_efi_release(efip); > > ? Good idea. Fixed up. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0++t02+23+fromorbit.com=david@internode.on.net Sun Dec 19 19:04:53 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBK14q6U032214 for ; Sun, 19 Dec 2010 19:04:53 -0600 X-ASG-Debug-ID: 1292807207-696c02e50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3873514689B4 for ; Sun, 19 Dec 2010 17:06:47 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id mvAjNRHbkz1Jthtw for ; Sun, 19 Dec 2010 17:06:47 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50216831-1927428 for multiple; Mon, 20 Dec 2010 11:36:46 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PUUD5-000759-TZ; Mon, 20 Dec 2010 12:06:43 +1100 Date: Mon, 20 Dec 2010 12:06:43 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 8/9] xfs: use AIL bulk update function to implement single updates Subject: Re: [PATCH 8/9] xfs: use AIL bulk update function to implement single updates Message-ID: <20101220010643.GJ5193@dastard> References: <1292214743-18073-1-git-send-email-david@fromorbit.com> <1292214743-18073-9-git-send-email-david@fromorbit.com> <20101217141556.GA30830@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101217141556.GA30830@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1292807209 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49932 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, Dec 17, 2010 at 09:15:56AM -0500, Christoph Hellwig wrote: > On Mon, Dec 13, 2010 at 03:32:22PM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > We now have two copies of AIL insert operations that are mostly > > duplicate functionality. The single log item updates can be > > implemented via the bulk updates by turning xfs_trans_ail_update() > > into a simple wrapper. This removes all the duplicate insert > > functionality and associated helpers. > > > Looks good, > > > Reviewed-by: Christoph Hellwig > > > + struct xfs_ail *ailp, > > +static inline void > > +xfs_trans_ail_update( > > + xfs_log_item_t *lip, > > + xfs_lsn_t lsn) __releases(ailp->xa_lock) > > +{ > > + struct xfs_log_item *log_items[1] = { lip, }; > > + > > + xfs_trans_ail_update_bulk(ailp, log_items, 1, lsn); > > This could be simplified down to: > > xfs_trans_ail_update_bulk(ailp, &lip, 1, lsn); > > at which point it could even become a macro. Yup, good point. Done. Cheers, Dave. -- Dave Chinner david@fromorbit.com From xfs@pzystorm.de Sun Dec 19 20:54:17 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_45 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBK2sGv9043454 for ; Sun, 19 Dec 2010 20:54:17 -0600 X-ASG-Debug-ID: 1292813772-4e3f03a00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.pzystorm.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 255A0208AF1 for ; Sun, 19 Dec 2010 18:56:12 -0800 (PST) Received: from mail.pzystorm.de (mail.pzystorm.de [188.40.193.4]) by cuda.sgi.com with ESMTP id kPpWkqZYGu79T65t for ; Sun, 19 Dec 2010 18:56:12 -0800 (PST) Received: from hnvr-4d07aad7.pool.mediaways.net ([77.7.170.215] helo=[192.168.0.72]) by mail.pzystorm.de with esmtpsa (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.69) (envelope-from ) id 1PUVuz-00088K-7g for xfs@oss.sgi.com; Mon, 20 Dec 2010 03:56:11 +0100 Message-ID: <4D0EC5C5.2070407@pzystorm.de> Date: Mon, 20 Dec 2010 03:56:05 +0100 From: Kevin Richter Reply-To: xfs@pzystorm.de MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Problem with XFS on USB 2TB HD Subject: Re: Problem with XFS on USB 2TB HD References: <4D0C9A4F.4040108@pzystorm.de> <20101220001024.GH5193@dastard> In-Reply-To: <20101220001024.GH5193@dastard> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail.pzystorm.de[188.40.193.4] X-Barracuda-Start-Time: 1292813773 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49939 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Thanks a lot for your responses. > I don't have a solution to your problem unfortunately. Keep in mind you > posted this problem on a weekend, and one week before Christmas no less. > Your timing is not optimal for receiving a prompt response. It's > possible you may have to wait until Monday for help. :( No problem at all. It can wait. My backup drive has indeed no real important stuff on it - just 100% backups from other disks. I'd just use this issue as an opportunity to try out the xfs repair functionality. >> It is a problem with the interaction of LUKS, XFS and USB? > > You are encrypting the external drive? That would explain the > garbage then - a single bit error in a sector will render it > completely incorrect.... Yes, I do. aes-cbc-essiv:sha256 If the connection breaks while writing a block, only this block should be garbled? This should be 256 bit in this case, shouldn't it? >> ERROR: The filesystem has valuable metadata changes in a log which >> > needs to be replayed. > Given this message, you'll have to run xfs_repair with the zero log > option ( -L ). This is dangerous, but it can't get much worse anyway. > > Run xfs_repair -L /device , you should be able to mount your filesystem > afterwards, however any data under change at the time of failure will > most probably be lost. OK, if there is no way around... xfs_repair -L /dev/mapper/backup has run a few minutes and has printed a lot of screens. After lines like disconnected inode 4083355215, moving to lost+found disconnected dir inode 4083355216, moving to lost+found or Phase 7 - verify and correct link counts... resetting inode 128 nlinks from 2 to 3 ... b767c6f0: Badness in key lookup (length) bp=(bno 0, len 4096 bytes) key=(bno 0, len 512 bytes) done it has succeeded in this way, that it is now at least possible to mount the volume. But there is only the lost+found folder in there which contains again a lot of folders and files named with numbers. Looking deeper in these directories all the names of further files or directories are preserved. Phew! Only the fs structure in the first level seems to be garbled. Checking the size of the lost+found folder, (nearly) everything seems to be there. Now I am asking myself: If only one 256 bit block is garbled (f. ex. because of a terminated usb connection) all the directory and file names in the first level gets garbled? Wicked! Cheers, Kevin From SRS0++t02+23+fromorbit.com=david@internode.on.net Sun Dec 19 22:49:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_45 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBK4nY3l062018 for ; Sun, 19 Dec 2010 22:49:35 -0600 X-ASG-Debug-ID: 1292820688-500901990000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9E072204A5E for ; Sun, 19 Dec 2010 20:51:29 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id ry69NxKWpfXrWgMe for ; Sun, 19 Dec 2010 20:51:29 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50936491-1927428 for multiple; Mon, 20 Dec 2010 15:21:28 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PUXiY-0007Lp-3Z; Mon, 20 Dec 2010 15:51:26 +1100 Date: Mon, 20 Dec 2010 15:51:26 +1100 From: Dave Chinner To: Kevin Richter Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Problem with XFS on USB 2TB HD Subject: Re: Problem with XFS on USB 2TB HD Message-ID: <20101220045126.GK5193@dastard> References: <4D0C9A4F.4040108@pzystorm.de> <20101220001024.GH5193@dastard> <4D0EC5C5.2070407@pzystorm.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4D0EC5C5.2070407@pzystorm.de> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1292820690 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49947 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 20, 2010 at 03:56:05AM +0100, Kevin Richter wrote: > Thanks a lot for your responses. > > > I don't have a solution to your problem unfortunately. Keep in mind you > > posted this problem on a weekend, and one week before Christmas no less. > > Your timing is not optimal for receiving a prompt response. It's > > possible you may have to wait until Monday for help. :( > > No problem at all. It can wait. My backup drive has indeed no real > important stuff on it - just 100% backups from other disks. > I'd just use this issue as an opportunity to try out the xfs repair > functionality. > > > >> It is a problem with the interaction of LUKS, XFS and USB? > > > > You are encrypting the external drive? That would explain the > > garbage then - a single bit error in a sector will render it > > completely incorrect.... > > Yes, I do. > aes-cbc-essiv:sha256 > If the connection breaks while writing a block, only this block should > be garbled? This should be 256 bit in this case, shouldn't it? Who knows how the encryption algorithm (sha256) is encrypting blocks. or what internal block size it is using. All I know is that the it has to ensure that sectors (512 bytes) are written and read atomically to/from the storage device. Hence, at minimum, it will be encoding individual sectors (512 bytes), so any single bit error in the sector will likely result in 512 bytes of garbage. > it has succeeded in this way, that it is now at least possible to mount > the volume. But there is only the lost+found folder in there which > contains again a lot of folders and files named with numbers. Looking > deeper in these directories all the names of further files or > directories are preserved. Phew! Only the fs structure in the first > level seems to be garbled. > > Checking the size of the lost+found folder, (nearly) everything seems to > be there. > > Now I am asking myself: If only one 256 bit block is garbled (f. ex. > because of a terminated usb connection) all the directory and file names > in the first level gets garbled? Wicked! That's because you had the misfortune of garbling the root directory inode along with the superblock. That's a very specific corruption, but if the corruption occurred a few blocks away in a data extent you wouldn't even know about it until you restore from backup and realised the file content in the backup are corrupted. Indeed - you should consider that entire backup as corrupted and redo it from scratch. FWIW, encryption makes any sort of corruption below the encrypted layer much, much worse as it turns things like single bit media errors into undecipherable, unrecoverable blocks of noise. No filesystem can recover from such corruption of an encrypted device. Hence if you had the same problem on ex3, ext4, JFS, etc you will end up with the same mess (or worse). Cheers, Dave. -- Dave Chinner david@fromorbit.com From michael.monnerie@is.it-management.at Mon Dec 20 02:57:59 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBK8vwp9099673 for ; Mon, 20 Dec 2010 02:57:58 -0600 X-ASG-Debug-ID: 1292835591-226203e30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EBBA0146A23A for ; Mon, 20 Dec 2010 00:59:51 -0800 (PST) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id gmmxLlvOMstYjzhd for ; Mon, 20 Dec 2010 00:59:51 -0800 (PST) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 10539602; Mon, 20 Dec 2010 09:59:50 +0100 (CET) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 139B2401C3E; Mon, 20 Dec 2010 09:59:49 +0100 (CET) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com, xfs@pzystorm.de X-ASG-Orig-Subj: Re: Problem with XFS on USB 2TB HD Subject: Re: Problem with XFS on USB 2TB HD Date: Mon, 20 Dec 2010 09:59:44 +0100 User-Agent: KMail/1.13.5 (Linux/2.6.37-rc5-zmi; KDE/4.4.4; x86_64; ; ) References: <4D0C9A4F.4040108@pzystorm.de> In-Reply-To: <4D0C9A4F.4040108@pzystorm.de> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart2195009.57HsRr3vnz"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201012200959.48877@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1292835592 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49962 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart2195009.57HsRr3vnz Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable On Samstag, 18. Dezember 2010 Kevin Richter wrote: > I have 2.9.8 (http://packages.debian.org/lenny/xfsprogs) Actual is 3.1.x, which has a *lot* of enhancements especially for speed=20 and memory consumption, and also fixes some additional errors which the=20 older versions couldn't repair. You've fixed your problem now, but it's really good to get xfs_repair=20 updated. =2D-=20 mit freundlichen Gr=C3=BCssen, Michael Monnerie, Ing. BSc it-management Internet Services: Prot=C3=A9ger http://proteger.at [gesprochen: Prot-e-schee] Tel: +43 660 / 415 6531 // ****** Radiointerview zum Thema Spam ****** // http://www.it-podcast.at/archiv.html#podcast-100716 //=20 // Haus zu verkaufen: http://zmi.at/langegg/ --nextPart2195009.57HsRr3vnz Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.15 (GNU/Linux) iEYEABECAAYFAk0PGwQACgkQzhSR9xwSCbTZhwCghfauhayWRIQdrK9TXH1VdO5N 9QkAoNzAqhr2b5xFN4aT+nY4XqiT3QsG =mz41 -----END PGP SIGNATURE----- --nextPart2195009.57HsRr3vnz-- From eflorac@intellique.com Mon Dec 20 03:54:02 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBK9s2Gv105156 for ; Mon, 20 Dec 2010 03:54:02 -0600 X-ASG-Debug-ID: 1292838953-113102ea0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8135320B1AF for ; Mon, 20 Dec 2010 01:55:57 -0800 (PST) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id JT0zLfa6437xBOpX for ; Mon, 20 Dec 2010 01:55:57 -0800 (PST) Received: from galadriel.home (unknown [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP id 897F2A62D9; Mon, 20 Dec 2010 10:55:48 +0100 (CET) Date: Mon, 20 Dec 2010 10:55:47 +0100 From: Emmanuel Florac To: Dave Chinner Cc: Kevin Richter , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Problem with XFS on USB 2TB HD Subject: Re: Problem with XFS on USB 2TB HD Message-ID: <20101220105547.4f9e7218@galadriel.home> In-Reply-To: <20101220045126.GK5193@dastard> References: <4D0C9A4F.4040108@pzystorm.de> <20101220001024.GH5193@dastard> <4D0EC5C5.2070407@pzystorm.de> <20101220045126.GK5193@dastard> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.20.1; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1292838959 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49967 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Mon, 20 Dec 2010 15:51:26 +1100 vous =C3=A9criviez: > >=20 > Who knows how the encryption algorithm (sha256) is encrypting > blocks. According to Wikipedia, the block size is 512. > FWIW, encryption makes any sort of corruption below the encrypted > layer much, much worse as it turns things like single bit media > errors into undecipherable, unrecoverable blocks of noise. No > filesystem can recover from such corruption of an encrypted device. > Hence if you had the same problem on ex3, ext4, JFS, etc you will > end up with the same mess (or worse). That's why I have an unencrypted local backup and an encrypted remote one :) --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From jpiszcz@lucidpixels.com Mon Dec 20 04:18:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBKAIN0j106735 for ; Mon, 20 Dec 2010 04:18:23 -0600 X-ASG-Debug-ID: 1292840418-2e4203830000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lucidpixels.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id AFC051CDEACC for ; Mon, 20 Dec 2010 02:20:18 -0800 (PST) Received: from lucidpixels.com (lucidpixels.com [75.144.35.66]) by cuda.sgi.com with ESMTP id ik0vnfaBgKbM6pMB for ; Mon, 20 Dec 2010 02:20:18 -0800 (PST) Received: by lucidpixels.com (Postfix, from userid 1001) id 7D50612099A; Mon, 20 Dec 2010 05:20:18 -0500 (EST) Date: Mon, 20 Dec 2010 05:20:18 -0500 (EST) From: Justin Piszcz To: xfs@oss.sgi.com X-ASG-Orig-Subj: Question regarding xfs_repair / memory requirement. Subject: Question regarding xfs_repair / memory requirement. Message-ID: User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; format=flowed; charset=US-ASCII X-Barracuda-Connect: lucidpixels.com[75.144.35.66] X-Barracuda-Start-Time: 1292840419 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49969 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi, I am looking at FS to use for a possible 43TB array. If there is a problem with a volume this large, how much ram will xfs_repair need to fsck the volume? Justin. From eflorac@intellique.com Mon Dec 20 05:02:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBKB2WJO111840 for ; Mon, 20 Dec 2010 05:02:33 -0600 X-ASG-Debug-ID: 1292843063-447f00fe0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BBA491CDF13E for ; Mon, 20 Dec 2010 03:04:27 -0800 (PST) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id uBAzjKcNzGOpPURW for ; Mon, 20 Dec 2010 03:04:27 -0800 (PST) Received: from galadriel.home (unknown [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP id 25B27A62AA; Mon, 20 Dec 2010 12:04:19 +0100 (CET) Date: Mon, 20 Dec 2010 12:04:17 +0100 From: Emmanuel Florac To: Justin Piszcz Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Question regarding xfs_repair / memory requirement. Subject: Re: Question regarding xfs_repair / memory requirement. Message-ID: <20101220120417.1a0df133@galadriel.home> In-Reply-To: References: Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.20.1; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1292843069 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.49971 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Mon, 20 Dec 2010 05:20:18 -0500 (EST) vous =E9criviez: > I am looking at FS to use for a possible 43TB array. > If there is a problem with a volume this large, how much ram will=20 > xfs_repair need to fsck the volume? >=20 Nothing special, I have tens of such filesystems. With a < 3.0 xfs_progs you should be able to run xfs_repair with 8 GB of RAM. With newer versions the memory requirement are even lower. I often needed at times to run older xfs_repair on big filesystems with only 1 GB of RAM, and using lots of swap (3, 4 GB or more) did the trick, though of course it was slow as a caterpillar swimming in molasses. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From BATV+09ef06d8205ccdb14ecd+2675+infradead.org+hch@bombadil.srs.infradead.org Mon Dec 20 05:26:58 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBKBQvqH115555 for ; Mon, 20 Dec 2010 05:26:58 -0600 X-ASG-Debug-ID: 1292844534-6b1300be0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5B0FF1CDEFC5; Mon, 20 Dec 2010 03:28:54 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Xh8bVC0lE1CkpsFi; Mon, 20 Dec 2010 03:28:54 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PUdvA-0001xU-5v; Mon, 20 Dec 2010 11:28:52 +0000 Date: Mon, 20 Dec 2010 06:28:52 -0500 From: Christoph Hellwig To: Alex Elder Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/4] xfs: refactor xlog_recover_commit_trans Subject: Re: [PATCH 3/4] xfs: refactor xlog_recover_commit_trans Message-ID: <20101220112852.GB6881@infradead.org> References: <20101201220620.340188389@bombadil.infradead.org> <20101201220710.454838485@bombadil.infradead.org> <1292534295.2457.58.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292534295.2457.58.camel@doink> 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[18.85.46.34] X-Barracuda-Start-Time: 1292844534 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 16, 2010 at 03:18:15PM -0600, Alex Elder wrote: > On Wed, 2010-12-01 at 17:06 -0500, Christoph Hellwig wrote: > > > > Merge the call to xlog_recover_reorder_trans and the loop over the > > recovery items from xlog_recover_do_trans into xlog_recover_commit_trans, > > and keep the switch statement over the log item types as a separate helper. > > > > Signed-off-by: Christoph Hellwig > > > > I'm making a small change to this one patch though... > > + case XFS_LI_BUF: > > + return xlog_recover_do_buffer_trans(log, item, pass); > > + break; > > I have deleted this "break" statement. Yeah, this is a leftover from an earlier variant. Thanks for spotting it. From BATV+09ef06d8205ccdb14ecd+2675+infradead.org+hch@bombadil.srs.infradead.org Mon Dec 20 05:27:53 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBKBRqfF115620 for ; Mon, 20 Dec 2010 05:27:53 -0600 X-ASG-Debug-ID: 1292844589-446e01320000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 09A82146C9C3 for ; Mon, 20 Dec 2010 03:29:49 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id rmXvBQlXISZk3Cr7 for ; Mon, 20 Dec 2010 03:29:49 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PUdw3-00020Z-PN; Mon, 20 Dec 2010 11:29:47 +0000 Date: Mon, 20 Dec 2010 06:29:47 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/7] xfs: split direct IO write path from xfs_file_aio_write Subject: Re: [PATCH 4/7] xfs: split direct IO write path from xfs_file_aio_write Message-ID: <20101220112947.GC6881@infradead.org> References: <1292376208-16282-1-git-send-email-david@fromorbit.com> <1292376208-16282-5-git-send-email-david@fromorbit.com> <20101216120629.GC20445@infradead.org> <20101217073125.GE5193@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101217073125.GE5193@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[18.85.46.34] X-Barracuda-Start-Time: 1292844590 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, Dec 17, 2010 at 06:31:25PM +1100, Dave Chinner wrote: > > Speaking of that, shouldn't xfs_file_aio_read also take the iolock > > exclusive during the page invalidation and then demote it, just like > > the write case? The above helpers would enforce that nicely. > > Probably, though it might be best to leave that to another cleanup > series. I'll see how much perturbation of the read path it makes.... Yes, it should be a separate patch for sure. If you prefer another series that's fine with me, too. From BATV+09ef06d8205ccdb14ecd+2675+infradead.org+hch@bombadil.srs.infradead.org Mon Dec 20 05:29:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBKBTiZM115739 for ; Mon, 20 Dec 2010 05:29:45 -0600 X-ASG-Debug-ID: 1292844701-446d011e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8E0A6146C9F4 for ; Mon, 20 Dec 2010 03:31:41 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id CiHBtTNupkuqQNMP for ; Mon, 20 Dec 2010 03:31:41 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PUdxr-0002na-Aw; Mon, 20 Dec 2010 11:31:39 +0000 Date: Mon, 20 Dec 2010 06:31:39 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Nick Piggin , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_efi_item slab leak Subject: Re: xfs_efi_item slab leak Message-ID: <20101220113139.GA10324@infradead.org> References: <20101218000245.GG5193@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101218000245.GG5193@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[18.85.46.34] X-Barracuda-Start-Time: 1292844701 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, Dec 18, 2010 at 11:02:45AM +1100, Dave Chinner wrote: > Ok, after unmounting everything I can see two items in remaining in > the xfs_efi_item cache after an xfstests run. ??t's probably to do > with a filesystem shutdown not cleaning them up correctly. I'll put > it on my list of stuff to track down. Does it still happen with your working tree? The incorrect handling of IOP_UNPING with remove == 1 looks like it could cause something similar. From BATV+09ef06d8205ccdb14ecd+2675+infradead.org+hch@bombadil.srs.infradead.org Mon Dec 20 05:33:02 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_TICKET autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBKBX14i115909 for ; Mon, 20 Dec 2010 05:33:02 -0600 X-ASG-Debug-ID: 1292844898-397d01e10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 16E1F146CC53 for ; Mon, 20 Dec 2010 03:34:58 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id eQxFkyZJ9w9XhFwQ for ; Mon, 20 Dec 2010 03:34:58 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PUe14-0003Rw-EL; Mon, 20 Dec 2010 11:34:58 +0000 Date: Mon, 20 Dec 2010 06:34:58 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 01/12] xfs: convert log grant ticket queues to list heads Subject: Re: [PATCH 01/12] xfs: convert log grant ticket queues to list heads Message-ID: <20101220113458.GA12806@infradead.org> References: <1292215483-18224-1-git-send-email-david@fromorbit.com> <1292215483-18224-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292215483-18224-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[18.85.46.34] X-Barracuda-Start-Time: 1292844899 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 13, 2010 at 03:44:32PM +1100, Dave Chinner wrote: > - __field(void *, reserve_headq) > - __field(void *, write_headq) > + __field(void *, reserveq) > + __field(void *, writeq) To repeat my question from the last review: what's the point in logging this at all? There's not much we can do with it from trace-cmd / perf output. What might be more useful is a list_empty() boolean flag. From BATV+09ef06d8205ccdb14ecd+2675+infradead.org+hch@bombadil.srs.infradead.org Mon Dec 20 05:35:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBKBZYng116034 for ; Mon, 20 Dec 2010 05:35:34 -0600 X-ASG-Debug-ID: 1292845051-61f302520000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 97E8B20E061 for ; Mon, 20 Dec 2010 03:37:31 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id M6HWTpocg1XcEyUi for ; Mon, 20 Dec 2010 03:37:31 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PUe3X-0004EV-7D; Mon, 20 Dec 2010 11:37:31 +0000 Date: Mon, 20 Dec 2010 06:37:31 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 03/12] xfs: rework log grant space calculations Subject: Re: [PATCH 03/12] xfs: rework log grant space calculations Message-ID: <20101220113731.GB12806@infradead.org> References: <1292215483-18224-1-git-send-email-david@fromorbit.com> <1292215483-18224-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292215483-18224-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1292845051 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Looks good, Reviewed-by: Christoph Hellwig From BATV+09ef06d8205ccdb14ecd+2675+infradead.org+hch@bombadil.srs.infradead.org Mon Dec 20 05:38:24 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBKBcOWw116186 for ; Mon, 20 Dec 2010 05:38:24 -0600 X-ASG-Debug-ID: 1292845220-6b0e01080000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 271E31CDF29A for ; Mon, 20 Dec 2010 03:40:21 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Kn3sgmHsuhTDLB8y for ; Mon, 20 Dec 2010 03:40:21 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PUe6G-00057T-Nr; Mon, 20 Dec 2010 11:40:20 +0000 Date: Mon, 20 Dec 2010 06:40:20 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 04/12] xfs: combine grant heads into a single 64 bit integer Subject: Re: [PATCH 04/12] xfs: combine grant heads into a single 64 bit integer Message-ID: <20101220114020.GC12806@infradead.org> References: <1292215483-18224-1-git-send-email-david@fromorbit.com> <1292215483-18224-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292215483-18224-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1292845221 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 13, 2010 at 03:44:35PM +1100, Dave Chinner wrote: > From: Dave Chinner > > Prepare for switching the grant heads to atomic variables by > combining the two 32 bit values that make up the grant head into a > single 64 bit variable. Provide wrapper functions to combine and > split the grant heads appropriately for calculations and use them as > necessary. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig Minor nitpick: > + if ((tail_cycle == head_cycle) && (head_bytes >= tail_bytes)) { > + free_bytes = log->l_logsize - (head_bytes - tail_bytes); > + } else if ((tail_cycle + 1) < head_cycle) { Lots of superflous braces in the if statements. From BATV+09ef06d8205ccdb14ecd+2675+infradead.org+hch@bombadil.srs.infradead.org Mon Dec 20 05:39:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBKBd2Vk116245 for ; Mon, 20 Dec 2010 05:39:03 -0600 X-ASG-Debug-ID: 1292845259-446d017a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C8DDE146CB38 for ; Mon, 20 Dec 2010 03:40:59 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 0DWQCYD6ahV1ecgx for ; Mon, 20 Dec 2010 03:40:59 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PUe6t-00059z-5j; Mon, 20 Dec 2010 11:40:59 +0000 Date: Mon, 20 Dec 2010 06:40:59 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 05/12] xfs: use wait queues directly for the log wait queues Subject: Re: [PATCH 05/12] xfs: use wait queues directly for the log wait queues Message-ID: <20101220114059.GD12806@infradead.org> References: <1292215483-18224-1-git-send-email-david@fromorbit.com> <1292215483-18224-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292215483-18224-6-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1292845259 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 13, 2010 at 03:44:36PM +1100, Dave Chinner wrote: > From: Dave Chinner > > The log grant queues are one of the few places left using sv_t > constructs for waiting. Given we are touching this code, we should > convert them to plain wait queues. While there, convert all the > other sv_t users in the log code as well. > > Seeing as this removes the last users of the sv_t type, remove the > header file defining the wrapper and the fragments that still > reference it. Looks good, Reviewed-by: Christoph Hellwig From BATV+09ef06d8205ccdb14ecd+2675+infradead.org+hch@bombadil.srs.infradead.org Mon Dec 20 05:39:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBKBdY2q116293 for ; Mon, 20 Dec 2010 05:39:34 -0600 X-ASG-Debug-ID: 1292845291-479f01890000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9885C146CBE1 for ; Mon, 20 Dec 2010 03:41:31 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 4T8KIFK3mESDZjkA for ; Mon, 20 Dec 2010 03:41:31 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PUe7O-0005Cp-W2; Mon, 20 Dec 2010 11:41:31 +0000 Date: Mon, 20 Dec 2010 06:41:30 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 06/12] xfs: make AIL tail pushing independent of the grant lock Subject: Re: [PATCH 06/12] xfs: make AIL tail pushing independent of the grant lock Message-ID: <20101220114130.GE12806@infradead.org> References: <1292215483-18224-1-git-send-email-david@fromorbit.com> <1292215483-18224-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292215483-18224-7-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1292845291 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Looks good, Reviewed-by: Christoph Hellwig From BATV+09ef06d8205ccdb14ecd+2675+infradead.org+hch@bombadil.srs.infradead.org Mon Dec 20 05:47:04 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_TICKET autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBKBl3aN117306 for ; Mon, 20 Dec 2010 05:47:03 -0600 X-ASG-Debug-ID: 1292845740-7cbd01080000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0253D20E0E1 for ; Mon, 20 Dec 2010 03:49:00 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id bIGFyKVd4iV18PGS for ; Mon, 20 Dec 2010 03:49:00 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PUeEe-0006SJ-JY; Mon, 20 Dec 2010 11:49:00 +0000 Date: Mon, 20 Dec 2010 06:49:00 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 10/12] xfs: introduce new locks for the log grant ticket wait queues Subject: Re: [PATCH 10/12] xfs: introduce new locks for the log grant ticket wait queues Message-ID: <20101220114900.GF12806@infradead.org> References: <1292215483-18224-1-git-send-email-david@fromorbit.com> <1292215483-18224-11-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292215483-18224-11-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[18.85.46.34] X-Barracuda-Start-Time: 1292845741 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 13, 2010 at 03:44:41PM +1100, Dave Chinner wrote: > From: Dave Chinner > > The log grant ticket wait queues are currently protected by the log > grant lock. However, the queues are functionally independent from > each other, and operations on them only require serialisation > against other queue operations now that all of the other log > variables they use are atomic values. > > Hence, we can make them independent of the grant lock by introducing > new locks just to protect the lists operations. because the lists > are independent, we can use a lock per list and ensure that reserve > and write head queuing do not contend. > > To ensure forced shutdowns work correctly in conjunction with the > new fast paths, ensure that we check whether the log has been shut > down in the grant functions once we hold the relevant spin locks but > before we go to sleep. This is needed to co-ordinate correctly with > the wakeups that are issued on the ticket queues so we don't leave > any processes sleeping on the queues during a shutdown. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From BATV+09ef06d8205ccdb14ecd+2675+infradead.org+hch@bombadil.srs.infradead.org Mon Dec 20 05:48:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBKBmpab117665 for ; Mon, 20 Dec 2010 05:48:51 -0600 X-ASG-Debug-ID: 1292845848-5a4402f70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 78FAE20D86B for ; Mon, 20 Dec 2010 03:50:48 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id ZuWcdq7aDuVkACce for ; Mon, 20 Dec 2010 03:50:48 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PUeGO-0007Hu-3Y; Mon, 20 Dec 2010 11:50:48 +0000 Date: Mon, 20 Dec 2010 06:50:48 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 11/12] xfs: convert grant head manipulations to lockless algorithm Subject: Re: [PATCH 11/12] xfs: convert grant head manipulations to lockless algorithm Message-ID: <20101220115048.GG12806@infradead.org> References: <1292215483-18224-1-git-send-email-david@fromorbit.com> <1292215483-18224-12-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292215483-18224-12-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[18.85.46.34] X-Barracuda-Start-Time: 1292845848 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Looks good, Reviewed-by: Christoph Hellwig From BATV+09ef06d8205ccdb14ecd+2675+infradead.org+hch@bombadil.srs.infradead.org Mon Dec 20 05:49:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBKBnThx117784 for ; Mon, 20 Dec 2010 05:49:29 -0600 X-ASG-Debug-ID: 1292845886-26b003530000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7DF79146D126 for ; Mon, 20 Dec 2010 03:51:26 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id TxklfkZ3LxtcIKHE for ; Mon, 20 Dec 2010 03:51:26 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PUeGz-0007JW-SK; Mon, 20 Dec 2010 11:51:25 +0000 Date: Mon, 20 Dec 2010 06:51:25 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 02/12] xfs: fact out common grant head/log tail verification code Subject: Re: [PATCH 02/12] xfs: fact out common grant head/log tail verification code Message-ID: <20101220115125.GH12806@infradead.org> References: <1292215483-18224-1-git-send-email-david@fromorbit.com> <1292215483-18224-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292215483-18224-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[18.85.46.34] X-Barracuda-Start-Time: 1292845886 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 13, 2010 at 03:44:33PM +1100, Dave Chinner wrote: > From: Dave Chinner > > Factor repeated debug code out of grant head manipulation functions into a > separate function. This removes ifdef DEBUG spagetti from the code and makes > the code easier to follow. Looks good, Reviewed-by: Christoph Hellwig From BATV+09ef06d8205ccdb14ecd+2675+infradead.org+hch@bombadil.srs.infradead.org Mon Dec 20 06:04:37 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBKC4bZV120070 for ; Mon, 20 Dec 2010 06:04:37 -0600 X-ASG-Debug-ID: 1292846794-6b0f01920000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 969C61CDF3FD for ; Mon, 20 Dec 2010 04:06:34 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Tbr8U36TufuAD31v for ; Mon, 20 Dec 2010 04:06:34 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PUeVe-0001yA-5z; Mon, 20 Dec 2010 12:06:34 +0000 Date: Mon, 20 Dec 2010 07:06:34 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 08/12] xfs: convert l_tail_lsn to an atomic variable. Subject: Re: [PATCH 08/12] xfs: convert l_tail_lsn to an atomic variable. Message-ID: <20101220120634.GA3582@infradead.org> References: <1292215483-18224-1-git-send-email-david@fromorbit.com> <1292215483-18224-9-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292215483-18224-9-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1292846794 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 13, 2010 at 03:44:39PM +1100, Dave Chinner wrote: > From: Dave Chinner > > log->l_tail_lsn is currently protected by the log grant lock. The > lock is only needed for serialising readers against writers, so we > don't really need the lock if we make the l_tail_lsn variable an > atomic. Converting the l_tail_lsn variable to an atomic64_t means we > can start to peel back the grant lock from various operations. > > Also, provide functions to safely crack an atomic LSN variable into > it's component pieces and to recombined the components into an > atomic variable. Use them where appropriate. > > This also removes the need for explicitly holding a spinlock to read > the l_tail_lsn on 32 bit platforms. I know I suggested this, but I think the atomic read of l_tail_lsn in xlog_space_left might be problemetic for the call from xlog_grant_push_ail, where we read it twice now. Maybe split xlog_space_left into a __xlog_space_left that gets the already cracked values, and xlog_space_left as a wrapper around it? From BATV+09ef06d8205ccdb14ecd+2675+infradead.org+hch@bombadil.srs.infradead.org Mon Dec 20 11:39:54 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBKHdpRL152536 for ; Mon, 20 Dec 2010 11:39:54 -0600 X-ASG-Debug-ID: 1292866907-26a2021d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8BD7720FC5E for ; Mon, 20 Dec 2010 09:41:48 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id XsYuZuANk4vZ4rQR for ; Mon, 20 Dec 2010 09:41:48 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PUjk2-0000tt-I7; Mon, 20 Dec 2010 17:41:46 +0000 Date: Mon, 20 Dec 2010 12:41:46 -0500 From: Christoph Hellwig To: Lukas Czerner Cc: xfs@oss.sgi.com, esandeen@redhat.com X-ASG-Orig-Subj: Re: [PATCH] Add test 248: Check filesystem FITRIM implementation Subject: Re: [PATCH] Add test 248: Check filesystem FITRIM implementation Message-ID: <20101220174146.GA32680@infradead.org> References: <1291996407-26251-1-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1291996407-26251-1-git-send-email-lczerner@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1292866908 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi Lukas, I've looked over it a bit again, and I can't really comment on the code too much, as my bash fu is nowhere near a level to actually make sense of most of the testcase. I have however ran it in a few setups and can comment based on that. First your current first discard to check if we actually support it is not handled correctly. Running the test on a filesystem that doesn't support it currently fails the test for me with: @@ -1,3 +1,2 @@ QA output created by 249 -Checking FITRIM support: done. -Running the test: done. +Checking FITRIM support: fstrim: FSTRIM: Inappropriate ioctl for device This should be easily fixable by redirecting the output of the test command to /dev/null and do a _notrun if it exited with an error value, just like other tests that require non-standard behaviour. Second using data from /usr/share/doc seems a bit non-deterministic to me, as the content will be different on every system. Any chance you could just use the xfstests source code instead? Third the testcase runs forever, e.g. 93 minutes in my KVM setup, even using a no-op discard implementation. While this is useful for burn in testing having a shorter run time version that can be run automatically would be really useful. I tried to figure out what paramters control the runtime, but as mentioned above my bash skill really aren't enough to do that. From BATV+09ef06d8205ccdb14ecd+2675+infradead.org+hch@bombadil.srs.infradead.org Mon Dec 20 11:58:17 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBKHwHa9154562 for ; Mon, 20 Dec 2010 11:58:17 -0600 X-ASG-Debug-ID: 1292868014-795f02dc0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 86063146D991 for ; Mon, 20 Dec 2010 10:00:14 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id L0YSTjMvNj6tYo9E for ; Mon, 20 Dec 2010 10:00:14 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PUk1t-0004s7-SG; Mon, 20 Dec 2010 18:00:13 +0000 Date: Mon, 20 Dec 2010 13:00:13 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com, linux-kernel@vger.kernel.org X-ASG-Orig-Subj: XFS status update for November 2010 Subject: XFS status update for November 2010 Message-ID: <20101220180013.GA16283@infradead.org> 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[18.85.46.34] X-Barracuda-Start-Time: 1292868014 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean >From looking at the kernel git commits November looked like a pretty slow month with just two hand full fixes going into the release candidates for Linux 2.6.37, and none at all going into the development tree. But in this case git statistics didn't tell the whole story - there was a lot of activity on patches for the next merge window on the list. The focus in November was still at metadata scalability, with various patchsets that improves parallel creates and unlinks again, and also improves 8-way dbench throughput by 30%. In addition to that there were patches to improve preallocation for NFS servers, to simplify the writeback code, and to remove the XFS-internal percpu counters for free space for the generic kernel percpu counters, which just needed a small improvement. On the user space side we saw the release of xfsprogs 3.1.4, which contains various accumulated bug fixes and Debian packaging updates. The xfsdump tree saw a large update to speed up restore by using mmap for an internal database and remove the limitation of ~ 214 million directory entries per dump file. The xfstests test suite saw three new testcases and various fixes, including support for the hfsplus filesystem. From SRS0++t02+23+fromorbit.com=david@internode.on.net Mon Dec 20 16:25:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBKMP1Da184775 for ; Mon, 20 Dec 2010 16:25:01 -0600 X-ASG-Debug-ID: 1292884016-38d403cf0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1A32B1CE1F0F for ; Mon, 20 Dec 2010 14:26:56 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id BQ5LPm7KyRDnKj7j for ; Mon, 20 Dec 2010 14:26:56 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50515294-1927428 for multiple; Tue, 21 Dec 2010 08:56:55 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PUoBx-0000T5-CA; Tue, 21 Dec 2010 09:26:53 +1100 Date: Tue, 21 Dec 2010 09:26:53 +1100 From: Dave Chinner To: Justin Piszcz Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Question regarding xfs_repair / memory requirement. Subject: Re: Question regarding xfs_repair / memory requirement. Message-ID: <20101220222653.GL5193@dastard> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1292884018 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50017 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 20, 2010 at 05:20:18AM -0500, Justin Piszcz wrote: > Hi, > > I am looking at FS to use for a possible 43TB array. > If there is a problem with a volume this large, how much ram will > xfs_repair need to fsck the volume? $ dd if=/dev/zero of=/mnt/scratch/test.img bs=1048576 count=1 seek=50000000 1+0 records in 1+0 records out 1048576 bytes (1.0 MB) copied, 0.00463602 s, 226 MB/s $ ls -lh /mnt/scratch/test.img -rw-r--r-- 1 dave dave 48T Dec 21 09:22 /mnt/scratch/test.img $ sudo mkfs.xfs -d name=/mnt/scratch/test.img,file,size=43t [sudo] password for dave: meta-data=/mnt/scratch/test.img isize=256 agcount=43, agsize=268435455 blks = sectsz=512 attr=2 data = bsize=4096 blocks=11542724565, imaxpct=5 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal log bsize=4096 blocks=521728, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 $ sudo xfs_repair -m 1 -vv /mnt/scratch/test.img Phase 1 - find and verify superblock... - max_mem = 1024, icount = 64, imem = 0, dblock = 11542724565, dmem = 5636095 Required memory for repair is greater that the maximum specified with the -m option. Please increase it to at least 5552 $ Not taking inodes into account, you'll need at least 5.5GB of RAM to run xfs_repair on a 43TB filesystem. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+r6Os+24+fromorbit.com=david@internode.on.net Mon Dec 20 18:50:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL0o3tJ200147 for ; Mon, 20 Dec 2010 18:50:03 -0600 X-ASG-Debug-ID: 1292892717-7b2b013e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1766E146F504 for ; Mon, 20 Dec 2010 16:51:57 -0800 (PST) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id CSJD4WxRnM3kFPsh for ; Mon, 20 Dec 2010 16:51:57 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 39174032-1927428 for multiple; Tue, 21 Dec 2010 11:21:56 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PUqSI-0000hl-Tm; Tue, 21 Dec 2010 11:51:54 +1100 Date: Tue, 21 Dec 2010 11:51:54 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/7] xfs: split direct IO write path from xfs_file_aio_write Subject: Re: [PATCH 4/7] xfs: split direct IO write path from xfs_file_aio_write Message-ID: <20101221005154.GM5193@dastard> References: <1292376208-16282-1-git-send-email-david@fromorbit.com> <1292376208-16282-5-git-send-email-david@fromorbit.com> <20101216120629.GC20445@infradead.org> <20101217073125.GE5193@dastard> <20101220112947.GC6881@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101220112947.GC6881@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1292892720 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 20, 2010 at 06:29:47AM -0500, Christoph Hellwig wrote: > On Fri, Dec 17, 2010 at 06:31:25PM +1100, Dave Chinner wrote: > > > Speaking of that, shouldn't xfs_file_aio_read also take the iolock > > > exclusive during the page invalidation and then demote it, just like > > > the write case? The above helpers would enforce that nicely. > > > > Probably, though it might be best to leave that to another cleanup > > series. I'll see how much perturbation of the read path it makes.... > > Yes, it should be a separate patch for sure. If you prefer another > series that's fine with me, too. Turns out to be pretty trivial to do - I included it in the new xfs_rw_ilock conversion patch for the moment. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+45mW+24+fromorbit.com=david@internode.on.net Mon Dec 20 18:52:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL0qDKr200298 for ; Mon, 20 Dec 2010 18:52:13 -0600 X-ASG-Debug-ID: 1292892848-0ba900870000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3F2991CE2402 for ; Mon, 20 Dec 2010 16:54:08 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id l9LoxzYTdevWMr3O for ; Mon, 20 Dec 2010 16:54:08 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50021320-1927428 for multiple; Tue, 21 Dec 2010 11:24:07 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PUqUP-0000hv-OS; Tue, 21 Dec 2010 11:54:05 +1100 Date: Tue, 21 Dec 2010 11:54:05 +1100 From: Dave Chinner To: Christoph Hellwig Cc: Nick Piggin , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_efi_item slab leak Subject: Re: xfs_efi_item slab leak Message-ID: <20101221005405.GN5193@dastard> References: <20101218000245.GG5193@dastard> <20101220113139.GA10324@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101220113139.GA10324@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1292892850 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50027 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 20, 2010 at 06:31:39AM -0500, Christoph Hellwig wrote: > On Sat, Dec 18, 2010 at 11:02:45AM +1100, Dave Chinner wrote: > > Ok, after unmounting everything I can see two items in remaining in > > the xfs_efi_item cache after an xfstests run. ??t's probably to do > > with a filesystem shutdown not cleaning them up correctly. I'll put > > it on my list of stuff to track down. > > Does it still happen with your working tree? The incorrect handling > of IOP_UNPING with remove == 1 looks like it could cause something > similar. I haven't checked the current patch set - just on the kernel that I was currently running - I'll do more analysis later this afternoon. I agree that the IOP_UNPIN() handling is a likely culprit, though. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+t6tm+24+fromorbit.com=david@internode.on.net Mon Dec 20 18:53:48 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_TICKET autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL0rlT4200401 for ; Mon, 20 Dec 2010 18:53:48 -0600 X-ASG-Debug-ID: 1292892943-7b2601280000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 39C40146F538 for ; Mon, 20 Dec 2010 16:55:44 -0800 (PST) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id ilux53v4aZNdFPPj for ; Mon, 20 Dec 2010 16:55:44 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50641385-1927428 for multiple; Tue, 21 Dec 2010 11:25:43 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PUqVx-0000i9-Ow; Tue, 21 Dec 2010 11:55:41 +1100 Date: Tue, 21 Dec 2010 11:55:41 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 01/12] xfs: convert log grant ticket queues to list heads Subject: Re: [PATCH 01/12] xfs: convert log grant ticket queues to list heads Message-ID: <20101221005541.GO5193@dastard> References: <1292215483-18224-1-git-send-email-david@fromorbit.com> <1292215483-18224-2-git-send-email-david@fromorbit.com> <20101220113458.GA12806@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101220113458.GA12806@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1292892945 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 20, 2010 at 06:34:58AM -0500, Christoph Hellwig wrote: > On Mon, Dec 13, 2010 at 03:44:32PM +1100, Dave Chinner wrote: > > - __field(void *, reserve_headq) > > - __field(void *, write_headq) > > + __field(void *, reserveq) > > + __field(void *, writeq) > > To repeat my question from the last review: what's the point in logging > this at all? There's not much we can do with it from trace-cmd / perf > output. What might be more useful is a list_empty() boolean flag. Oh, I missed that when running through all the comments. Thanks for pointing it out again - I'll fix it this time. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+p6vy+24+fromorbit.com=dave@internode.on.net Mon Dec 20 18:54:49 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_42, J_CHICKENPOX_45,J_CHICKENPOX_48 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL0smcG200467 for ; Mon, 20 Dec 2010 18:54:49 -0600 X-ASG-Debug-ID: 1292893004-040b00f00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0DCAA1CE2416 for ; Mon, 20 Dec 2010 16:56:44 -0800 (PST) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id Nn3LoGdmkh3r0qrj for ; Mon, 20 Dec 2010 16:56:44 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50641490-1927428 for ; Tue, 21 Dec 2010 11:26:43 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUqWw-0000iN-En for xfs@oss.sgi.com; Tue, 21 Dec 2010 11:56:42 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUqWn-0003F4-FV for xfs@oss.sgi.com; Tue, 21 Dec 2010 11:56:33 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: use KM_NOFS for allocations during attribute list operations Subject: [PATCH] xfs: use KM_NOFS for allocations during attribute list operations Date: Tue, 21 Dec 2010 11:56:33 +1100 Message-Id: <1292892993-12424-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1292893006 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50027 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner When listing attributes, we are doiing memory allocations under the inode ilock using only KM_SLEEP. This allows memory allocation to recurse back into the filesystem and do writeback, which may the ilock we already hold on the current inode. THis will deadlock. Hence use KM_NOFS for such allocations outside of transaction context to ensure that reclaim recursion does not occur. Reported-by: Nick Piggin Signed-off-by: Dave Chinner --- fs/xfs/xfs_attr_leaf.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index a6cff8e..71e90dc2 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -637,7 +637,7 @@ xfs_attr_shortform_list(xfs_attr_list_context_t *context) * It didn't all fit, so we have to sort everything on hashval. */ sbsize = sf->hdr.count * sizeof(*sbuf); - sbp = sbuf = kmem_alloc(sbsize, KM_SLEEP); + sbp = sbuf = kmem_alloc(sbsize, KM_SLEEP | KM_NOFS); /* * Scan the attribute list for the rest of the entries, storing @@ -2386,7 +2386,7 @@ xfs_attr_leaf_list_int(xfs_dabuf_t *bp, xfs_attr_list_context_t *context) args.dp = context->dp; args.whichfork = XFS_ATTR_FORK; args.valuelen = valuelen; - args.value = kmem_alloc(valuelen, KM_SLEEP); + args.value = kmem_alloc(valuelen, KM_SLEEP | KM_NOFS); args.rmtblkno = be32_to_cpu(name_rmt->valueblk); args.rmtblkcnt = XFS_B_TO_FSB(args.dp->i_mount, valuelen); retval = xfs_attr_rmtval_get(&args); -- 1.7.2.3 From SRS0+iND5+24+fromorbit.com=david@internode.on.net Mon Dec 20 19:25:25 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL1PP6q202506 for ; Mon, 20 Dec 2010 19:25:25 -0600 X-ASG-Debug-ID: 1292894840-7b2c02660000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8D395146F966 for ; Mon, 20 Dec 2010 17:27:20 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id 40Saz56HWwNgLTvP for ; Mon, 20 Dec 2010 17:27:20 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50388840-1927428 for multiple; Tue, 21 Dec 2010 11:57:19 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PUr0Y-0000lE-1m; Tue, 21 Dec 2010 12:27:18 +1100 Date: Tue, 21 Dec 2010 12:27:17 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 08/12] xfs: convert l_tail_lsn to an atomic variable. Subject: Re: [PATCH 08/12] xfs: convert l_tail_lsn to an atomic variable. Message-ID: <20101221012717.GP5193@dastard> References: <1292215483-18224-1-git-send-email-david@fromorbit.com> <1292215483-18224-9-git-send-email-david@fromorbit.com> <20101220120634.GA3582@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101220120634.GA3582@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1292894842 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50028 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 20, 2010 at 07:06:34AM -0500, Christoph Hellwig wrote: > On Mon, Dec 13, 2010 at 03:44:39PM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > log->l_tail_lsn is currently protected by the log grant lock. The > > lock is only needed for serialising readers against writers, so we > > don't really need the lock if we make the l_tail_lsn variable an > > atomic. Converting the l_tail_lsn variable to an atomic64_t means we > > can start to peel back the grant lock from various operations. > > > > Also, provide functions to safely crack an atomic LSN variable into > > it's component pieces and to recombined the components into an > > atomic variable. Use them where appropriate. > > > > This also removes the need for explicitly holding a spinlock to read > > the l_tail_lsn on 32 bit platforms. > > I know I suggested this, but I think the atomic read of l_tail_lsn > in xlog_space_left might be problemetic for the call from > xlog_grant_push_ail, where we read it twice now. Maybe split > xlog_space_left into a __xlog_space_left that gets the already cracked > values, and xlog_space_left as a wrapper around it? I'd convinced myself that it wouldn't be a problem. That is, once we have a value for the tail_lsn in xlog_grant_push_ail(), the threshold that we will push to is effectively fixed. The only thing that will change is the amount of log space currently available, which can only increase if the tail moves. Hence we'll either get: a) not enough log space and have to push, in which case the value of the tail lsn seen in xlog_space_left() is irrelevant to the threshold lsn we calculate, or b) we'll have enough log space and not need to push in which case we don't need to use the tail_lsn at all because we don't need to push. So it seems to me that the double sample of the tail_lsn doesn't matter at all for this code. Is there a hole in my logic here? Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+f2mc+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:27:53 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.4 required=5.0 tests=BAYES_00,J_CHICKENPOX_33, J_CHICKENPOX_63,J_CHICKENPOX_64,J_CHICKENPOX_65,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7Rrla244545 for ; Tue, 21 Dec 2010 01:27:53 -0600 X-ASG-Debug-ID: 1292916587-362c023a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7BB43212017 for ; Mon, 20 Dec 2010 23:29:47 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id y52aG5nNFBfMuT3Y for ; Mon, 20 Dec 2010 23:29:47 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50397530-1927428 for ; Tue, 21 Dec 2010 17:59:46 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfI-0001CQ-Bn for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:44 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwf7-0006Yq-0j for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:33 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 04/34] xfs: use generic per-cpu counter infrastructure Subject: [PATCH 04/34] xfs: use generic per-cpu counter infrastructure Date: Tue, 21 Dec 2010 18:29:00 +1100 Message-Id: <1292916570-25015-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1292916589 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner XFS has a per-cpu counter implementation for in-core superblock counters that pre-dated the generic implementation. It is complex and baroque as it is tailored directly to the needs of ENOSPC detection. Now that the generic percpu counter infrastructure has the percpu_counter_add_unless_lt() function that implements the necessary threshold checks for us, switch the XFS per-cpu superblock counters to use the generic percpu counter infrastructure. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_linux.h | 9 - fs/xfs/linux-2.6/xfs_super.c | 4 +- fs/xfs/xfs_fsops.c | 4 +- fs/xfs/xfs_mount.c | 806 ++++++++---------------------------------- fs/xfs/xfs_mount.h | 71 +--- 5 files changed, 171 insertions(+), 723 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_linux.h b/fs/xfs/linux-2.6/xfs_linux.h index 214ddd7..9fa4f2a 100644 --- a/fs/xfs/linux-2.6/xfs_linux.h +++ b/fs/xfs/linux-2.6/xfs_linux.h @@ -88,15 +88,6 @@ #include #include -/* - * Feature macros (disable/enable) - */ -#ifdef CONFIG_SMP -#define HAVE_PERCPU_SB /* per cpu superblock counters are a 2.6 feature */ -#else -#undef HAVE_PERCPU_SB /* per cpu superblock counters are a 2.6 feature */ -#endif - #define irix_sgid_inherit xfs_params.sgid_inherit.val #define irix_symlink_mode xfs_params.symlink_mode.val #define xfs_panic_mask xfs_params.panic_mask.val diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index c45b323..abcda07 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1229,9 +1229,9 @@ xfs_fs_statfs( statp->f_fsid.val[0] = (u32)id; statp->f_fsid.val[1] = (u32)(id >> 32); - xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); - spin_lock(&mp->m_sb_lock); + xfs_icsb_sync_counters(mp); + statp->f_bsize = sbp->sb_blocksize; lsize = sbp->sb_logstart ? sbp->sb_logblocks : 0; statp->f_blocks = sbp->sb_dblocks - lsize; diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index a7c116e..fb9a9c8 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -478,8 +478,8 @@ xfs_fs_counts( xfs_mount_t *mp, xfs_fsop_counts_t *cnt) { - xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); spin_lock(&mp->m_sb_lock); + xfs_icsb_sync_counters(mp); cnt->freedata = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); cnt->freertx = mp->m_sb.sb_frextents; cnt->freeino = mp->m_sb.sb_ifree; @@ -540,7 +540,7 @@ xfs_reserve_blocks( */ retry: spin_lock(&mp->m_sb_lock); - xfs_icsb_sync_counters_locked(mp, 0); + xfs_icsb_sync_counters(mp); /* * If our previous reservation was larger than the current value, diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 19e9dfa..4a99e14 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -46,19 +46,6 @@ STATIC void xfs_unmountfs_wait(xfs_mount_t *); - -#ifdef HAVE_PERCPU_SB -STATIC void xfs_icsb_balance_counter(xfs_mount_t *, xfs_sb_field_t, - int); -STATIC void xfs_icsb_balance_counter_locked(xfs_mount_t *, xfs_sb_field_t, - int); -STATIC void xfs_icsb_disable_counter(xfs_mount_t *, xfs_sb_field_t); -#else - -#define xfs_icsb_balance_counter(mp, a, b) do { } while (0) -#define xfs_icsb_balance_counter_locked(mp, a, b) do { } while (0) -#endif - static const struct { short offset; short type; /* 0 = integer @@ -281,6 +268,71 @@ xfs_free_perag( } /* + * Per-cpu incore superblock counters + * + * This provides distributed per cpu counters for contended fields (e.g. free + * block count). Difficulties arise in that the incore sb is used for ENOSPC + * checking, and hence needs to be accurately read when we are running low on + * space. Hence We need to check against counter error bounds and determine how + * accurately to sum based on that metric. The percpu counters take care of + * this for us, so we only need to modify the fast path to handle per-cpu + * counter error cases. + */ +void +xfs_icsb_reinit_counters( + struct xfs_mount *mp) +{ + percpu_counter_set(&mp->m_icsb[XFS_ICSB_FDBLOCKS], + mp->m_sb.sb_fdblocks); + percpu_counter_set(&mp->m_icsb[XFS_ICSB_IFREE], mp->m_sb.sb_ifree); + percpu_counter_set(&mp->m_icsb[XFS_ICSB_ICOUNT], mp->m_sb.sb_icount); +} + +int +xfs_icsb_init_counters( + struct xfs_mount *mp) +{ + int i; + int error; + + for (i = 0; i < XFS_ICSB_MAX; i++) { + error = percpu_counter_init(&mp->m_icsb[i], 0); + if (error) + goto out_error; + } + xfs_icsb_reinit_counters(mp); + return 0; + +out_error: + for (; i >= 0; i--) + percpu_counter_destroy(&mp->m_icsb[i]); + return error; +} + +void +xfs_icsb_destroy_counters( + xfs_mount_t *mp) +{ + int i; + + for (i = 0; i < XFS_ICSB_MAX; i++) + percpu_counter_destroy(&mp->m_icsb[i]); +} + +void +xfs_icsb_sync_counters( + xfs_mount_t *mp) +{ + assert_spin_locked(&mp->m_sb_lock); + mp->m_sb.sb_icount = + percpu_counter_sum_positive(&mp->m_icsb[XFS_ICSB_ICOUNT]); + mp->m_sb.sb_ifree = + percpu_counter_sum_positive(&mp->m_icsb[XFS_ICSB_IFREE]); + mp->m_sb.sb_fdblocks = + percpu_counter_sum_positive(&mp->m_icsb[XFS_ICSB_FDBLOCKS]); +} + +/* * Check size of device based on the (data/realtime) block count. * Note: this check is used by the growfs code as well as mount. */ @@ -1562,7 +1614,9 @@ xfs_log_sbcount( if (!xfs_fs_writable(mp)) return 0; - xfs_icsb_sync_counters(mp, 0); + spin_lock(&mp->m_sb_lock); + xfs_icsb_sync_counters(mp); + spin_unlock(&mp->m_sb_lock); /* * we don't need to do this if we are updating the superblock @@ -1674,9 +1728,8 @@ xfs_mod_incore_sb_unlocked( int64_t delta, int rsvd) { - int scounter; /* short counter for 32 bit fields */ - long long lcounter; /* long counter for 64 bit fields */ - long long res_used, rem; + int scounter = 0; /* short counter for 32 bit fields */ + long long lcounter = 0; /* long counter for 64 bit fields */ /* * With the in-core superblock spin lock held, switch @@ -1685,66 +1738,6 @@ xfs_mod_incore_sb_unlocked( * 0, then do not apply the delta and return EINVAL. */ switch (field) { - case XFS_SBS_ICOUNT: - lcounter = (long long)mp->m_sb.sb_icount; - lcounter += delta; - if (lcounter < 0) { - ASSERT(0); - return XFS_ERROR(EINVAL); - } - mp->m_sb.sb_icount = lcounter; - return 0; - case XFS_SBS_IFREE: - lcounter = (long long)mp->m_sb.sb_ifree; - lcounter += delta; - if (lcounter < 0) { - ASSERT(0); - return XFS_ERROR(EINVAL); - } - mp->m_sb.sb_ifree = lcounter; - return 0; - case XFS_SBS_FDBLOCKS: - lcounter = (long long) - mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); - res_used = (long long)(mp->m_resblks - mp->m_resblks_avail); - - if (delta > 0) { /* Putting blocks back */ - if (res_used > delta) { - mp->m_resblks_avail += delta; - } else { - rem = delta - res_used; - mp->m_resblks_avail = mp->m_resblks; - lcounter += rem; - } - } else { /* Taking blocks away */ - lcounter += delta; - if (lcounter >= 0) { - mp->m_sb.sb_fdblocks = lcounter + - XFS_ALLOC_SET_ASIDE(mp); - return 0; - } - - /* - * We are out of blocks, use any available reserved - * blocks if were allowed to. - */ - if (!rsvd) - return XFS_ERROR(ENOSPC); - - lcounter = (long long)mp->m_resblks_avail + delta; - if (lcounter >= 0) { - mp->m_resblks_avail = lcounter; - return 0; - } - printk_once(KERN_WARNING - "Filesystem \"%s\": reserve blocks depleted! " - "Consider increasing reserve pool size.", - mp->m_fsname); - return XFS_ERROR(ENOSPC); - } - - mp->m_sb.sb_fdblocks = lcounter + XFS_ALLOC_SET_ASIDE(mp); - return 0; case XFS_SBS_FREXTENTS: lcounter = (long long)mp->m_sb.sb_frextents; lcounter += delta; @@ -1846,9 +1839,6 @@ xfs_mod_incore_sb( { int status; -#ifdef HAVE_PERCPU_SB - ASSERT(field < XFS_SBS_ICOUNT || field > XFS_SBS_FDBLOCKS); -#endif spin_lock(&mp->m_sb_lock); status = xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); spin_unlock(&mp->m_sb_lock); @@ -1886,9 +1876,6 @@ xfs_mod_incore_sb_batch( */ spin_lock(&mp->m_sb_lock); for (msbp = &msbp[0]; msbp < (msb + nmsb); msbp++) { - ASSERT(msbp->msb_field < XFS_SBS_ICOUNT || - msbp->msb_field > XFS_SBS_FDBLOCKS); - error = xfs_mod_incore_sb_unlocked(mp, msbp->msb_field, msbp->msb_delta, rsvd); if (error) @@ -1907,6 +1894,90 @@ unwind: return error; } +int +xfs_icsb_modify_counters( + xfs_mount_t *mp, + xfs_sb_field_t field, + int64_t delta, + int rsvd) +{ + int64_t lcounter; + int64_t res_used; + int ret = 0; + + + switch (field) { + case XFS_SBS_ICOUNT: + ret = percpu_counter_add_unless_lt(&mp->m_icsb[XFS_SBS_ICOUNT], + delta, 0); + if (ret < 0) { + ASSERT(0); + return XFS_ERROR(EINVAL); + } + return 0; + + case XFS_SBS_IFREE: + ret = percpu_counter_add_unless_lt(&mp->m_icsb[XFS_SBS_IFREE], + delta, 0); + if (ret < 0) { + ASSERT(0); + return XFS_ERROR(EINVAL); + } + return 0; + + case XFS_SBS_FDBLOCKS: + /* + * if we are putting blocks back, put them into the reserve + * block pool first. + */ + if (mp->m_resblks != mp->m_resblks_avail && delta > 0) { + spin_lock(&mp->m_sb_lock); + res_used = (int64_t)(mp->m_resblks - + mp->m_resblks_avail); + if (res_used > delta) { + mp->m_resblks_avail += delta; + delta = 0; + } else { + delta -= res_used; + mp->m_resblks_avail = mp->m_resblks; + } + spin_unlock(&mp->m_sb_lock); + if (!delta) + return 0; + } + + /* try the change */ + ret = percpu_counter_add_unless_lt(&mp->m_icsb[XFS_ICSB_FDBLOCKS], + delta, XFS_ALLOC_SET_ASIDE(mp)); + if (likely(ret >= 0)) + return 0; + + /* ENOSPC */ + ASSERT(delta < 0); + + if (!rsvd) + return XFS_ERROR(ENOSPC); + + spin_lock(&mp->m_sb_lock); + lcounter = (int64_t)mp->m_resblks_avail + delta; + if (lcounter >= 0) { + mp->m_resblks_avail = lcounter; + spin_unlock(&mp->m_sb_lock); + return 0; + } + spin_unlock(&mp->m_sb_lock); + printk_once(KERN_WARNING + "Filesystem \"%s\": reserve blocks depleted! " + "Consider increasing reserve pool size.", + mp->m_fsname); + return XFS_ERROR(ENOSPC); + default: + ASSERT(0); + return XFS_ERROR(EINVAL); + } + return 0; +} + /* * xfs_getsb() is called to obtain the buffer for the superblock. * The buffer is returned locked and read in from disk. @@ -2000,572 +2071,3 @@ xfs_dev_is_read_only( } return 0; } - -#ifdef HAVE_PERCPU_SB -/* - * Per-cpu incore superblock counters - * - * Simple concept, difficult implementation - * - * Basically, replace the incore superblock counters with a distributed per cpu - * counter for contended fields (e.g. free block count). - * - * Difficulties arise in that the incore sb is used for ENOSPC checking, and - * hence needs to be accurately read when we are running low on space. Hence - * there is a method to enable and disable the per-cpu counters based on how - * much "stuff" is available in them. - * - * Basically, a counter is enabled if there is enough free resource to justify - * running a per-cpu fast-path. If the per-cpu counter runs out (i.e. a local - * ENOSPC), then we disable the counters to synchronise all callers and - * re-distribute the available resources. - * - * If, once we redistributed the available resources, we still get a failure, - * we disable the per-cpu counter and go through the slow path. - * - * The slow path is the current xfs_mod_incore_sb() function. This means that - * when we disable a per-cpu counter, we need to drain its resources back to - * the global superblock. We do this after disabling the counter to prevent - * more threads from queueing up on the counter. - * - * Essentially, this means that we still need a lock in the fast path to enable - * synchronisation between the global counters and the per-cpu counters. This - * is not a problem because the lock will be local to a CPU almost all the time - * and have little contention except when we get to ENOSPC conditions. - * - * Basically, this lock becomes a barrier that enables us to lock out the fast - * path while we do things like enabling and disabling counters and - * synchronising the counters. - * - * Locking rules: - * - * 1. m_sb_lock before picking up per-cpu locks - * 2. per-cpu locks always picked up via for_each_online_cpu() order - * 3. accurate counter sync requires m_sb_lock + per cpu locks - * 4. modifying per-cpu counters requires holding per-cpu lock - * 5. modifying global counters requires holding m_sb_lock - * 6. enabling or disabling a counter requires holding the m_sb_lock - * and _none_ of the per-cpu locks. - * - * Disabled counters are only ever re-enabled by a balance operation - * that results in more free resources per CPU than a given threshold. - * To ensure counters don't remain disabled, they are rebalanced when - * the global resource goes above a higher threshold (i.e. some hysteresis - * is present to prevent thrashing). - */ - -#ifdef CONFIG_HOTPLUG_CPU -/* - * hot-plug CPU notifier support. - * - * We need a notifier per filesystem as we need to be able to identify - * the filesystem to balance the counters out. This is achieved by - * having a notifier block embedded in the xfs_mount_t and doing pointer - * magic to get the mount pointer from the notifier block address. - */ -STATIC int -xfs_icsb_cpu_notify( - struct notifier_block *nfb, - unsigned long action, - void *hcpu) -{ - xfs_icsb_cnts_t *cntp; - xfs_mount_t *mp; - - mp = (xfs_mount_t *)container_of(nfb, xfs_mount_t, m_icsb_notifier); - cntp = (xfs_icsb_cnts_t *) - per_cpu_ptr(mp->m_sb_cnts, (unsigned long)hcpu); - switch (action) { - case CPU_UP_PREPARE: - case CPU_UP_PREPARE_FROZEN: - /* Easy Case - initialize the area and locks, and - * then rebalance when online does everything else for us. */ - memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); - break; - case CPU_ONLINE: - case CPU_ONLINE_FROZEN: - xfs_icsb_lock(mp); - xfs_icsb_balance_counter(mp, XFS_SBS_ICOUNT, 0); - xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0); - xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); - xfs_icsb_unlock(mp); - break; - case CPU_DEAD: - case CPU_DEAD_FROZEN: - /* Disable all the counters, then fold the dead cpu's - * count into the total on the global superblock and - * re-enable the counters. */ - xfs_icsb_lock(mp); - spin_lock(&mp->m_sb_lock); - xfs_icsb_disable_counter(mp, XFS_SBS_ICOUNT); - xfs_icsb_disable_counter(mp, XFS_SBS_IFREE); - xfs_icsb_disable_counter(mp, XFS_SBS_FDBLOCKS); - - mp->m_sb.sb_icount += cntp->icsb_icount; - mp->m_sb.sb_ifree += cntp->icsb_ifree; - mp->m_sb.sb_fdblocks += cntp->icsb_fdblocks; - - memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); - - xfs_icsb_balance_counter_locked(mp, XFS_SBS_ICOUNT, 0); - xfs_icsb_balance_counter_locked(mp, XFS_SBS_IFREE, 0); - xfs_icsb_balance_counter_locked(mp, XFS_SBS_FDBLOCKS, 0); - spin_unlock(&mp->m_sb_lock); - xfs_icsb_unlock(mp); - break; - } - - return NOTIFY_OK; -} -#endif /* CONFIG_HOTPLUG_CPU */ - -int -xfs_icsb_init_counters( - xfs_mount_t *mp) -{ - xfs_icsb_cnts_t *cntp; - int i; - - mp->m_sb_cnts = alloc_percpu(xfs_icsb_cnts_t); - if (mp->m_sb_cnts == NULL) - return -ENOMEM; - -#ifdef CONFIG_HOTPLUG_CPU - mp->m_icsb_notifier.notifier_call = xfs_icsb_cpu_notify; - mp->m_icsb_notifier.priority = 0; - register_hotcpu_notifier(&mp->m_icsb_notifier); -#endif /* CONFIG_HOTPLUG_CPU */ - - for_each_online_cpu(i) { - cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); - memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); - } - - mutex_init(&mp->m_icsb_mutex); - - /* - * start with all counters disabled so that the - * initial balance kicks us off correctly - */ - mp->m_icsb_counters = -1; - return 0; -} - -void -xfs_icsb_reinit_counters( - xfs_mount_t *mp) -{ - xfs_icsb_lock(mp); - /* - * start with all counters disabled so that the - * initial balance kicks us off correctly - */ - mp->m_icsb_counters = -1; - xfs_icsb_balance_counter(mp, XFS_SBS_ICOUNT, 0); - xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0); - xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); - xfs_icsb_unlock(mp); -} - -void -xfs_icsb_destroy_counters( - xfs_mount_t *mp) -{ - if (mp->m_sb_cnts) { - unregister_hotcpu_notifier(&mp->m_icsb_notifier); - free_percpu(mp->m_sb_cnts); - } - mutex_destroy(&mp->m_icsb_mutex); -} - -STATIC void -xfs_icsb_lock_cntr( - xfs_icsb_cnts_t *icsbp) -{ - while (test_and_set_bit(XFS_ICSB_FLAG_LOCK, &icsbp->icsb_flags)) { - ndelay(1000); - } -} - -STATIC void -xfs_icsb_unlock_cntr( - xfs_icsb_cnts_t *icsbp) -{ - clear_bit(XFS_ICSB_FLAG_LOCK, &icsbp->icsb_flags); -} - - -STATIC void -xfs_icsb_lock_all_counters( - xfs_mount_t *mp) -{ - xfs_icsb_cnts_t *cntp; - int i; - - for_each_online_cpu(i) { - cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); - xfs_icsb_lock_cntr(cntp); - } -} - -STATIC void -xfs_icsb_unlock_all_counters( - xfs_mount_t *mp) -{ - xfs_icsb_cnts_t *cntp; - int i; - - for_each_online_cpu(i) { - cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); - xfs_icsb_unlock_cntr(cntp); - } -} - -STATIC void -xfs_icsb_count( - xfs_mount_t *mp, - xfs_icsb_cnts_t *cnt, - int flags) -{ - xfs_icsb_cnts_t *cntp; - int i; - - memset(cnt, 0, sizeof(xfs_icsb_cnts_t)); - - if (!(flags & XFS_ICSB_LAZY_COUNT)) - xfs_icsb_lock_all_counters(mp); - - for_each_online_cpu(i) { - cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); - cnt->icsb_icount += cntp->icsb_icount; - cnt->icsb_ifree += cntp->icsb_ifree; - cnt->icsb_fdblocks += cntp->icsb_fdblocks; - } - - if (!(flags & XFS_ICSB_LAZY_COUNT)) - xfs_icsb_unlock_all_counters(mp); -} - -STATIC int -xfs_icsb_counter_disabled( - xfs_mount_t *mp, - xfs_sb_field_t field) -{ - ASSERT((field >= XFS_SBS_ICOUNT) && (field <= XFS_SBS_FDBLOCKS)); - return test_bit(field, &mp->m_icsb_counters); -} - -STATIC void -xfs_icsb_disable_counter( - xfs_mount_t *mp, - xfs_sb_field_t field) -{ - xfs_icsb_cnts_t cnt; - - ASSERT((field >= XFS_SBS_ICOUNT) && (field <= XFS_SBS_FDBLOCKS)); - - /* - * If we are already disabled, then there is nothing to do - * here. We check before locking all the counters to avoid - * the expensive lock operation when being called in the - * slow path and the counter is already disabled. This is - * safe because the only time we set or clear this state is under - * the m_icsb_mutex. - */ - if (xfs_icsb_counter_disabled(mp, field)) - return; - - xfs_icsb_lock_all_counters(mp); - if (!test_and_set_bit(field, &mp->m_icsb_counters)) { - /* drain back to superblock */ - - xfs_icsb_count(mp, &cnt, XFS_ICSB_LAZY_COUNT); - switch(field) { - case XFS_SBS_ICOUNT: - mp->m_sb.sb_icount = cnt.icsb_icount; - break; - case XFS_SBS_IFREE: - mp->m_sb.sb_ifree = cnt.icsb_ifree; - break; - case XFS_SBS_FDBLOCKS: - mp->m_sb.sb_fdblocks = cnt.icsb_fdblocks; - break; - default: - BUG(); - } - } - - xfs_icsb_unlock_all_counters(mp); -} - -STATIC void -xfs_icsb_enable_counter( - xfs_mount_t *mp, - xfs_sb_field_t field, - uint64_t count, - uint64_t resid) -{ - xfs_icsb_cnts_t *cntp; - int i; - - ASSERT((field >= XFS_SBS_ICOUNT) && (field <= XFS_SBS_FDBLOCKS)); - - xfs_icsb_lock_all_counters(mp); - for_each_online_cpu(i) { - cntp = per_cpu_ptr(mp->m_sb_cnts, i); - switch (field) { - case XFS_SBS_ICOUNT: - cntp->icsb_icount = count + resid; - break; - case XFS_SBS_IFREE: - cntp->icsb_ifree = count + resid; - break; - case XFS_SBS_FDBLOCKS: - cntp->icsb_fdblocks = count + resid; - break; - default: - BUG(); - break; - } - resid = 0; - } - clear_bit(field, &mp->m_icsb_counters); - xfs_icsb_unlock_all_counters(mp); -} - -void -xfs_icsb_sync_counters_locked( - xfs_mount_t *mp, - int flags) -{ - xfs_icsb_cnts_t cnt; - - xfs_icsb_count(mp, &cnt, flags); - - if (!xfs_icsb_counter_disabled(mp, XFS_SBS_ICOUNT)) - mp->m_sb.sb_icount = cnt.icsb_icount; - if (!xfs_icsb_counter_disabled(mp, XFS_SBS_IFREE)) - mp->m_sb.sb_ifree = cnt.icsb_ifree; - if (!xfs_icsb_counter_disabled(mp, XFS_SBS_FDBLOCKS)) - mp->m_sb.sb_fdblocks = cnt.icsb_fdblocks; -} - -/* - * Accurate update of per-cpu counters to incore superblock - */ -void -xfs_icsb_sync_counters( - xfs_mount_t *mp, - int flags) -{ - spin_lock(&mp->m_sb_lock); - xfs_icsb_sync_counters_locked(mp, flags); - spin_unlock(&mp->m_sb_lock); -} - -/* - * Balance and enable/disable counters as necessary. - * - * Thresholds for re-enabling counters are somewhat magic. inode counts are - * chosen to be the same number as single on disk allocation chunk per CPU, and - * free blocks is something far enough zero that we aren't going thrash when we - * get near ENOSPC. We also need to supply a minimum we require per cpu to - * prevent looping endlessly when xfs_alloc_space asks for more than will - * be distributed to a single CPU but each CPU has enough blocks to be - * reenabled. - * - * Note that we can be called when counters are already disabled. - * xfs_icsb_disable_counter() optimises the counter locking in this case to - * prevent locking every per-cpu counter needlessly. - */ - -#define XFS_ICSB_INO_CNTR_REENABLE (uint64_t)64 -#define XFS_ICSB_FDBLK_CNTR_REENABLE(mp) \ - (uint64_t)(512 + XFS_ALLOC_SET_ASIDE(mp)) -STATIC void -xfs_icsb_balance_counter_locked( - xfs_mount_t *mp, - xfs_sb_field_t field, - int min_per_cpu) -{ - uint64_t count, resid; - int weight = num_online_cpus(); - uint64_t min = (uint64_t)min_per_cpu; - - /* disable counter and sync counter */ - xfs_icsb_disable_counter(mp, field); - - /* update counters - first CPU gets residual*/ - switch (field) { - case XFS_SBS_ICOUNT: - count = mp->m_sb.sb_icount; - resid = do_div(count, weight); - if (count < max(min, XFS_ICSB_INO_CNTR_REENABLE)) - return; - break; - case XFS_SBS_IFREE: - count = mp->m_sb.sb_ifree; - resid = do_div(count, weight); - if (count < max(min, XFS_ICSB_INO_CNTR_REENABLE)) - return; - break; - case XFS_SBS_FDBLOCKS: - count = mp->m_sb.sb_fdblocks; - resid = do_div(count, weight); - if (count < max(min, XFS_ICSB_FDBLK_CNTR_REENABLE(mp))) - return; - break; - default: - BUG(); - count = resid = 0; /* quiet, gcc */ - break; - } - - xfs_icsb_enable_counter(mp, field, count, resid); -} - -STATIC void -xfs_icsb_balance_counter( - xfs_mount_t *mp, - xfs_sb_field_t fields, - int min_per_cpu) -{ - spin_lock(&mp->m_sb_lock); - xfs_icsb_balance_counter_locked(mp, fields, min_per_cpu); - spin_unlock(&mp->m_sb_lock); -} - -int -xfs_icsb_modify_counters( - xfs_mount_t *mp, - xfs_sb_field_t field, - int64_t delta, - int rsvd) -{ - xfs_icsb_cnts_t *icsbp; - long long lcounter; /* long counter for 64 bit fields */ - int ret = 0; - - might_sleep(); -again: - preempt_disable(); - icsbp = this_cpu_ptr(mp->m_sb_cnts); - - /* - * if the counter is disabled, go to slow path - */ - if (unlikely(xfs_icsb_counter_disabled(mp, field))) - goto slow_path; - xfs_icsb_lock_cntr(icsbp); - if (unlikely(xfs_icsb_counter_disabled(mp, field))) { - xfs_icsb_unlock_cntr(icsbp); - goto slow_path; - } - - switch (field) { - case XFS_SBS_ICOUNT: - lcounter = icsbp->icsb_icount; - lcounter += delta; - if (unlikely(lcounter < 0)) - goto balance_counter; - icsbp->icsb_icount = lcounter; - break; - - case XFS_SBS_IFREE: - lcounter = icsbp->icsb_ifree; - lcounter += delta; - if (unlikely(lcounter < 0)) - goto balance_counter; - icsbp->icsb_ifree = lcounter; - break; - - case XFS_SBS_FDBLOCKS: - BUG_ON((mp->m_resblks - mp->m_resblks_avail) != 0); - - lcounter = icsbp->icsb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); - lcounter += delta; - if (unlikely(lcounter < 0)) - goto balance_counter; - icsbp->icsb_fdblocks = lcounter + XFS_ALLOC_SET_ASIDE(mp); - break; - default: - BUG(); - break; - } - xfs_icsb_unlock_cntr(icsbp); - preempt_enable(); - return 0; - -slow_path: - preempt_enable(); - - /* - * serialise with a mutex so we don't burn lots of cpu on - * the superblock lock. We still need to hold the superblock - * lock, however, when we modify the global structures. - */ - xfs_icsb_lock(mp); - - /* - * Now running atomically. - * - * If the counter is enabled, someone has beaten us to rebalancing. - * Drop the lock and try again in the fast path.... - */ - if (!(xfs_icsb_counter_disabled(mp, field))) { - xfs_icsb_unlock(mp); - goto again; - } - - /* - * The counter is currently disabled. Because we are - * running atomically here, we know a rebalance cannot - * be in progress. Hence we can go straight to operating - * on the global superblock. We do not call xfs_mod_incore_sb() - * here even though we need to get the m_sb_lock. Doing so - * will cause us to re-enter this function and deadlock. - * Hence we get the m_sb_lock ourselves and then call - * xfs_mod_incore_sb_unlocked() as the unlocked path operates - * directly on the global counters. - */ - spin_lock(&mp->m_sb_lock); - ret = xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); - spin_unlock(&mp->m_sb_lock); - - /* - * Now that we've modified the global superblock, we - * may be able to re-enable the distributed counters - * (e.g. lots of space just got freed). After that - * we are done. - */ - if (ret != ENOSPC) - xfs_icsb_balance_counter(mp, field, 0); - xfs_icsb_unlock(mp); - return ret; - -balance_counter: - xfs_icsb_unlock_cntr(icsbp); - preempt_enable(); - - /* - * We may have multiple threads here if multiple per-cpu - * counters run dry at the same time. This will mean we can - * do more balances than strictly necessary but it is not - * the common slowpath case. - */ - xfs_icsb_lock(mp); - - /* - * running atomically. - * - * This will leave the counter in the correct state for future - * accesses. After the rebalance, we simply try again and our retry - * will either succeed through the fast path or slow path without - * another balance operation being required. - */ - xfs_icsb_balance_counter(mp, field, delta); - xfs_icsb_unlock(mp); - goto again; -} - -#endif diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 5861b49..42d31df 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -65,44 +65,19 @@ struct xfs_nameops; struct xfs_ail; struct xfs_quotainfo; -#ifdef HAVE_PERCPU_SB - /* - * Valid per-cpu incore superblock counters. Note that if you add new counters, - * you may need to define new counter disabled bit field descriptors as there - * are more possible fields in the superblock that can fit in a bitfield on a - * 32 bit platform. The XFS_SBS_* values for the current current counters just - * fit. + * Per-cpu incore superblock counters. */ -typedef struct xfs_icsb_cnts { - uint64_t icsb_fdblocks; - uint64_t icsb_ifree; - uint64_t icsb_icount; - unsigned long icsb_flags; -} xfs_icsb_cnts_t; - -#define XFS_ICSB_FLAG_LOCK (1 << 0) /* counter lock bit */ - -#define XFS_ICSB_LAZY_COUNT (1 << 1) /* accuracy not needed */ +enum { + XFS_ICSB_FDBLOCKS = 0, + XFS_ICSB_IFREE, + XFS_ICSB_ICOUNT, + XFS_ICSB_MAX, +}; -extern int xfs_icsb_init_counters(struct xfs_mount *); -extern void xfs_icsb_reinit_counters(struct xfs_mount *); -extern void xfs_icsb_destroy_counters(struct xfs_mount *); -extern void xfs_icsb_sync_counters(struct xfs_mount *, int); -extern void xfs_icsb_sync_counters_locked(struct xfs_mount *, int); extern int xfs_icsb_modify_counters(struct xfs_mount *, xfs_sb_field_t, int64_t, int); -#else -#define xfs_icsb_init_counters(mp) (0) -#define xfs_icsb_destroy_counters(mp) do { } while (0) -#define xfs_icsb_reinit_counters(mp) do { } while (0) -#define xfs_icsb_sync_counters(mp, flags) do { } while (0) -#define xfs_icsb_sync_counters_locked(mp, flags) do { } while (0) -#define xfs_icsb_modify_counters(mp, field, delta, rsvd) \ - xfs_mod_incore_sb(mp, field, delta, rsvd) -#endif - typedef struct xfs_mount { struct super_block *m_super; xfs_tid_t m_tid; /* next unused tid for fs */ @@ -186,12 +161,6 @@ typedef struct xfs_mount { struct xfs_chash *m_chash; /* fs private inode per-cluster * hash table */ atomic_t m_active_trans; /* number trans frozen */ -#ifdef HAVE_PERCPU_SB - xfs_icsb_cnts_t __percpu *m_sb_cnts; /* per-cpu superblock counters */ - unsigned long m_icsb_counters; /* disabled per-cpu counters */ - struct notifier_block m_icsb_notifier; /* hotplug cpu notifier */ - struct mutex m_icsb_mutex; /* balancer sync lock */ -#endif struct xfs_mru_cache *m_filestream; /* per-mount filestream data */ struct task_struct *m_sync_task; /* generalised sync thread */ xfs_sync_work_t m_sync_work; /* work item for VFS_SYNC */ @@ -202,6 +171,7 @@ typedef struct xfs_mount { __int64_t m_update_flags; /* sb flags we need to update on the next remount,rw */ struct shrinker m_inode_shrink; /* inode reclaim shrinker */ + struct percpu_counter m_icsb[XFS_ICSB_MAX]; } xfs_mount_t; /* @@ -333,26 +303,6 @@ struct xfs_perag *xfs_perag_get_tag(struct xfs_mount *mp, xfs_agnumber_t agno, void xfs_perag_put(struct xfs_perag *pag); /* - * Per-cpu superblock locking functions - */ -#ifdef HAVE_PERCPU_SB -static inline void -xfs_icsb_lock(xfs_mount_t *mp) -{ - mutex_lock(&mp->m_icsb_mutex); -} - -static inline void -xfs_icsb_unlock(xfs_mount_t *mp) -{ - mutex_unlock(&mp->m_icsb_mutex); -} -#else -#define xfs_icsb_lock(mp) -#define xfs_icsb_unlock(mp) -#endif - -/* * This structure is for use by the xfs_mod_incore_sb_batch() routine. * xfs_growfs can specify a few fields which are more than int limit */ @@ -379,6 +329,11 @@ extern int xfs_sb_validate_fsb_count(struct xfs_sb *, __uint64_t); extern int xfs_dev_is_read_only(struct xfs_mount *, char *); +extern int xfs_icsb_init_counters(struct xfs_mount *); +extern void xfs_icsb_reinit_counters(struct xfs_mount *); +extern void xfs_icsb_destroy_counters(struct xfs_mount *); +extern void xfs_icsb_sync_counters(struct xfs_mount *); + #endif /* __KERNEL__ */ extern void xfs_mod_sb(struct xfs_trans *, __int64_t); -- 1.7.2.3 From SRS0+Brkf+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_42, J_CHICKENPOX_45,J_CHICKENPOX_48 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7S1Et244569 for ; Tue, 21 Dec 2010 01:28:01 -0600 X-ASG-Debug-ID: 1292916596-226003150000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3AEAD1CE33C4 for ; Mon, 20 Dec 2010 23:29:57 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id jxiNExXf68F3A4iZ for ; Mon, 20 Dec 2010 23:29:57 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50839304-1927428 for ; Tue, 21 Dec 2010 17:59:55 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfI-0001CM-7w for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:44 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwf6-0006Yk-TG for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:32 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 02/34] xfs: use KM_NOFS for allocations during attribute list operations Subject: [PATCH 02/34] xfs: use KM_NOFS for allocations during attribute list operations Date: Tue, 21 Dec 2010 18:28:58 +1100 Message-Id: <1292916570-25015-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1292916598 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner When listing attributes, we are doiing memory allocations under the inode ilock using only KM_SLEEP. This allows memory allocation to recurse back into the filesystem and do writeback, which may the ilock we already hold on the current inode. THis will deadlock. Hence use KM_NOFS for such allocations outside of transaction context to ensure that reclaim recursion does not occur. Reported-by: Nick Piggin Signed-off-by: Dave Chinner --- fs/xfs/xfs_attr_leaf.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index a6cff8e..71e90dc2 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -637,7 +637,7 @@ xfs_attr_shortform_list(xfs_attr_list_context_t *context) * It didn't all fit, so we have to sort everything on hashval. */ sbsize = sf->hdr.count * sizeof(*sbuf); - sbp = sbuf = kmem_alloc(sbsize, KM_SLEEP); + sbp = sbuf = kmem_alloc(sbsize, KM_SLEEP | KM_NOFS); /* * Scan the attribute list for the rest of the entries, storing @@ -2386,7 +2386,7 @@ xfs_attr_leaf_list_int(xfs_dabuf_t *bp, xfs_attr_list_context_t *context) args.dp = context->dp; args.whichfork = XFS_ATTR_FORK; args.valuelen = valuelen; - args.value = kmem_alloc(valuelen, KM_SLEEP); + args.value = kmem_alloc(valuelen, KM_SLEEP | KM_NOFS); args.rmtblkno = be32_to_cpu(name_rmt->valueblk); args.rmtblkcnt = XFS_B_TO_FSB(args.dp->i_mount, valuelen); retval = xfs_attr_rmtval_get(&args); -- 1.7.2.3 From SRS0++ukE+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:00 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7S0nZ244565 for ; Tue, 21 Dec 2010 01:28:00 -0600 X-ASG-Debug-ID: 1292916596-362d02470000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1391121201D for ; Mon, 20 Dec 2010 23:29:56 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id vEm4l9qBHQGvYcjQ for ; Mon, 20 Dec 2010 23:29:56 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50071161-1927428 for ; Tue, 21 Dec 2010 17:59:55 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfS-0001Cf-Gc for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:54 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfH-0006Z0-5U for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:43 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 07/34] xfs: don't truncate prealloc from frequently accessed inodes Subject: [PATCH 07/34] xfs: don't truncate prealloc from frequently accessed inodes Date: Tue, 21 Dec 2010 18:29:03 +1100 Message-Id: <1292916570-25015-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1292916598 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner A long standing problem for streaming writeÑ• through the NFS server has been that the NFS server opens and closes file descriptors on an inode for every write. The result of this behaviour is that the ->release() function is called on every close and that results in XFS truncating speculative preallocation beyond the EOF. This has an adverse effect on file layout when multiple files are being written at the same time - they interleave their extents and can result in severe fragmentation. To avoid this problem, keep a count of the number of ->release calls made on an inode. For most cases, an inode is only going to be opened once for writing and then closed again during it's lifetime in cache. Hence if there are multiple ->release calls, there is a good chance that the inode is being accessed by the NFS server. Hence count up every time ->release is called while there are delalloc blocks still outstanding on the inode. If this count is non-zero when ->release is next called, then do no truncate away the speculative preallocation - leave it there so that subsequent writes do not need to reallocate the delalloc space. This will prevent interleaving of extents of different inodes written concurrently to the same AG. If we get this wrong, it is not a big deal as we truncate speculative allocation beyond EOF anyway in xfs_inactive() when the inode is thrown out of the cache. The new counter in the struct xfs_inode fits into a hole in the structure on 64 bit machines, so does not grow the size of the inode at all. Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.h | 13 +++++----- fs/xfs/xfs_vnodeops.c | 61 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 47 insertions(+), 27 deletions(-) diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 1c6514d..5c95fa8 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -376,12 +376,13 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) /* * In-core inode flags. */ -#define XFS_IRECLAIM 0x0001 /* we have started reclaiming this inode */ -#define XFS_ISTALE 0x0002 /* inode has been staled */ -#define XFS_IRECLAIMABLE 0x0004 /* inode can be reclaimed */ -#define XFS_INEW 0x0008 /* inode has just been allocated */ -#define XFS_IFILESTREAM 0x0010 /* inode is in a filestream directory */ -#define XFS_ITRUNCATED 0x0020 /* truncated down so flush-on-close */ +#define XFS_IRECLAIM 0x0001 /* started reclaiming this inode */ +#define XFS_ISTALE 0x0002 /* inode has been staled */ +#define XFS_IRECLAIMABLE 0x0004 /* inode can be reclaimed */ +#define XFS_INEW 0x0008 /* inode has just been allocated */ +#define XFS_IFILESTREAM 0x0010 /* inode is in a filestream directory */ +#define XFS_ITRUNCATED 0x0020 /* truncated down so flush-on-close */ +#define XFS_IDIRTY_RELEASE 0x0040 /* dirty release already seen */ /* * Flags for inode locking. diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 8e4a63c..d8e6f8c 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -964,29 +964,48 @@ xfs_release( xfs_flush_pages(ip, 0, -1, XBF_ASYNC, FI_NONE); } - if (ip->i_d.di_nlink != 0) { - if ((((ip->i_d.di_mode & S_IFMT) == S_IFREG) && - ((ip->i_size > 0) || (VN_CACHED(VFS_I(ip)) > 0 || - ip->i_delayed_blks > 0)) && - (ip->i_df.if_flags & XFS_IFEXTENTS)) && - (!(ip->i_d.di_flags & - (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)))) { + if (ip->i_d.di_nlink == 0) + return 0; - /* - * If we can't get the iolock just skip truncating - * the blocks past EOF because we could deadlock - * with the mmap_sem otherwise. We'll get another - * chance to drop them once the last reference to - * the inode is dropped, so we'll never leak blocks - * permanently. - */ - error = xfs_free_eofblocks(mp, ip, - XFS_FREE_EOF_TRYLOCK); - if (error) - return error; - } - } + if ((((ip->i_d.di_mode & S_IFMT) == S_IFREG) && + ((ip->i_size > 0) || (VN_CACHED(VFS_I(ip)) > 0 || + ip->i_delayed_blks > 0)) && + (ip->i_df.if_flags & XFS_IFEXTENTS)) && + (!(ip->i_d.di_flags & (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)))) { + /* + * If we can't get the iolock just skip truncating the blocks + * past EOF because we could deadlock with the mmap_sem + * otherwise. We'll get another chance to drop them once the + * last reference to the inode is dropped, so we'll never leak + * blocks permanently. + * + * Further, check if the inode is being opened, written and + * closed frequently and we have delayed allocation blocks + * oustanding (e.g. streaming writes from the NFS server), + * truncating the blocks past EOF will cause fragmentation to + * occur. + * + * In this case don't do the truncation, either, but we have to + * be careful how we detect this case. Blocks beyond EOF show + * up as i_delayed_blks even when the inode is clean, so we + * need to truncate them away first before checking for a dirty + * release. Hence on the first dirty close we will still remove + * the speculative allocation, but after that we will leave it + * in place. + */ + if (xfs_iflags_test(ip, XFS_IDIRTY_RELEASE)) + return 0; + + error = xfs_free_eofblocks(mp, ip, + XFS_FREE_EOF_TRYLOCK); + if (error) + return error; + + /* delalloc blocks after truncation means it really is dirty */ + if (ip->i_delayed_blks) + xfs_iflags_set(ip, XFS_IDIRTY_RELEASE); + } return 0; } -- 1.7.2.3 From SRS0+CBlE+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7S1dq244576 for ; Tue, 21 Dec 2010 01:28:01 -0600 X-ASG-Debug-ID: 1292916596-300c02c10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4ACF1212020 for ; Mon, 20 Dec 2010 23:29:57 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id MrSSBXz94zxyGTW3 for ; Mon, 20 Dec 2010 23:29:57 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50434427-1927428 for ; Tue, 21 Dec 2010 17:59:56 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfS-0001CN-8x for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:54 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwf6-0006Yn-V0 for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:32 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: =?UTF-8?q?=5BPATCH=2003/34=5D=20lib=3A=20percpu=20counter=20add=20unless=20less=20than=20functionality?= Subject: =?UTF-8?q?=5BPATCH=2003/34=5D=20lib=3A=20percpu=20counter=20add=20unless=20less=20than=20functionality?= Date: Tue, 21 Dec 2010 18:28:59 +1100 Message-Id: <1292916570-25015-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1292916598 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner To use the generic percpu counter infrastructure for counters that require conditional addition based on a threshold value we need special handling of the counter. Further, the caller needs to know the status of the conditional addition to determine what action to take depending on whether the addition occurred or not. Examples of this sort of usage are resource counters that cannot go below zero (e.g. filesystem free blocks). To allow XFS to replace it's complex roll-your-own per-cpu superblock counters, a single generic conditional function is required: percpu_counter_add_unless_lt(). This will add the amount to the counter unless the result would be less than the given threshold. A caller supplied threshold is required because XFS does not necessarily use the same threshold for every counter. percpu_counter_add_unless_lt() attempts to minimise counter lock traversals by only taking the counter lock when the threshold is within the error range of the current counter value. Hence when the threshold is not within the counter error range, the counter will still have the same scalability characteristics as the normal percpu_counter_add() function. Adding this functionality to the generic percpu counters allows us to remove the much more complex and less efficient XFS percpu counter code (~700 lines of code) and replace it with generic percpu counters. Signed-off-by: Dave Chinner --- include/linux/percpu_counter.h | 27 ++++++++++++++ lib/percpu_counter.c | 79 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 0 deletions(-) diff --git a/include/linux/percpu_counter.h b/include/linux/percpu_counter.h index 46f6ba5..ad18779 100644 --- a/include/linux/percpu_counter.h +++ b/include/linux/percpu_counter.h @@ -41,12 +41,21 @@ void percpu_counter_set(struct percpu_counter *fbc, s64 amount); void __percpu_counter_add(struct percpu_counter *fbc, s64 amount, s32 batch); s64 __percpu_counter_sum(struct percpu_counter *fbc); int percpu_counter_compare(struct percpu_counter *fbc, s64 rhs); +int __percpu_counter_add_unless_lt(struct percpu_counter *fbc, s64 amount, + s64 threshold, s32 batch); static inline void percpu_counter_add(struct percpu_counter *fbc, s64 amount) { __percpu_counter_add(fbc, amount, percpu_counter_batch); } +static inline int percpu_counter_add_unless_lt(struct percpu_counter *fbc, + s64 amount, s64 threshold) +{ + return __percpu_counter_add_unless_lt(fbc, amount, threshold, + percpu_counter_batch); +} + static inline s64 percpu_counter_sum_positive(struct percpu_counter *fbc) { s64 ret = __percpu_counter_sum(fbc); @@ -153,6 +162,24 @@ static inline int percpu_counter_initialized(struct percpu_counter *fbc) return 1; } +static inline int percpu_counter_add_unless_lt(struct percpu_counter *fbc, s64 amount, + s64 threshold) +{ + s64 count; + int ret = â€1; + + preempt_disable(); + count = fbc->count + amount; + if (count < threshold) + goto out; + fbc->count = count; + ret = count == threshold ? 0 : 1; +out: + preempt_enable(); + return ret; +} + + #endif /* CONFIG_SMP */ static inline void percpu_counter_inc(struct percpu_counter *fbc) diff --git a/lib/percpu_counter.c b/lib/percpu_counter.c index 604678d..eacccb7 100644 --- a/lib/percpu_counter.c +++ b/lib/percpu_counter.c @@ -213,6 +213,85 @@ int percpu_counter_compare(struct percpu_counter *fbc, s64 rhs) } EXPORT_SYMBOL(percpu_counter_compare); +/** + * __percpu_counter_add_unless_lt - add to a counter avoiding underruns + * @fbc: counter + * @amount: amount to add + * @threshold: underrun threshold + * @batch: percpu counter batch size. + * + * Add @amount to @fdc if and only if result of addition is greater than or + * equal to @threshold Return 1 if greater and added, 0 if equal and added + * and -1 if and underrun would have occured. + * + * This is useful for operations that must accurately and atomically only add a + * delta to a counter if the result is greater than a given (e.g. for freespace + * accounting with ENOSPC checking in filesystems). + */ +int __percpu_counter_add_unless_lt(struct percpu_counter *fbc, s64 amount, + s64 threshold, s32 batch) +{ + s64 count; + s64 error = 2 * batch * num_online_cpus(); + int cpu; + int ret = -1; + + preempt_disable(); + + /* Check to see if rough count will be sufficient for comparison */ + count = percpu_counter_read(fbc); + if (count + amount < threshold - error) + goto out; + + /* + * If the counter is over the threshold and the change is less than the + * batch size, we might be able to avoid locking. + */ + if (count > threshold + error && abs(amount) < batch) { + __percpu_counter_add(fbc, amount, batch); + ret = 1; + goto out; + } + + /* + * If the result is over the error threshold, we can just add it + * into the global counter ignoring what is in the per-cpu counters + * as they will not change the result of the calculation. + */ + spin_lock(&fbc->lock); + if (fbc->count + amount > threshold + error) { + fbc->count += amount; + ret = 1; + goto out_unlock; + } + + /* + * Result is withing the error margin. Run an open-coded sum of the + * per-cpu counters to get the exact value at this point in time, + * and if the result greater than the threshold, add the amount to + * the global counter. + */ + count = fbc->count; + for_each_online_cpu(cpu) { + s32 *pcount = per_cpu_ptr(fbc->counters, cpu); + count += *pcount; + } + WARN_ON(count < threshold); + + if (count + amount >= threshold) { + ret = 0; + if (count + amount > threshold) + ret = 1; + fbc->count += amount; + } +out_unlock: + spin_unlock(&fbc->lock); +out: + preempt_enable(); + return ret; +} +EXPORT_SYMBOL(percpu_counter_add_unless_lt); + static int __init percpu_counter_startup(void) { compute_batch_value(); -- 1.7.2.3 From SRS0+f2mc+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:02 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_64, J_CHICKENPOX_65,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7S25S244604 for ; Tue, 21 Dec 2010 01:28:02 -0600 X-ASG-Debug-ID: 1292916597-131303e10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1B6521CE33C4 for ; Mon, 20 Dec 2010 23:29:57 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id mEAqRKyQGOSiDn6u for ; Mon, 20 Dec 2010 23:29:57 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50575223-1927428 for ; Tue, 21 Dec 2010 17:59:56 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfS-0001Cc-DI for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:54 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfH-0006Yt-1X for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:43 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 05/34] xfs: demultiplex xfs_icsb_modify_counters() Subject: [PATCH 05/34] xfs: demultiplex xfs_icsb_modify_counters() Date: Tue, 21 Dec 2010 18:29:01 +1100 Message-Id: <1292916570-25015-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1292916599 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner With the conversion to percpu counters, xfs_icsb_modify_counters() really does not need to exist. Convert the inode counter modifications to use a common helper function for the one place that calls them, and add another function for the free block modification and convert all the callers to use that. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_bmap.c | 34 +++++------- fs/xfs/xfs_fsops.c | 3 +- fs/xfs/xfs_mount.c | 160 ++++++++++++++++++++++++--------------------------- fs/xfs/xfs_mount.h | 5 +- fs/xfs/xfs_trans.c | 23 +++---- 5 files changed, 102 insertions(+), 123 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 4111cd3..6a47556 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -614,8 +614,8 @@ xfs_bmap_add_extent( nblks += cur->bc_private.b.allocated; ASSERT(nblks <= da_old); if (nblks < da_old) - xfs_icsb_modify_counters(ip->i_mount, XFS_SBS_FDBLOCKS, - (int64_t)(da_old - nblks), rsvd); + xfs_icsb_modify_free_blocks(ip->i_mount, + (int64_t)(da_old - nblks), rsvd); } /* * Clear out the allocated field, done with it now in any case. @@ -1079,7 +1079,7 @@ xfs_bmap_add_extent_delay_real( diff = (int)(temp + temp2 - startblockval(PREV.br_startblock) - (cur ? cur->bc_private.b.allocated : 0)); if (diff > 0 && - xfs_icsb_modify_counters(ip->i_mount, XFS_SBS_FDBLOCKS, + xfs_icsb_modify_free_blocks(ip->i_mount, -((int64_t)diff), rsvd)) { /* * Ick gross gag me with a spoon. @@ -1090,8 +1090,7 @@ xfs_bmap_add_extent_delay_real( temp--; diff--; if (!diff || - !xfs_icsb_modify_counters(ip->i_mount, - XFS_SBS_FDBLOCKS, + !xfs_icsb_modify_free_blocks(ip->i_mount, -((int64_t)diff), rsvd)) break; } @@ -1099,8 +1098,7 @@ xfs_bmap_add_extent_delay_real( temp2--; diff--; if (!diff || - !xfs_icsb_modify_counters(ip->i_mount, - XFS_SBS_FDBLOCKS, + !xfs_icsb_modify_free_blocks(ip->i_mount, -((int64_t)diff), rsvd)) break; } @@ -1769,8 +1767,8 @@ xfs_bmap_add_extent_hole_delay( } if (oldlen != newlen) { ASSERT(oldlen > newlen); - xfs_icsb_modify_counters(ip->i_mount, XFS_SBS_FDBLOCKS, - (int64_t)(oldlen - newlen), rsvd); + xfs_icsb_modify_free_blocks(ip->i_mount, + (int64_t)(oldlen - newlen), rsvd); /* * Nothing to do for disk quota accounting here. */ @@ -3114,10 +3112,9 @@ xfs_bmap_del_extent( * Nothing to do for disk quota accounting here. */ ASSERT(da_old >= da_new); - if (da_old > da_new) { - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, - (int64_t)(da_old - da_new), rsvd); - } + if (da_old > da_new) + xfs_icsb_modify_free_blocks(ip->i_mount, + (int64_t)(da_old - da_new), rsvd); done: *logflagsp = flags; return error; @@ -4530,14 +4527,12 @@ xfs_bmapi( -((int64_t)extsz), (flags & XFS_BMAPI_RSVBLOCKS)); } else { - error = xfs_icsb_modify_counters(mp, - XFS_SBS_FDBLOCKS, + error = xfs_icsb_modify_free_blocks(mp, -((int64_t)alen), (flags & XFS_BMAPI_RSVBLOCKS)); } if (!error) { - error = xfs_icsb_modify_counters(mp, - XFS_SBS_FDBLOCKS, + error = xfs_icsb_modify_free_blocks(mp, -((int64_t)indlen), (flags & XFS_BMAPI_RSVBLOCKS)); if (error && rt) @@ -4546,8 +4541,7 @@ xfs_bmapi( (int64_t)extsz, (flags & XFS_BMAPI_RSVBLOCKS)); else if (error) - xfs_icsb_modify_counters(mp, - XFS_SBS_FDBLOCKS, + xfs_icsb_modify_free_blocks(mp, (int64_t)alen, (flags & XFS_BMAPI_RSVBLOCKS)); } @@ -5210,7 +5204,7 @@ xfs_bunmapi( ip, -((long)del.br_blockcount), 0, XFS_QMOPT_RES_RTBLKS); } else { - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, + xfs_icsb_modify_free_blocks(mp, (int64_t)del.br_blockcount, rsvd); (void)xfs_trans_reserve_quota_nblks(NULL, ip, -((long)del.br_blockcount), 0, diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index fb9a9c8..be34ff2 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -596,8 +596,7 @@ out: * the extra reserve blocks from the reserve..... */ int error; - error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, - fdblks_delta, 0); + error = xfs_icsb_modify_free_blocks(mp, fdblks_delta, 0); if (error == ENOSPC) goto retry; } diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 4a99e14..d5710232 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -332,6 +332,80 @@ xfs_icsb_sync_counters( percpu_counter_sum_positive(&mp->m_icsb[XFS_ICSB_FDBLOCKS]); } +int +xfs_icsb_modify_inodes( + struct xfs_mount *mp, + int cntr, + int64_t delta) +{ + int ret; + + ASSERT(cntr == XFS_ICSB_ICOUNT || cntr == XFS_ICSB_IFREE); + + ret = percpu_counter_add_unless_lt(&mp->m_icsb[cntr], + delta, 0); + if (likely(ret >= 0)) + return 0; + return ret; +} + +int +xfs_icsb_modify_free_blocks( + struct xfs_mount *mp, + int64_t delta, + int rsvd) +{ + int64_t lcounter; + int64_t res_used; + int ret; + + /* + * if we are putting blocks back, put them into the reserve + * block pool first. + */ + if (unlikely(mp->m_resblks != mp->m_resblks_avail) && delta > 0) { + spin_lock(&mp->m_sb_lock); + res_used = (int64_t)(mp->m_resblks - + mp->m_resblks_avail); + if (res_used > delta) { + mp->m_resblks_avail += delta; + delta = 0; + } else { + delta -= res_used; + mp->m_resblks_avail = mp->m_resblks; + } + spin_unlock(&mp->m_sb_lock); + if (!delta) + return 0; + } + + /* try the change */ + ret = percpu_counter_add_unless_lt(&mp->m_icsb[XFS_ICSB_FDBLOCKS], + delta, XFS_ALLOC_SET_ASIDE(mp)); + if (likely(ret >= 0)) + return 0; + + /* ENOSPC */ + ASSERT(delta < 0); + + if (!rsvd) + return XFS_ERROR(ENOSPC); + + spin_lock(&mp->m_sb_lock); + lcounter = (int64_t)mp->m_resblks_avail + delta; + if (lcounter >= 0) { + mp->m_resblks_avail = lcounter; + spin_unlock(&mp->m_sb_lock); + return 0; + } + spin_unlock(&mp->m_sb_lock); + printk_once(KERN_WARNING + "Filesystem \"%s\": reserve blocks depleted! " + "Consider increasing reserve pool size.", + mp->m_fsname); + return XFS_ERROR(ENOSPC); +} + /* * Check size of device based on the (data/realtime) block count. * Note: this check is used by the growfs code as well as mount. @@ -1856,7 +1930,7 @@ xfs_mod_incore_sb( * * Note that this function may not be used for the superblock values that * are tracked with the in-memory per-cpu counters - a direct call to - * xfs_icsb_modify_counters is required for these. + * xfs_icsb_modify_xxx is required for these. */ int xfs_mod_incore_sb_batch( @@ -1894,90 +1968,6 @@ unwind: return error; } -int -xfs_icsb_modify_counters( - xfs_mount_t *mp, - xfs_sb_field_t field, - int64_t delta, - int rsvd) -{ - int64_t lcounter; - int64_t res_used; - int ret = 0; - - - switch (field) { - case XFS_SBS_ICOUNT: - ret = percpu_counter_add_unless_lt(&mp->m_icsb[XFS_SBS_ICOUNT], - delta, 0); - if (ret < 0) { - ASSERT(0); - return XFS_ERROR(EINVAL); - } - return 0; - - case XFS_SBS_IFREE: - ret = percpu_counter_add_unless_lt(&mp->m_icsb[XFS_SBS_IFREE], - delta, 0); - if (ret < 0) { - ASSERT(0); - return XFS_ERROR(EINVAL); - } - return 0; - - case XFS_SBS_FDBLOCKS: - /* - * if we are putting blocks back, put them into the reserve - * block pool first. - */ - if (mp->m_resblks != mp->m_resblks_avail && delta > 0) { - spin_lock(&mp->m_sb_lock); - res_used = (int64_t)(mp->m_resblks - - mp->m_resblks_avail); - if (res_used > delta) { - mp->m_resblks_avail += delta; - delta = 0; - } else { - delta -= res_used; - mp->m_resblks_avail = mp->m_resblks; - } - spin_unlock(&mp->m_sb_lock); - if (!delta) - return 0; - } - - /* try the change */ - ret = percpu_counter_add_unless_lt(&mp->m_icsb[XFS_ICSB_FDBLOCKS], - delta, XFS_ALLOC_SET_ASIDE(mp)); - if (likely(ret >= 0)) - return 0; - - /* ENOSPC */ - ASSERT(delta < 0); - - if (!rsvd) - return XFS_ERROR(ENOSPC); - - spin_lock(&mp->m_sb_lock); - lcounter = (int64_t)mp->m_resblks_avail + delta; - if (lcounter >= 0) { - mp->m_resblks_avail = lcounter; - spin_unlock(&mp->m_sb_lock); - return 0; - } - spin_unlock(&mp->m_sb_lock); - printk_once(KERN_WARNING - "Filesystem \"%s\": reserve blocks depleted! " - "Consider increasing reserve pool size.", - mp->m_fsname); - return XFS_ERROR(ENOSPC); - default: - ASSERT(0); - return XFS_ERROR(EINVAL); - } - return 0; -} - /* * xfs_getsb() is called to obtain the buffer for the superblock. * The buffer is returned locked and read in from disk. diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 42d31df..03ad25c6 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -75,9 +75,6 @@ enum { XFS_ICSB_MAX, }; -extern int xfs_icsb_modify_counters(struct xfs_mount *, xfs_sb_field_t, - int64_t, int); - typedef struct xfs_mount { struct super_block *m_super; xfs_tid_t m_tid; /* next unused tid for fs */ @@ -333,6 +330,8 @@ extern int xfs_icsb_init_counters(struct xfs_mount *); extern void xfs_icsb_reinit_counters(struct xfs_mount *); extern void xfs_icsb_destroy_counters(struct xfs_mount *); extern void xfs_icsb_sync_counters(struct xfs_mount *); +extern int xfs_icsb_modify_inodes(struct xfs_mount *, int, int64_t); +extern int xfs_icsb_modify_free_blocks(struct xfs_mount *, int64_t, int); #endif /* __KERNEL__ */ diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index f6d956b..8139a2e 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -696,7 +696,7 @@ xfs_trans_reserve( * fail if the count would go below zero. */ if (blocks > 0) { - error = xfs_icsb_modify_counters(tp->t_mountp, XFS_SBS_FDBLOCKS, + error = xfs_icsb_modify_free_blocks(tp->t_mountp, -((int64_t)blocks), rsvd); if (error != 0) { current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); @@ -767,8 +767,8 @@ undo_log: undo_blocks: if (blocks > 0) { - xfs_icsb_modify_counters(tp->t_mountp, XFS_SBS_FDBLOCKS, - (int64_t)blocks, rsvd); + xfs_icsb_modify_free_blocks(tp->t_mountp, + (int64_t)blocks, rsvd); tp->t_blk_res = 0; } @@ -1045,22 +1045,19 @@ xfs_trans_unreserve_and_mod_sb( /* apply the per-cpu counters */ if (blkdelta) { - error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, - blkdelta, rsvd); + error = xfs_icsb_modify_free_blocks(mp, blkdelta, rsvd); if (error) goto out; } if (idelta) { - error = xfs_icsb_modify_counters(mp, XFS_SBS_ICOUNT, - idelta, rsvd); + error = xfs_icsb_modify_inodes(mp, XFS_ICSB_ICOUNT, idelta); if (error) goto out_undo_fdblocks; } if (ifreedelta) { - error = xfs_icsb_modify_counters(mp, XFS_SBS_IFREE, - ifreedelta, rsvd); + error = xfs_icsb_modify_inodes(mp, XFS_ICSB_IFREE, ifreedelta); if (error) goto out_undo_icount; } @@ -1129,15 +1126,15 @@ xfs_trans_unreserve_and_mod_sb( out_undo_ifreecount: if (ifreedelta) - xfs_icsb_modify_counters(mp, XFS_SBS_IFREE, -ifreedelta, rsvd); + xfs_icsb_modify_inodes(mp, XFS_ICSB_IFREE, -ifreedelta); out_undo_icount: if (idelta) - xfs_icsb_modify_counters(mp, XFS_SBS_ICOUNT, -idelta, rsvd); + xfs_icsb_modify_inodes(mp, XFS_ICSB_ICOUNT, -idelta); out_undo_fdblocks: if (blkdelta) - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, -blkdelta, rsvd); + xfs_icsb_modify_free_blocks(mp, -blkdelta, rsvd); out: - ASSERT(error = 0); + ASSERT(error == 0); return; } -- 1.7.2.3 From SRS0+f2mc+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7S1rI244581 for ; Tue, 21 Dec 2010 01:28:01 -0600 X-ASG-Debug-ID: 1292916596-40d600ac0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 926581470316 for ; Mon, 20 Dec 2010 23:29:56 -0800 (PST) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id Y9sY0shRLAXSniUG for ; Mon, 20 Dec 2010 23:29:56 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 39223356-1927428 for ; Tue, 21 Dec 2010 17:59:55 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfI-0001CK-5P for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:44 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwf6-0006Yg-Ot for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:32 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 00/34] xfs: scalability patchset for 2.6.38 Subject: [PATCH 00/34] xfs: scalability patchset for 2.6.38 Date: Tue, 21 Dec 2010 18:28:56 +1100 Message-Id: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1292916598 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50052 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Folks, I'm sending the entire series of scalability patches in a single patchbomb because I'm tired and it's too much like hard work to send it out in multiple patchsets (i.e. I'm being lazy). Overall there are relatively few changes: - new patch for iolock lockdep annotations - new patch for allocations under ilock rcu inode freeing and lookup: - reworked reclaim to use rcu read locking - removed synchronise_rcu() from lookup failure - cleaned up validity checks, added comments and rcu_read_lock_held annotations AIL locking - fixed aild sleep to use TASK_INTERRUPTABLE Log grant scaling - made reserveq/writeq tracing just indicate if there are queued tickets. - cleaned up some minor formatting nitpicks suggested by Christoph - split xlog_space_left() into __xlog_space_left() for AIl tail pushing to work off a single tail lsn value. I'm mainly concerned with getting reviews for the few remaining patches that don't currently have reviewed-by tags. Christoph, I think I've fixed all the things your last round of comments covered, so there should be relatively little remaining to be fixed up. The series is in the following git tree which is based on the current OSS xfs tree. Alex, once I get the remaining reviews complete I'll update the branch and send you a pull request. The following changes since commit 489a150f6454e2cd93d9e0ee6d7c5a361844f62a: xfs: factor duplicate code in xfs_alloc_ag_vextent_near into a helper (2010-12-16 16:06:15 -0600) are available in the git repository at: git://git.kernel.org/pub/scm/linux/dgc/xfsdev.git xfs-for-2.6.38 Dave Chinner (34): xfs: provide a inode iolock lockdep class xfs: use KM_NOFS for allocations during attribute list operations lib: percpu counter add unless less than functionality xfs: use generic per-cpu counter infrastructure xfs: demultiplex xfs_icsb_modify_counters() xfs: dynamic speculative EOF preallocation xfs: don't truncate prealloc from frequently accessed inodes xfs: rcu free inodes xfs: convert inode cache lookups to use RCU locking xfs: convert pag_ici_lock to a spin lock xfs: convert xfsbud shrinker to a per-buftarg shrinker. xfs: add a lru to the XFS buffer cache xfs: connect up buffer reclaim priority hooks xfs: fix EFI transaction cancellation. xfs: Pull EFI/EFD handling out from under the AIL lock xfs: clean up xfs_ail_delete() xfs: bulk AIL insertion during transaction commit xfs: reduce the number of AIL push wakeups xfs: consume iodone callback items on buffers as they are processed xfs: remove all the inodes on a buffer from the AIL in bulk xfs: use AIL bulk update function to implement single updates xfs: use AIL bulk delete function to implement single delete xfs: convert log grant ticket queues to list heads xfs: fact out common grant head/log tail verification code xfs: rework log grant space calculations xfs: combine grant heads into a single 64 bit integer xfs: use wait queues directly for the log wait queues xfs: make AIL tail pushing independent of the grant lock xfs: convert l_last_sync_lsn to an atomic variable xfs: convert l_tail_lsn to an atomic variable. xfs: convert log grant heads to atomic variables xfs: introduce new locks for the log grant ticket wait queues xfs: convert grant head manipulations to lockless algorithm xfs: kill useless spinlock_destroy macro fs/xfs/linux-2.6/sv.h | 59 --- fs/xfs/linux-2.6/xfs_buf.c | 235 ++++++++---- fs/xfs/linux-2.6/xfs_buf.h | 22 +- fs/xfs/linux-2.6/xfs_linux.h | 12 - fs/xfs/linux-2.6/xfs_super.c | 26 +- fs/xfs/linux-2.6/xfs_sync.c | 92 ++++- fs/xfs/linux-2.6/xfs_trace.h | 30 +- fs/xfs/quota/xfs_dquot.c | 1 - fs/xfs/xfs_ag.h | 2 +- fs/xfs/xfs_attr_leaf.c | 4 +- fs/xfs/xfs_bmap.c | 34 +- fs/xfs/xfs_btree.c | 9 +- fs/xfs/xfs_buf_item.c | 32 +- fs/xfs/xfs_extfree_item.c | 97 +++--- fs/xfs/xfs_extfree_item.h | 11 +- fs/xfs/xfs_fsops.c | 8 +- fs/xfs/xfs_iget.c | 90 ++++- fs/xfs/xfs_inode.c | 54 ++- fs/xfs/xfs_inode.h | 15 +- fs/xfs/xfs_inode_item.c | 92 ++++- fs/xfs/xfs_iomap.c | 84 ++++- fs/xfs/xfs_log.c | 741 ++++++++++++++++-------------------- fs/xfs/xfs_log_cil.c | 17 +- fs/xfs/xfs_log_priv.h | 121 +++++- fs/xfs/xfs_log_recover.c | 35 +- fs/xfs/xfs_mount.c | 821 ++++++++-------------------------------- fs/xfs/xfs_mount.h | 90 ++--- fs/xfs/xfs_trans.c | 102 +++++- fs/xfs/xfs_trans.h | 2 +- fs/xfs/xfs_trans_ail.c | 232 ++++++------ fs/xfs/xfs_trans_extfree.c | 8 +- fs/xfs/xfs_trans_priv.h | 35 ++- fs/xfs/xfs_vnodeops.c | 61 ++- include/linux/percpu_counter.h | 27 ++ lib/percpu_counter.c | 79 ++++ 35 files changed, 1698 insertions(+), 1682 deletions(-) delete mode 100644 fs/xfs/linux-2.6/sv.h From SRS0+p6vy+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7S8nj244652 for ; Tue, 21 Dec 2010 01:28:08 -0600 X-ASG-Debug-ID: 1292916602-39be014c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id AD3771470319 for ; Mon, 20 Dec 2010 23:30:03 -0800 (PST) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id sbhg05XoXe9lBFGH for ; Mon, 20 Dec 2010 23:30:03 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50692750-1927428 for ; Tue, 21 Dec 2010 18:00:01 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfS-0001Ce-Ev for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:54 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfH-0006Yy-3D for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:43 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 06/34] xfs: dynamic speculative EOF preallocation Subject: [PATCH 06/34] xfs: dynamic speculative EOF preallocation Date: Tue, 21 Dec 2010 18:29:02 +1100 Message-Id: <1292916570-25015-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1292916604 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50052 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Currently the size of the speculative preallocation during delayed allocation is fixed by either the allocsize mount option of a default size. We are seeing a lot of cases where we need to recommend using the allocsize mount option to prevent fragmentation when buffered writes land in the same AG. Rather than using a fixed preallocation size by default (up to 64k), make it dynamic by basing it on the current inode size. That way the EOF preallocation will increase as the file size increases. Hence for streaming writes we are much more likely to get large preallocations exactly when we need it to reduce fragementation. For default settings, the size of the initial extents is determined by the number of parallel writers and the amount of memory in the machine. For 4GB RAM and 4 concurrent 32GB file writes: EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL 0: [0..1048575]: 1048672..2097247 0 (1048672..2097247) 1048576 1: [1048576..2097151]: 5242976..6291551 0 (5242976..6291551) 1048576 2: [2097152..4194303]: 12583008..14680159 0 (12583008..14680159) 2097152 3: [4194304..8388607]: 25165920..29360223 0 (25165920..29360223) 4194304 4: [8388608..16777215]: 58720352..67108959 0 (58720352..67108959) 8388608 5: [16777216..33554423]: 117440584..134217791 0 (117440584..134217791) 16777208 6: [33554424..50331511]: 184549056..201326143 0 (184549056..201326143) 16777088 7: [50331512..67108599]: 251657408..268434495 0 (251657408..268434495) 16777088 and for 16 concurrent 16GB file writes: EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL 0: [0..262143]: 2490472..2752615 0 (2490472..2752615) 262144 1: [262144..524287]: 6291560..6553703 0 (6291560..6553703) 262144 2: [524288..1048575]: 13631592..14155879 0 (13631592..14155879) 524288 3: [1048576..2097151]: 30408808..31457383 0 (30408808..31457383) 1048576 4: [2097152..4194303]: 52428904..54526055 0 (52428904..54526055) 2097152 5: [4194304..8388607]: 104857704..109052007 0 (104857704..109052007) 4194304 6: [8388608..16777215]: 209715304..218103911 0 (209715304..218103911) 8388608 7: [16777216..33554423]: 452984848..469762055 0 (452984848..469762055) 16777208 Because it is hard to take back specualtive preallocation, cases where there are large slow growing log files on a nearly full filesystem may cause premature ENOSPC. Hence as the filesystem nears full, the maximum dynamic prealloc size Ñ–s reduced according to this table (based on 4k block size): freespace max prealloc size >5% full extent (8GB) 4-5% 2GB (8GB >> 2) 3-4% 1GB (8GB >> 3) 2-3% 512MB (8GB >> 4) 1-2% 256MB (8GB >> 5) <1% 128MB (8GB >> 6) This should reduce the amount of space held in speculative preallocation for such cases. The allocsize mount option turns off the dynamic behaviour and fixes the prealloc size to whatever the mount option specifies. i.e. the behaviour is unchanged. Signed-off-by: Dave Chinner --- fs/xfs/xfs_fsops.c | 1 + fs/xfs/xfs_iomap.c | 84 +++++++++++++++++++++++++++++++++++++++++++++------ fs/xfs/xfs_mount.c | 21 +++++++++++++ fs/xfs/xfs_mount.h | 14 ++++++++ 4 files changed, 110 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index be34ff2..6d17206 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -374,6 +374,7 @@ xfs_growfs_data_private( mp->m_maxicount = icount << mp->m_sb.sb_inopblog; } else mp->m_maxicount = 0; + xfs_set_low_space_thresholds(mp); /* update secondary superblocks. */ for (agno = 1; agno < nagcount; agno++) { diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 22b62a1..f36d2c8 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -267,6 +267,9 @@ error_out: * If the caller is doing a write at the end of the file, then extend the * allocation out to the file system's write iosize. We clean up any extra * space left over when the file is closed in xfs_inactive(). + * + * If we find we already have delalloc preallocation beyond EOF, don't do more + * preallocation as it it not needed. */ STATIC int xfs_iomap_eof_want_preallocate( @@ -282,6 +285,7 @@ xfs_iomap_eof_want_preallocate( xfs_filblks_t count_fsb; xfs_fsblock_t firstblock; int n, error, imaps; + int found_delalloc = 0; *prealloc = 0; if ((offset + count) <= ip->i_size) @@ -306,12 +310,60 @@ xfs_iomap_eof_want_preallocate( return 0; start_fsb += imap[n].br_blockcount; count_fsb -= imap[n].br_blockcount; + + if (imap[n].br_startblock == DELAYSTARTBLOCK) + found_delalloc = 1; } } - *prealloc = 1; + if (!found_delalloc) + *prealloc = 1; return 0; } +/* + * If we don't have a user specified preallocation size, dynamically increase + * the preallocation size as the size of the file grows. Cap the maximum size + * at a single extent or less if the filesystem is near full. The closer the + * filesystem is to full, the smaller the maximum prealocation. + */ +STATIC xfs_fsblock_t +xfs_iomap_prealloc_size( + struct xfs_mount *mp, + struct xfs_inode *ip) +{ + xfs_fsblock_t alloc_blocks = 0; + + if (!(mp->m_flags & XFS_MOUNT_DFLT_IOSIZE)) { + int shift = 0; + int64_t freesp; + + alloc_blocks = XFS_B_TO_FSB(mp, ip->i_size); + alloc_blocks = XFS_FILEOFF_MIN(MAXEXTLEN, + rounddown_pow_of_two(alloc_blocks)); + + freesp = percpu_counter_read_positive( + &mp->m_icsb[XFS_ICSB_FDBLOCKS]); + if (freesp < mp->m_low_space[XFS_LOWSP_5_PCNT]) { + shift = 2; + if (freesp < mp->m_low_space[XFS_LOWSP_4_PCNT]) + shift++; + if (freesp < mp->m_low_space[XFS_LOWSP_3_PCNT]) + shift++; + if (freesp < mp->m_low_space[XFS_LOWSP_2_PCNT]) + shift++; + if (freesp < mp->m_low_space[XFS_LOWSP_1_PCNT]) + shift++; + } + if (shift) + alloc_blocks >>= shift; + } + + if (alloc_blocks < mp->m_writeio_blocks) + alloc_blocks = mp->m_writeio_blocks; + + return alloc_blocks; +} + int xfs_iomap_write_delay( xfs_inode_t *ip, @@ -344,6 +396,7 @@ xfs_iomap_write_delay( extsz = xfs_get_extsz_hint(ip); offset_fsb = XFS_B_TO_FSBT(mp, offset); + error = xfs_iomap_eof_want_preallocate(mp, ip, offset, count, imap, XFS_WRITE_IMAPS, &prealloc); if (error) @@ -351,9 +404,11 @@ xfs_iomap_write_delay( retry: if (prealloc) { + xfs_fsblock_t alloc_blocks = xfs_iomap_prealloc_size(mp, ip); + aligned_offset = XFS_WRITEIO_ALIGN(mp, (offset + count - 1)); ioalign = XFS_B_TO_FSBT(mp, aligned_offset); - last_fsb = ioalign + mp->m_writeio_blocks; + last_fsb = ioalign + alloc_blocks; } else { last_fsb = XFS_B_TO_FSB(mp, ((xfs_ufsize_t)(offset + count))); } @@ -371,22 +426,31 @@ retry: XFS_BMAPI_DELAY | XFS_BMAPI_WRITE | XFS_BMAPI_ENTIRE, &firstblock, 1, imap, &nimaps, NULL); - if (error && (error != ENOSPC)) + switch (error) { + case 0: + case ENOSPC: + case EDQUOT: + break; + default: return XFS_ERROR(error); + } /* - * If bmapi returned us nothing, and if we didn't get back EDQUOT, - * then we must have run out of space - flush all other inodes with - * delalloc blocks and retry without EOF preallocation. + * If bmapi returned us nothing, we got either ENOSPC or EDQUOT. For + * ENOSPC, * flush all other inodes with delalloc blocks to free up + * some of the excess reserved metadata space. For both cases, retry + * without EOF preallocation. */ if (nimaps == 0) { trace_xfs_delalloc_enospc(ip, offset, count); if (flushed) - return XFS_ERROR(ENOSPC); + return XFS_ERROR(error ? error : ENOSPC); - xfs_iunlock(ip, XFS_ILOCK_EXCL); - xfs_flush_inodes(ip); - xfs_ilock(ip, XFS_ILOCK_EXCL); + if (error == ENOSPC) { + xfs_iunlock(ip, XFS_ILOCK_EXCL); + xfs_flush_inodes(ip); + xfs_ilock(ip, XFS_ILOCK_EXCL); + } flushed = 1; error = 0; diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index d5710232..f1b094d 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1101,6 +1101,24 @@ xfs_set_rw_sizes(xfs_mount_t *mp) } /* + * precalculate the low space thresholds for dynamic speculative preallocation. + */ +void +xfs_set_low_space_thresholds( + struct xfs_mount *mp) +{ + int i; + + for (i = 0; i < XFS_LOWSP_MAX; i++) { + __uint64_t space = mp->m_sb.sb_dblocks; + + do_div(space, 100); + mp->m_low_space[i] = space * (i + 1); + } +} + + +/* * Set whether we're using inode alignment. */ STATIC void @@ -1322,6 +1340,9 @@ xfs_mountfs( */ xfs_set_rw_sizes(mp); + /* set the low space thresholds for dynamic preallocation */ + xfs_set_low_space_thresholds(mp); + /* * Set the inode cluster size. * This may still be overridden by the file system diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 03ad25c6..7b42e04 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -75,6 +75,16 @@ enum { XFS_ICSB_MAX, }; +/* dynamic preallocation free space thresholds, 5% down to 1% */ +enum { + XFS_LOWSP_1_PCNT = 0, + XFS_LOWSP_2_PCNT, + XFS_LOWSP_3_PCNT, + XFS_LOWSP_4_PCNT, + XFS_LOWSP_5_PCNT, + XFS_LOWSP_MAX, +}; + typedef struct xfs_mount { struct super_block *m_super; xfs_tid_t m_tid; /* next unused tid for fs */ @@ -169,6 +179,8 @@ typedef struct xfs_mount { on the next remount,rw */ struct shrinker m_inode_shrink; /* inode reclaim shrinker */ struct percpu_counter m_icsb[XFS_ICSB_MAX]; + int64_t m_low_space[XFS_LOWSP_MAX]; + /* low free space thresholds */ } xfs_mount_t; /* @@ -333,6 +345,8 @@ extern void xfs_icsb_sync_counters(struct xfs_mount *); extern int xfs_icsb_modify_inodes(struct xfs_mount *, int, int64_t); extern int xfs_icsb_modify_free_blocks(struct xfs_mount *, int64_t, int); +extern void xfs_set_low_space_thresholds(struct xfs_mount *); + #endif /* __KERNEL__ */ extern void xfs_mod_sb(struct xfs_trans *, __int64_t); -- 1.7.2.3 From SRS0+f2mc+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7S1VQ244578 for ; Tue, 21 Dec 2010 01:28:01 -0600 X-ASG-Debug-ID: 1292916596-337e02130000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 469901CE33C6 for ; Mon, 20 Dec 2010 23:29:56 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id rXHrsy1h2JeiVjeL for ; Mon, 20 Dec 2010 23:29:56 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50575222-1927428 for ; Tue, 21 Dec 2010 17:59:55 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfI-0001CL-6J for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:44 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwf6-0006Yi-R1 for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:32 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: =?UTF-8?q?=5BPATCH=2001/34=5D=20xfs=3A=20provide=20a=20inode=20iolock=20lockdep=20class?= Subject: =?UTF-8?q?=5BPATCH=2001/34=5D=20xfs=3A=20provide=20a=20inode=20iolock=20lockdep=20class?= Date: Tue, 21 Dec 2010 18:28:57 +1100 Message-Id: <1292916570-25015-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1292916598 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE_7582B X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE_7582B Custom Rule 7582B X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The XFS iolock needs to be re-initialised to a new lock class before it enters reclaim to prevent lockdep false positives. Unfortunately, this is not sufficient protection as inodes in the XFS_IRECLAIMABLE state can be recycled and not re-initialised before being reused. We need to re-initialise the lock state when transfering out of XFS_IRECLAIMABLE state to XFS_INEW, but we need to keep the same class as if the inode was just allocated. Hence we need a specific lockdep class variable for the iolock so that both initialisations use the same class. While there, add a specific class for inodes in the reclaim state so that it is easy to tell from lockdep reports what state the inode was in that generated the report. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_super.c | 2 ++ fs/xfs/xfs_iget.c | 19 +++++++++++++++++++ fs/xfs/xfs_inode.h | 2 ++ 3 files changed, 23 insertions(+), 0 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 064f964..c45b323 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1118,6 +1118,8 @@ xfs_fs_evict_inode( */ ASSERT(!rwsem_is_locked(&ip->i_iolock.mr_lock)); mrlock_init(&ip->i_iolock, MRLOCK_BARRIER, "xfsio", ip->i_ino); + lockdep_set_class_and_name(&ip->i_iolock.mr_lock, + &xfs_iolock_reclaimable, "xfs_iolock_reclaimable"); xfs_inactive(ip); } diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index 0cdd269..cdb1c25 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c @@ -43,6 +43,17 @@ /* + * Define xfs inode iolock lockdep classes. We need to ensure that all active + * inodes are considered the same for lockdep purposes, including inodes that + * are recycled through the XFS_IRECLAIMABLE state. This is the the only way to + * guarantee the locks are considered the same when there are multiple lock + * initialisation siteÑ•. Also, define a reclaimable inode class so it is + * obvious in lockdep reports which class the report is against. + */ +static struct lock_class_key xfs_iolock_active; +struct lock_class_key xfs_iolock_reclaimable; + +/* * Allocate and initialise an xfs_inode. */ STATIC struct xfs_inode * @@ -71,6 +82,8 @@ xfs_inode_alloc( ASSERT(completion_done(&ip->i_flush)); mrlock_init(&ip->i_iolock, MRLOCK_BARRIER, "xfsio", ip->i_ino); + lockdep_set_class_and_name(&ip->i_iolock.mr_lock, + &xfs_iolock_active, "xfs_iolock_active"); /* initialise the xfs inode */ ip->i_ino = ino; @@ -218,6 +231,12 @@ xfs_iget_cache_hit( ip->i_flags |= XFS_INEW; __xfs_inode_clear_reclaim_tag(mp, pag, ip); inode->i_state = I_NEW; + + ASSERT(!rwsem_is_locked(&ip->i_iolock.mr_lock)); + mrlock_init(&ip->i_iolock, MRLOCK_BARRIER, "xfsio", ip->i_ino); + lockdep_set_class_and_name(&ip->i_iolock.mr_lock, + &xfs_iolock_active, "xfs_iolock_active"); + spin_unlock(&ip->i_flags_lock); write_unlock(&pag->pag_ici_lock); } else { diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index fb2ca2e..1c6514d 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -438,6 +438,8 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) #define XFS_IOLOCK_DEP(flags) (((flags) & XFS_IOLOCK_DEP_MASK) >> XFS_IOLOCK_SHIFT) #define XFS_ILOCK_DEP(flags) (((flags) & XFS_ILOCK_DEP_MASK) >> XFS_ILOCK_SHIFT) +extern struct lock_class_key xfs_iolock_reclaimable; + /* * Flags for xfs_itruncate_start(). */ -- 1.7.2.3 From SRS0+CBlE+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:11 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_74 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7SB0A244676 for ; Tue, 21 Dec 2010 01:28:11 -0600 X-ASG-Debug-ID: 1292916607-226003180000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 92A031CE33C9 for ; Mon, 20 Dec 2010 23:30:07 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id DlLnsnDp6BZV3VPN for ; Mon, 20 Dec 2010 23:30:07 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50434433-1927428 for ; Tue, 21 Dec 2010 18:00:06 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfS-0001Ct-O9 for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:54 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfH-0006ZC-Cp for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:43 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 11/34] xfs: convert xfsbud shrinker to a per-buftarg shrinker. Subject: [PATCH 11/34] xfs: convert xfsbud shrinker to a per-buftarg shrinker. Date: Tue, 21 Dec 2010 18:29:07 +1100 Message-Id: <1292916570-25015-12-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1292916608 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Before we introduce per-buftarg LRU lists, split the shrinker implementation into per-buftarg shrinker callbacks. At the moment we wake all the xfsbufds to run the delayed write queues to free the dirty buffers and make their pages available for reclaim. However, with an LRU, we want to be able to free clean, unused buffers as well, so we need to separate the xfsbufd from the shrinker callbacks. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Alex Elder --- fs/xfs/linux-2.6/xfs_buf.c | 89 ++++++++++++-------------------------------- fs/xfs/linux-2.6/xfs_buf.h | 4 +- 2 files changed, 27 insertions(+), 66 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 4c5deb6..0a00d7a 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -44,12 +44,7 @@ static kmem_zone_t *xfs_buf_zone; STATIC int xfsbufd(void *); -STATIC int xfsbufd_wakeup(struct shrinker *, int, gfp_t); STATIC void xfs_buf_delwri_queue(xfs_buf_t *, int); -static struct shrinker xfs_buf_shake = { - .shrink = xfsbufd_wakeup, - .seeks = DEFAULT_SEEKS, -}; static struct workqueue_struct *xfslogd_workqueue; struct workqueue_struct *xfsdatad_workqueue; @@ -337,7 +332,6 @@ _xfs_buf_lookup_pages( __func__, gfp_mask); XFS_STATS_INC(xb_page_retries); - xfsbufd_wakeup(NULL, 0, gfp_mask); congestion_wait(BLK_RW_ASYNC, HZ/50); goto retry; } @@ -1461,28 +1455,23 @@ xfs_wait_buftarg( } } -/* - * buftarg list for delwrite queue processing - */ -static LIST_HEAD(xfs_buftarg_list); -static DEFINE_SPINLOCK(xfs_buftarg_lock); - -STATIC void -xfs_register_buftarg( - xfs_buftarg_t *btp) -{ - spin_lock(&xfs_buftarg_lock); - list_add(&btp->bt_list, &xfs_buftarg_list); - spin_unlock(&xfs_buftarg_lock); -} - -STATIC void -xfs_unregister_buftarg( - xfs_buftarg_t *btp) +int +xfs_buftarg_shrink( + struct shrinker *shrink, + int nr_to_scan, + gfp_t mask) { - spin_lock(&xfs_buftarg_lock); - list_del(&btp->bt_list); - spin_unlock(&xfs_buftarg_lock); + struct xfs_buftarg *btp = container_of(shrink, + struct xfs_buftarg, bt_shrinker); + if (nr_to_scan) { + if (test_bit(XBT_FORCE_SLEEP, &btp->bt_flags)) + return -1; + if (list_empty(&btp->bt_delwrite_queue)) + return -1; + set_bit(XBT_FORCE_FLUSH, &btp->bt_flags); + wake_up_process(btp->bt_task); + } + return list_empty(&btp->bt_delwrite_queue) ? -1 : 1; } void @@ -1490,17 +1479,14 @@ xfs_free_buftarg( struct xfs_mount *mp, struct xfs_buftarg *btp) { + unregister_shrinker(&btp->bt_shrinker); + xfs_flush_buftarg(btp, 1); if (mp->m_flags & XFS_MOUNT_BARRIER) xfs_blkdev_issue_flush(btp); iput(btp->bt_mapping->host); - /* Unregister the buftarg first so that we don't get a - * wakeup finding a non-existent task - */ - xfs_unregister_buftarg(btp); kthread_stop(btp->bt_task); - kmem_free(btp); } @@ -1597,20 +1583,13 @@ xfs_alloc_delwrite_queue( xfs_buftarg_t *btp, const char *fsname) { - int error = 0; - - INIT_LIST_HEAD(&btp->bt_list); INIT_LIST_HEAD(&btp->bt_delwrite_queue); spin_lock_init(&btp->bt_delwrite_lock); btp->bt_flags = 0; btp->bt_task = kthread_run(xfsbufd, btp, "xfsbufd/%s", fsname); - if (IS_ERR(btp->bt_task)) { - error = PTR_ERR(btp->bt_task); - goto out_error; - } - xfs_register_buftarg(btp); -out_error: - return error; + if (IS_ERR(btp->bt_task)) + return PTR_ERR(btp->bt_task); + return 0; } xfs_buftarg_t * @@ -1633,6 +1612,9 @@ xfs_alloc_buftarg( goto error; if (xfs_alloc_delwrite_queue(btp, fsname)) goto error; + btp->bt_shrinker.shrink = xfs_buftarg_shrink; + btp->bt_shrinker.seeks = DEFAULT_SEEKS; + register_shrinker(&btp->bt_shrinker); return btp; error: @@ -1737,27 +1719,6 @@ xfs_buf_runall_queues( flush_workqueue(queue); } -STATIC int -xfsbufd_wakeup( - struct shrinker *shrink, - int priority, - gfp_t mask) -{ - xfs_buftarg_t *btp; - - spin_lock(&xfs_buftarg_lock); - list_for_each_entry(btp, &xfs_buftarg_list, bt_list) { - if (test_bit(XBT_FORCE_SLEEP, &btp->bt_flags)) - continue; - if (list_empty(&btp->bt_delwrite_queue)) - continue; - set_bit(XBT_FORCE_FLUSH, &btp->bt_flags); - wake_up_process(btp->bt_task); - } - spin_unlock(&xfs_buftarg_lock); - return 0; -} - /* * Move as many buffers as specified to the supplied list * idicating if we skipped any buffers to prevent deadlocks. @@ -1952,7 +1913,6 @@ xfs_buf_init(void) if (!xfsconvertd_workqueue) goto out_destroy_xfsdatad_workqueue; - register_shrinker(&xfs_buf_shake); return 0; out_destroy_xfsdatad_workqueue: @@ -1968,7 +1928,6 @@ xfs_buf_init(void) void xfs_buf_terminate(void) { - unregister_shrinker(&xfs_buf_shake); destroy_workqueue(xfsconvertd_workqueue); destroy_workqueue(xfsdatad_workqueue); destroy_workqueue(xfslogd_workqueue); diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h index 383a3f3..9344103 100644 --- a/fs/xfs/linux-2.6/xfs_buf.h +++ b/fs/xfs/linux-2.6/xfs_buf.h @@ -128,10 +128,12 @@ typedef struct xfs_buftarg { /* per device delwri queue */ struct task_struct *bt_task; - struct list_head bt_list; struct list_head bt_delwrite_queue; spinlock_t bt_delwrite_lock; unsigned long bt_flags; + + /* LRU control structures */ + struct shrinker bt_shrinker; } xfs_buftarg_t; /* -- 1.7.2.3 From SRS0++ukE+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:11 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7SAEh244668 for ; Tue, 21 Dec 2010 01:28:11 -0600 X-ASG-Debug-ID: 1292916606-362f023f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3E899212021 for ; Mon, 20 Dec 2010 23:30:07 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id yptW8qWLIsGZD2iS for ; Mon, 20 Dec 2010 23:30:07 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50071180-1927428 for ; Tue, 21 Dec 2010 18:00:06 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfS-0001Cj-IO for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:54 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfH-0006Z3-7J for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:43 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 08/34] xfs: rcu free inodes Subject: [PATCH 08/34] xfs: rcu free inodes Date: Tue, 21 Dec 2010 18:29:04 +1100 Message-Id: <1292916570-25015-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1292916608 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.92 X-Barracuda-Spam-Status: No, SCORE=-0.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE_7582B, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.50 BSF_RULE_7582B Custom Rule 7582B X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Introduce RCU freeing of XFS inodes so that we can convert lookup traversals to use rcu_read_lock() protection. This patch only introduces the RCU freeing to minimise the potential conflicts with mainline if this is merged into mainline via a VFS patchset. It abuses the i_dentry list for the RCU callback structure because the VFS patches make this a union so it is safe to use like this and simplifies and merge issues. This patch uses basic RCU freeing rather than SLAB_DESTROY_BY_RCU. The later lookup patches need the same "found free inode" protection regardless of the RCU freeing method used, so once again the RCU freeing method can be dealt with apprpriately at merge time without affecting any other code. Signed-off-by: Dave Chinner Reviewed-by: Paul E. McKenney --- fs/xfs/xfs_iget.c | 14 +++++++++++++- 1 files changed, 13 insertions(+), 1 deletions(-) diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index cdb1c25..9fae475 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c @@ -105,6 +105,18 @@ xfs_inode_alloc( } void +__xfs_inode_free( + struct rcu_head *head) +{ + struct inode *inode = container_of((void *)head, + struct inode, i_dentry); + struct xfs_inode *ip = XFS_I(inode); + + INIT_LIST_HEAD(&inode->i_dentry); + kmem_zone_free(xfs_inode_zone, ip); +} + +void xfs_inode_free( struct xfs_inode *ip) { @@ -147,7 +159,7 @@ xfs_inode_free( ASSERT(!spin_is_locked(&ip->i_flags_lock)); ASSERT(completion_done(&ip->i_flush)); - kmem_zone_free(xfs_inode_zone, ip); + call_rcu((struct rcu_head *)&VFS_I(ip)->i_dentry, __xfs_inode_free); } /* -- 1.7.2.3 From SRS0+f2mc+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:12 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7SBJT244688 for ; Tue, 21 Dec 2010 01:28:12 -0600 X-ASG-Debug-ID: 1292916607-31e801860000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1E876147031B for ; Mon, 20 Dec 2010 23:30:07 -0800 (PST) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id GlFzec7k2cMMTeaN for ; Mon, 20 Dec 2010 23:30:07 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 39223383-1927428 for ; Tue, 21 Dec 2010 18:00:06 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfc-0001Cp-L9 for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:04 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfH-0006Z9-At for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:43 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 10/34] xfs: convert pag_ici_lock to a spin lock Subject: [PATCH 10/34] xfs: convert pag_ici_lock to a spin lock Date: Tue, 21 Dec 2010 18:29:06 +1100 Message-Id: <1292916570-25015-11-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1292916609 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50052 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner now that we are using RCU protection for the inode cache lookups, the lock is only needed on the modification side. Hence it is not necessary for the lock to be a rwlock as there are no read side holders anymore. Convert it to a spin lock to reflect it's exclusive nature. Signed-off-by: Dave Chinner Reviewed-by: Alex Elder Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_sync.c | 8 ++++---- fs/xfs/xfs_ag.h | 2 +- fs/xfs/xfs_iget.c | 10 +++++----- fs/xfs/xfs_mount.c | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index fd38682..a02480d 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -620,12 +620,12 @@ xfs_inode_set_reclaim_tag( struct xfs_perag *pag; pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); - write_lock(&pag->pag_ici_lock); + spin_lock(&pag->pag_ici_lock); spin_lock(&ip->i_flags_lock); __xfs_inode_set_reclaim_tag(pag, ip); __xfs_iflags_set(ip, XFS_IRECLAIMABLE); spin_unlock(&ip->i_flags_lock); - write_unlock(&pag->pag_ici_lock); + spin_unlock(&pag->pag_ici_lock); xfs_perag_put(pag); } @@ -833,12 +833,12 @@ reclaim: * added to the tree assert that it's been there before to catch * problems with the inode life time early on. */ - write_lock(&pag->pag_ici_lock); + spin_lock(&pag->pag_ici_lock); if (!radix_tree_delete(&pag->pag_ici_root, XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino))) ASSERT(0); __xfs_inode_clear_reclaim(pag, ip); - write_unlock(&pag->pag_ici_lock); + spin_unlock(&pag->pag_ici_lock); /* * Here we do an (almost) spurious inode lock in order to coordinate diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h index 63c7a1a..58632cc 100644 --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h @@ -227,7 +227,7 @@ typedef struct xfs_perag { atomic_t pagf_fstrms; /* # of filestreams active in this AG */ - rwlock_t pag_ici_lock; /* incore inode lock */ + spinlock_t pag_ici_lock; /* incore inode cache lock */ struct radix_tree_root pag_ici_root; /* incore inode cache root */ int pag_ici_reclaimable; /* reclaimable inodes */ struct mutex pag_ici_reclaim_lock; /* serialisation point */ diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index 04ed09b..3ecad00 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c @@ -260,7 +260,7 @@ xfs_iget_cache_hit( goto out_error; } - write_lock(&pag->pag_ici_lock); + spin_lock(&pag->pag_ici_lock); spin_lock(&ip->i_flags_lock); ip->i_flags &= ~(XFS_IRECLAIMABLE | XFS_IRECLAIM); ip->i_flags |= XFS_INEW; @@ -273,7 +273,7 @@ xfs_iget_cache_hit( &xfs_iolock_active, "xfs_iolock_active"); spin_unlock(&ip->i_flags_lock); - write_unlock(&pag->pag_ici_lock); + spin_unlock(&pag->pag_ici_lock); } else { /* If the VFS inode is being torn down, pause and try again. */ if (!igrab(inode)) { @@ -351,7 +351,7 @@ xfs_iget_cache_miss( BUG(); } - write_lock(&pag->pag_ici_lock); + spin_lock(&pag->pag_ici_lock); /* insert the new inode */ error = radix_tree_insert(&pag->pag_ici_root, agino, ip); @@ -366,14 +366,14 @@ xfs_iget_cache_miss( ip->i_udquot = ip->i_gdquot = NULL; xfs_iflags_set(ip, XFS_INEW); - write_unlock(&pag->pag_ici_lock); + spin_unlock(&pag->pag_ici_lock); radix_tree_preload_end(); *ipp = ip; return 0; out_preload_end: - write_unlock(&pag->pag_ici_lock); + spin_unlock(&pag->pag_ici_lock); radix_tree_preload_end(); if (lock_flags) xfs_iunlock(ip, lock_flags); diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index f1b094d..312c5ce 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -598,7 +598,7 @@ xfs_initialize_perag( goto out_unwind; pag->pag_agno = index; pag->pag_mount = mp; - rwlock_init(&pag->pag_ici_lock); + spin_lock_init(&pag->pag_ici_lock); mutex_init(&pag->pag_ici_reclaim_lock); INIT_RADIX_TREE(&pag->pag_ici_root, GFP_ATOMIC); spin_lock_init(&pag->pag_buf_lock); -- 1.7.2.3 From SRS0++ukE+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:12 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_62 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7SCUG244695 for ; Tue, 21 Dec 2010 01:28:12 -0600 X-ASG-Debug-ID: 1292916607-300c02c50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 94DF2212024 for ; Mon, 20 Dec 2010 23:30:08 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id nBqU59KB1bMQQxgI for ; Mon, 20 Dec 2010 23:30:08 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50071179-1927428 for ; Tue, 21 Dec 2010 18:00:06 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfc-0001D5-Pa for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:04 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfH-0006ZF-Ef for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:43 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 12/34] xfs: add a lru to the XFS buffer cache Subject: [PATCH 12/34] xfs: add a lru to the XFS buffer cache Date: Tue, 21 Dec 2010 18:29:08 +1100 Message-Id: <1292916570-25015-13-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1292916609 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Introduce a per-buftarg LRU for memory reclaim to operate on. This is the last piece we need to put in place so that we can fully control the buffer lifecycle. This allows XFS to be responsibile for maintaining the working set of buffers under memory pressure instead of relying on the VM reclaim not to take pages we need out from underneath us. The implementation introduces a b_lru_ref counter into the buffer. This is currently set to 1 whenever the buffer is referenced and so is used to determine if the buffer should be added to the LRU or not when freed. Effectively it allows lazy LRU initialisation of the buffer so we do not need to touch the LRU list and locks in xfs_buf_find(). Instead, when the buffer is being released and we drop the last reference to it, we check the b_lru_ref count and if it is none zero we re-add the buffer reference and add the inode to the LRU. The b_lru_ref counter is decremented by the shrinker, and whenever the shrinker comes across a buffer with a zero b_lru_ref counter, if released the LRU reference on the buffer. In the absence of a lookup race, this will result in the buffer being freed. This counting mechanism is used instead of a reference flag so that it is simple to re-introduce buffer-type specific reclaim reference counts to prioritise reclaim more effectively. We still have all those hooks in the XFS code, so this will provide the infrastructure to re-implement that functionality. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_buf.c | 166 ++++++++++++++++++++++++++++++++++++++------ fs/xfs/linux-2.6/xfs_buf.h | 8 ++- 2 files changed, 151 insertions(+), 23 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 0a00d7a..92f1f2a 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -163,8 +163,79 @@ test_page_region( } /* - * Internal xfs_buf_t object manipulation + * xfs_buf_lru_add - add a buffer to the LRU. + * + * The LRU takes a new reference to the buffer so that it will only be freed + * once the shrinker takes the buffer off the LRU. */ +STATIC void +xfs_buf_lru_add( + struct xfs_buf *bp) +{ + struct xfs_buftarg *btp = bp->b_target; + + spin_lock(&btp->bt_lru_lock); + if (list_empty(&bp->b_lru)) { + atomic_inc(&bp->b_hold); + list_add_tail(&bp->b_lru, &btp->bt_lru); + btp->bt_lru_nr++; + } + spin_unlock(&btp->bt_lru_lock); +} + +/* + * xfs_buf_lru_del - remove a buffer from the LRU + * + * The unlocked check is safe here because it only occurs when there are not + * b_lru_ref counts left on the inode under the pag->pag_buf_lock. it is there + * to optimise the shrinker removing the buffer from the LRU and calling + * xfs_buf_free(). i.e. it removes an unneccessary round trip on the + * bt_lru_lock. + */ +STATIC void +xfs_buf_lru_del( + struct xfs_buf *bp) +{ + struct xfs_buftarg *btp = bp->b_target; + + if (list_empty(&bp->b_lru)) + return; + + spin_lock(&btp->bt_lru_lock); + if (!list_empty(&bp->b_lru)) { + list_del_init(&bp->b_lru); + btp->bt_lru_nr--; + } + spin_unlock(&btp->bt_lru_lock); +} + +/* + * When we mark a buffer stale, we remove the buffer from the LRU and clear the + * b_lru_ref count so that the buffer is freed immediately when the buffer + * reference count falls to zero. If the buffer is already on the LRU, we need + * to remove the reference that LRU holds on the buffer. + * + * This prevents build-up of stale buffers on the LRU. + */ +void +xfs_buf_stale( + struct xfs_buf *bp) +{ + bp->b_flags |= XBF_STALE; + atomic_set(&(bp)->b_lru_ref, 0); + if (!list_empty(&bp->b_lru)) { + struct xfs_buftarg *btp = bp->b_target; + + spin_lock(&btp->bt_lru_lock); + if (!list_empty(&bp->b_lru)) { + list_del_init(&bp->b_lru); + btp->bt_lru_nr--; + atomic_dec(&bp->b_hold); + } + spin_unlock(&btp->bt_lru_lock); + } + ASSERT(atomic_read(&bp->b_hold) >= 1); +} STATIC void _xfs_buf_initialize( @@ -181,7 +252,9 @@ _xfs_buf_initialize( memset(bp, 0, sizeof(xfs_buf_t)); atomic_set(&bp->b_hold, 1); + atomic_set(&bp->b_lru_ref, 1); init_completion(&bp->b_iowait); + INIT_LIST_HEAD(&bp->b_lru); INIT_LIST_HEAD(&bp->b_list); RB_CLEAR_NODE(&bp->b_rbnode); sema_init(&bp->b_sema, 0); /* held, no waiters */ @@ -257,6 +330,8 @@ xfs_buf_free( { trace_xfs_buf_free(bp, _RET_IP_); + ASSERT(list_empty(&bp->b_lru)); + if (bp->b_flags & (_XBF_PAGE_CACHE|_XBF_PAGES)) { uint i; @@ -822,6 +897,7 @@ xfs_buf_rele( if (!pag) { ASSERT(!bp->b_relse); + ASSERT(list_empty(&bp->b_lru)); ASSERT(RB_EMPTY_NODE(&bp->b_rbnode)); if (atomic_dec_and_test(&bp->b_hold)) xfs_buf_free(bp); @@ -829,13 +905,19 @@ xfs_buf_rele( } ASSERT(!RB_EMPTY_NODE(&bp->b_rbnode)); + ASSERT(atomic_read(&bp->b_hold) > 0); if (atomic_dec_and_lock(&bp->b_hold, &pag->pag_buf_lock)) { if (bp->b_relse) { atomic_inc(&bp->b_hold); spin_unlock(&pag->pag_buf_lock); bp->b_relse(bp); + } else if (!(bp->b_flags & XBF_STALE) && + atomic_read(&bp->b_lru_ref)) { + xfs_buf_lru_add(bp); + spin_unlock(&pag->pag_buf_lock); } else { + xfs_buf_lru_del(bp); ASSERT(!(bp->b_flags & (XBF_DELWRI|_XBF_DELWRI_Q))); rb_erase(&bp->b_rbnode, &pag->pag_buf_tree); spin_unlock(&pag->pag_buf_lock); @@ -1432,27 +1514,35 @@ xfs_buf_iomove( */ /* - * Wait for any bufs with callbacks that have been submitted but - * have not yet returned... walk the hash list for the target. + * Wait for any bufs with callbacks that have been submitted but have not yet + * returned. These buffers will have an elevated hold count, so wait on those + * while freeing all the buffers only held by the LRU. */ void xfs_wait_buftarg( struct xfs_buftarg *btp) { - struct xfs_perag *pag; - uint i; + struct xfs_buf *bp; - for (i = 0; i < btp->bt_mount->m_sb.sb_agcount; i++) { - pag = xfs_perag_get(btp->bt_mount, i); - spin_lock(&pag->pag_buf_lock); - while (rb_first(&pag->pag_buf_tree)) { - spin_unlock(&pag->pag_buf_lock); +restart: + spin_lock(&btp->bt_lru_lock); + while (!list_empty(&btp->bt_lru)) { + bp = list_first_entry(&btp->bt_lru, struct xfs_buf, b_lru); + if (atomic_read(&bp->b_hold) > 1) { + spin_unlock(&btp->bt_lru_lock); delay(100); - spin_lock(&pag->pag_buf_lock); + goto restart; } - spin_unlock(&pag->pag_buf_lock); - xfs_perag_put(pag); + /* + * clear the LRU reference count so the bufer doesn't get + * ignored in xfs_buf_rele(). + */ + atomic_set(&bp->b_lru_ref, 0); + spin_unlock(&btp->bt_lru_lock); + xfs_buf_rele(bp); + spin_lock(&btp->bt_lru_lock); } + spin_unlock(&btp->bt_lru_lock); } int @@ -1463,15 +1553,45 @@ xfs_buftarg_shrink( { struct xfs_buftarg *btp = container_of(shrink, struct xfs_buftarg, bt_shrinker); - if (nr_to_scan) { - if (test_bit(XBT_FORCE_SLEEP, &btp->bt_flags)) - return -1; - if (list_empty(&btp->bt_delwrite_queue)) - return -1; - set_bit(XBT_FORCE_FLUSH, &btp->bt_flags); - wake_up_process(btp->bt_task); + struct xfs_buf *bp; + LIST_HEAD(dispose); + + if (!nr_to_scan) + return btp->bt_lru_nr; + + spin_lock(&btp->bt_lru_lock); + while (!list_empty(&btp->bt_lru)) { + if (nr_to_scan-- <= 0) + break; + + bp = list_first_entry(&btp->bt_lru, struct xfs_buf, b_lru); + + /* + * Decrement the b_lru_ref count unless the value is already + * zero. If the value is already zero, we need to reclaim the + * buffer, otherwise it gets another trip through the LRU. + */ + if (!atomic_add_unless(&bp->b_lru_ref, -1, 0)) { + list_move_tail(&bp->b_lru, &btp->bt_lru); + continue; + } + + /* + * remove the buffer from the LRU now to avoid needing another + * lock round trip inside xfs_buf_rele(). + */ + list_move(&bp->b_lru, &dispose); + btp->bt_lru_nr--; } - return list_empty(&btp->bt_delwrite_queue) ? -1 : 1; + spin_unlock(&btp->bt_lru_lock); + + while (!list_empty(&dispose)) { + bp = list_first_entry(&dispose, struct xfs_buf, b_lru); + list_del_init(&bp->b_lru); + xfs_buf_rele(bp); + } + + return btp->bt_lru_nr; } void @@ -1606,6 +1726,8 @@ xfs_alloc_buftarg( btp->bt_mount = mp; btp->bt_dev = bdev->bd_dev; btp->bt_bdev = bdev; + INIT_LIST_HEAD(&btp->bt_lru); + spin_lock_init(&btp->bt_lru_lock); if (xfs_setsize_buftarg_early(btp, bdev)) goto error; if (xfs_mapping_buftarg(btp, bdev)) diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h index 9344103..4601eab 100644 --- a/fs/xfs/linux-2.6/xfs_buf.h +++ b/fs/xfs/linux-2.6/xfs_buf.h @@ -134,6 +134,9 @@ typedef struct xfs_buftarg { /* LRU control structures */ struct shrinker bt_shrinker; + struct list_head bt_lru; + spinlock_t bt_lru_lock; + unsigned int bt_lru_nr; } xfs_buftarg_t; /* @@ -166,9 +169,11 @@ typedef struct xfs_buf { xfs_off_t b_file_offset; /* offset in file */ size_t b_buffer_length;/* size of buffer in bytes */ atomic_t b_hold; /* reference count */ + atomic_t b_lru_ref; /* lru reclaim ref count */ xfs_buf_flags_t b_flags; /* status flags */ struct semaphore b_sema; /* semaphore for lockables */ + struct list_head b_lru; /* lru list */ wait_queue_head_t b_waiters; /* unpin waiters */ struct list_head b_list; struct xfs_perag *b_pag; /* contains rbtree root */ @@ -266,7 +271,8 @@ extern void xfs_buf_terminate(void); #define XFS_BUF_ZEROFLAGS(bp) ((bp)->b_flags &= \ ~(XBF_READ|XBF_WRITE|XBF_ASYNC|XBF_DELWRI|XBF_ORDERED)) -#define XFS_BUF_STALE(bp) ((bp)->b_flags |= XBF_STALE) +void xfs_buf_stale(struct xfs_buf *bp); +#define XFS_BUF_STALE(bp) xfs_buf_stale(bp); #define XFS_BUF_UNSTALE(bp) ((bp)->b_flags &= ~XBF_STALE) #define XFS_BUF_ISSTALE(bp) ((bp)->b_flags & XBF_STALE) #define XFS_BUF_SUPER_STALE(bp) do { \ -- 1.7.2.3 From SRS0+K7iM+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7SCbX244706 for ; Tue, 21 Dec 2010 01:28:12 -0600 X-ASG-Debug-ID: 1292916607-362b021b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B566A212027 for ; Mon, 20 Dec 2010 23:30:08 -0800 (PST) Received: from mail.internode.on.net (bld-mail20.adl6.internode.on.net [150.101.137.105]) by cuda.sgi.com with ESMTP id jxiE0AZb4nEF4GGa for ; Mon, 20 Dec 2010 23:30:08 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 5388607-1927428 for ; Tue, 21 Dec 2010 18:00:06 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfS-0001Cl-Kj for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:54 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfH-0006Z6-8x for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:43 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 09/34] xfs: convert inode cache lookups to use RCU locking Subject: [PATCH 09/34] xfs: convert inode cache lookups to use RCU locking Date: Tue, 21 Dec 2010 18:29:05 +1100 Message-Id: <1292916570-25015-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: bld-mail20.adl6.internode.on.net[150.101.137.105] X-Barracuda-Start-Time: 1292916609 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner With delayed logging greatly increasing the sustained parallelism of inode operations, the inode cache locking is showing significant read vs write contention when inode reclaim runs at the same time as lookups. There is also a lot more write lock acquistions than there are read locks (4:1 ratio) so the read locking is not really buying us much in the way of parallelism. To avoid the read vs write contention, change the cache to use RCU locking on the read side. To avoid needing to RCU free every single inode, use the built in slab RCU freeing mechanism. This requires us to be able to detect lookups of freed inodes, so enÑ•ure that ever freed inode has an inode number of zero and the XFS_IRECLAIM flag set. We already check the XFS_IRECLAIM flag in cache hit lookup path, but also add a check for a zero inode number as well. We canthen convert all the read locking lockups to use RCU read side locking and hence remove all read side locking. Signed-off-by: Dave Chinner Reviewed-by: Alex Elder --- fs/xfs/linux-2.6/xfs_sync.c | 84 +++++++++++++++++++++++++++++++++--------- fs/xfs/xfs_iget.c | 47 ++++++++++++++++++------ fs/xfs/xfs_inode.c | 52 ++++++++++++++++++++------ 3 files changed, 141 insertions(+), 42 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index afb0d7c..fd38682 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -53,14 +53,30 @@ xfs_inode_ag_walk_grab( { struct inode *inode = VFS_I(ip); + ASSERT(rcu_read_lock_held()); + + /* + * check for stale RCU freed inode + * + * If the inode has been reallocated, it doesn't matter if it's not in + * the AG we are walking - we are walking for writeback, so if it + * passes all the "valid inode" checks and is dirty, then we'll write + * it back anyway. If it has been reallocated and still being + * initialised, the XFS_INEW check below will catch it. + */ + spin_lock(&ip->i_flags_lock); + if (!ip->i_ino) + goto out_unlock_noent; + + /* avoid new or reclaimable inodes. Leave for reclaim code to flush */ + if (__xfs_iflags_test(ip, XFS_INEW | XFS_IRECLAIMABLE | XFS_IRECLAIM)) + goto out_unlock_noent; + spin_unlock(&ip->i_flags_lock); + /* nothing to sync during shutdown */ if (XFS_FORCED_SHUTDOWN(ip->i_mount)) return EFSCORRUPTED; - /* avoid new or reclaimable inodes. Leave for reclaim code to flush */ - if (xfs_iflags_test(ip, XFS_INEW | XFS_IRECLAIMABLE | XFS_IRECLAIM)) - return ENOENT; - /* If we can't grab the inode, it must on it's way to reclaim. */ if (!igrab(inode)) return ENOENT; @@ -72,6 +88,10 @@ xfs_inode_ag_walk_grab( /* inode is valid */ return 0; + +out_unlock_noent: + spin_unlock(&ip->i_flags_lock); + return ENOENT; } STATIC int @@ -98,12 +118,12 @@ restart: int error = 0; int i; - read_lock(&pag->pag_ici_lock); + rcu_read_lock(); nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void **)batch, first_index, XFS_LOOKUP_BATCH); if (!nr_found) { - read_unlock(&pag->pag_ici_lock); + rcu_read_unlock(); break; } @@ -118,18 +138,26 @@ restart: batch[i] = NULL; /* - * Update the index for the next lookup. Catch overflows - * into the next AG range which can occur if we have inodes - * in the last block of the AG and we are currently - * pointing to the last inode. + * Update the index for the next lookup. Catch + * overflows into the next AG range which can occur if + * we have inodes in the last block of the AG and we + * are currently pointing to the last inode. + * + * Because we may see inodes that are from the wrong AG + * due to RCU freeing and reallocation, only update the + * index if it lies in this AG. It was a race that lead + * us to see this inode, so another lookup from the + * same index will not find it again. */ + if (XFS_INO_TO_AGNO(mp, ip->i_ino) != pag->pag_agno) + continue; first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1); if (first_index < XFS_INO_TO_AGINO(mp, ip->i_ino)) done = 1; } /* unlock now we've grabbed the inodes. */ - read_unlock(&pag->pag_ici_lock); + rcu_read_unlock(); for (i = 0; i < nr_found; i++) { if (!batch[i]) @@ -639,9 +667,14 @@ xfs_reclaim_inode_grab( struct xfs_inode *ip, int flags) { + ASSERT(rcu_read_lock_held()); + + /* quick check for stale RCU freed inode */ + if (!ip->i_ino) + return 1; /* - * do some unlocked checks first to avoid unnecceary lock traffic. + * do some unlocked checks first to avoid unnecessary lock traffic. * The first is a flush lock check, the second is a already in reclaim * check. Only do these checks if we are not going to block on locks. */ @@ -654,11 +687,16 @@ xfs_reclaim_inode_grab( * The radix tree lock here protects a thread in xfs_iget from racing * with us starting reclaim on the inode. Once we have the * XFS_IRECLAIM flag set it will not touch us. + * + * Due to RCU lookup, we may find inodes that have been freed and only + * have XFS_IRECLAIM set. Indeed, we may see reallocated inodes that + * aren't candidates for reclaim at all, so we must check the + * XFS_IRECLAIMABLE is set first before proceeding to reclaim. */ spin_lock(&ip->i_flags_lock); - ASSERT_ALWAYS(__xfs_iflags_test(ip, XFS_IRECLAIMABLE)); - if (__xfs_iflags_test(ip, XFS_IRECLAIM)) { - /* ignore as it is already under reclaim */ + if (!__xfs_iflags_test(ip, XFS_IRECLAIMABLE) || + __xfs_iflags_test(ip, XFS_IRECLAIM)) { + /* not a reclaim candidate. */ spin_unlock(&ip->i_flags_lock); return 1; } @@ -864,14 +902,14 @@ restart: struct xfs_inode *batch[XFS_LOOKUP_BATCH]; int i; - write_lock(&pag->pag_ici_lock); + rcu_read_lock(); nr_found = radix_tree_gang_lookup_tag( &pag->pag_ici_root, (void **)batch, first_index, XFS_LOOKUP_BATCH, XFS_ICI_RECLAIM_TAG); if (!nr_found) { - write_unlock(&pag->pag_ici_lock); + rcu_read_unlock(); break; } @@ -891,14 +929,24 @@ restart: * occur if we have inodes in the last block of * the AG and we are currently pointing to the * last inode. + * + * Because we may see inodes that are from the + * wrong AG due to RCU freeing and + * reallocation, only update the index if it + * lies in this AG. It was a race that lead us + * to see this inode, so another lookup from + * the same index will not find it again. */ + if (XFS_INO_TO_AGNO(mp, ip->i_ino) != + pag->pag_agno) + continue; first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1); if (first_index < XFS_INO_TO_AGINO(mp, ip->i_ino)) done = 1; } /* unlock now we've grabbed the inodes. */ - write_unlock(&pag->pag_ici_lock); + rcu_read_unlock(); for (i = 0; i < nr_found; i++) { if (!batch[i]) diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index 9fae475..04ed09b 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c @@ -80,6 +80,7 @@ xfs_inode_alloc( ASSERT(atomic_read(&ip->i_pincount) == 0); ASSERT(!spin_is_locked(&ip->i_flags_lock)); ASSERT(completion_done(&ip->i_flush)); + ASSERT(ip->i_ino == 0); mrlock_init(&ip->i_iolock, MRLOCK_BARRIER, "xfsio", ip->i_ino); lockdep_set_class_and_name(&ip->i_iolock.mr_lock, @@ -98,9 +99,6 @@ xfs_inode_alloc( ip->i_size = 0; ip->i_new_size = 0; - /* prevent anyone from using this yet */ - VFS_I(ip)->i_state = I_NEW; - return ip; } @@ -159,6 +157,16 @@ xfs_inode_free( ASSERT(!spin_is_locked(&ip->i_flags_lock)); ASSERT(completion_done(&ip->i_flush)); + /* + * Because we use RCU freeing we need to ensure the inode always + * appears to be reclaimed with an invalid inode number when in the + * free state. The ip->i_flags_lock provides the barrier against lookup + * races. + */ + spin_lock(&ip->i_flags_lock); + ip->i_flags = XFS_IRECLAIM; + ip->i_ino = 0; + spin_unlock(&ip->i_flags_lock); call_rcu((struct rcu_head *)&VFS_I(ip)->i_dentry, __xfs_inode_free); } @@ -169,14 +177,29 @@ static int xfs_iget_cache_hit( struct xfs_perag *pag, struct xfs_inode *ip, + xfs_ino_t ino, int flags, - int lock_flags) __releases(pag->pag_ici_lock) + int lock_flags) __releases(RCU) { struct inode *inode = VFS_I(ip); struct xfs_mount *mp = ip->i_mount; int error; + /* + * check for re-use of an inode within an RCU grace period due to the + * radix tree nodes not being updated yet. We monitor for this by + * setting the inode number to zero before freeing the inode structure. + * If the inode has been reallocated and set up, then the inode number + * will not match, so check for that, too. + */ spin_lock(&ip->i_flags_lock); + if (ip->i_ino != ino) { + trace_xfs_iget_skip(ip); + XFS_STATS_INC(xs_ig_frecycle); + error = EAGAIN; + goto out_error; + } + /* * If we are racing with another cache hit that is currently @@ -219,7 +242,7 @@ xfs_iget_cache_hit( ip->i_flags |= XFS_IRECLAIM; spin_unlock(&ip->i_flags_lock); - read_unlock(&pag->pag_ici_lock); + rcu_read_unlock(); error = -inode_init_always(mp->m_super, inode); if (error) { @@ -227,7 +250,7 @@ xfs_iget_cache_hit( * Re-initializing the inode failed, and we are in deep * trouble. Try to re-add it to the reclaim list. */ - read_lock(&pag->pag_ici_lock); + rcu_read_lock(); spin_lock(&ip->i_flags_lock); ip->i_flags &= ~XFS_INEW; @@ -261,7 +284,7 @@ xfs_iget_cache_hit( /* We've got a live one. */ spin_unlock(&ip->i_flags_lock); - read_unlock(&pag->pag_ici_lock); + rcu_read_unlock(); trace_xfs_iget_hit(ip); } @@ -275,7 +298,7 @@ xfs_iget_cache_hit( out_error: spin_unlock(&ip->i_flags_lock); - read_unlock(&pag->pag_ici_lock); + rcu_read_unlock(); return error; } @@ -397,7 +420,7 @@ xfs_iget( xfs_agino_t agino; /* reject inode numbers outside existing AGs */ - if (XFS_INO_TO_AGNO(mp, ino) >= mp->m_sb.sb_agcount) + if (!ino || XFS_INO_TO_AGNO(mp, ino) >= mp->m_sb.sb_agcount) return EINVAL; /* get the perag structure and ensure that it's inode capable */ @@ -406,15 +429,15 @@ xfs_iget( again: error = 0; - read_lock(&pag->pag_ici_lock); + rcu_read_lock(); ip = radix_tree_lookup(&pag->pag_ici_root, agino); if (ip) { - error = xfs_iget_cache_hit(pag, ip, flags, lock_flags); + error = xfs_iget_cache_hit(pag, ip, ino, flags, lock_flags); if (error) goto out_error_or_again; } else { - read_unlock(&pag->pag_ici_lock); + rcu_read_unlock(); XFS_STATS_INC(xs_ig_missed); error = xfs_iget_cache_miss(mp, pag, tp, ino, &ip, diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 108c7a0..43ffd90 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2000,17 +2000,33 @@ xfs_ifree_cluster( */ for (i = 0; i < ninodes; i++) { retry: - read_lock(&pag->pag_ici_lock); + rcu_read_lock(); ip = radix_tree_lookup(&pag->pag_ici_root, XFS_INO_TO_AGINO(mp, (inum + i))); - /* Inode not in memory or stale, nothing to do */ - if (!ip || xfs_iflags_test(ip, XFS_ISTALE)) { - read_unlock(&pag->pag_ici_lock); + /* Inode not in memory, nothing to do */ + if (!ip) { + rcu_read_unlock(); continue; } /* + * because this is an RCU protected lookup, we could + * find a recently freed or even reallocated inode + * during the lookup. We need to check under the + * i_flags_lock for a valid inode here. Skip it if it + * is not valid, the wrong inode or stale. + */ + spin_lock(&ip->i_flags_lock); + if (ip->i_ino != inum + i || + __xfs_iflags_test(ip, XFS_ISTALE)) { + spin_unlock(&ip->i_flags_lock); + rcu_read_unlock(); + continue; + } + spin_unlock(&ip->i_flags_lock); + + /* * Don't try to lock/unlock the current inode, but we * _cannot_ skip the other inodes that we did not find * in the list attached to the buffer and are not @@ -2019,11 +2035,11 @@ retry: */ if (ip != free_ip && !xfs_ilock_nowait(ip, XFS_ILOCK_EXCL)) { - read_unlock(&pag->pag_ici_lock); + rcu_read_unlock(); delay(1); goto retry; } - read_unlock(&pag->pag_ici_lock); + rcu_read_unlock(); xfs_iflock(ip); xfs_iflags_set(ip, XFS_ISTALE); @@ -2629,7 +2645,7 @@ xfs_iflush_cluster( mask = ~(((XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog)) - 1); first_index = XFS_INO_TO_AGINO(mp, ip->i_ino) & mask; - read_lock(&pag->pag_ici_lock); + rcu_read_lock(); /* really need a gang lookup range call here */ nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void**)ilist, first_index, inodes_per_cluster); @@ -2640,9 +2656,21 @@ xfs_iflush_cluster( iq = ilist[i]; if (iq == ip) continue; - /* if the inode lies outside this cluster, we're done. */ - if ((XFS_INO_TO_AGINO(mp, iq->i_ino) & mask) != first_index) - break; + + /* + * because this is an RCU protected lookup, we could find a + * recently freed or even reallocated inode during the lookup. + * We need to check under the i_flags_lock for a valid inode + * here. Skip it if it is not valid or the wrong inode. + */ + spin_lock(&ip->i_flags_lock); + if (!ip->i_ino || + (XFS_INO_TO_AGINO(mp, iq->i_ino) & mask) != first_index) { + spin_unlock(&ip->i_flags_lock); + continue; + } + spin_unlock(&ip->i_flags_lock); + /* * Do an un-protected check to see if the inode is dirty and * is a candidate for flushing. These checks will be repeated @@ -2692,7 +2720,7 @@ xfs_iflush_cluster( } out_free: - read_unlock(&pag->pag_ici_lock); + rcu_read_unlock(); kmem_free(ilist); out_put: xfs_perag_put(pag); @@ -2704,7 +2732,7 @@ cluster_corrupt_out: * Corruption detected in the clustering loop. Invalidate the * inode buffer and shut down the filesystem. */ - read_unlock(&pag->pag_ici_lock); + rcu_read_unlock(); /* * Clean up the buffer. If it was B_DELWRI, just release it -- * brelse can handle it with no problems. If not, shut down the -- 1.7.2.3 From SRS0++ukE+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_64 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7SJsD244766 for ; Tue, 21 Dec 2010 01:28:19 -0600 X-ASG-Debug-ID: 1292916614-225d030c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A5E071CE33CF for ; Mon, 20 Dec 2010 23:30:15 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id 23fBXege6jjf1Yxb for ; Mon, 20 Dec 2010 23:30:15 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50071192-1927428 for ; Tue, 21 Dec 2010 18:00:14 +1030 (CDT) Received: from [192.168.1.1] (helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfc-0001D1-W1 for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:05 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfH-0006ZP-NJ for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:43 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 16/34] xfs: clean up xfs_ail_delete() Subject: [PATCH 16/34] xfs: clean up xfs_ail_delete() Date: Tue, 21 Dec 2010 18:29:12 +1100 Message-Id: <1292916570-25015-17-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1292916616 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner xfs_ail_delete() has a needlessly complex interface. It returns the log item that was passed in for deletion (which the callers then assert is identical to the one passed in), and callers of xfs_ail_delete() still need to invalidate current traversal cursors. Make xfs_ail_delete() return void, move the cursor invalidation inside it, and clean up the callers just to use the log item pointer they passed in. While cleaning up, remove the messy and unnecessary "/* ARGUSED */" comments around all these functions. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_trans_ail.c | 27 +++++++-------------------- 1 files changed, 7 insertions(+), 20 deletions(-) diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index dc90695..645928c 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -29,7 +29,7 @@ #include "xfs_error.h" STATIC void xfs_ail_insert(struct xfs_ail *, xfs_log_item_t *); -STATIC xfs_log_item_t * xfs_ail_delete(struct xfs_ail *, xfs_log_item_t *); +STATIC void xfs_ail_delete(struct xfs_ail *, xfs_log_item_t *); STATIC xfs_log_item_t * xfs_ail_min(struct xfs_ail *); STATIC xfs_log_item_t * xfs_ail_next(struct xfs_ail *, xfs_log_item_t *); @@ -468,16 +468,13 @@ xfs_trans_ail_update( xfs_log_item_t *lip, xfs_lsn_t lsn) __releases(ailp->xa_lock) { - xfs_log_item_t *dlip = NULL; xfs_log_item_t *mlip; /* ptr to minimum lip */ xfs_lsn_t tail_lsn; mlip = xfs_ail_min(ailp); if (lip->li_flags & XFS_LI_IN_AIL) { - dlip = xfs_ail_delete(ailp, lip); - ASSERT(dlip == lip); - xfs_trans_ail_cursor_clear(ailp, dlip); + xfs_ail_delete(ailp, lip); } else { lip->li_flags |= XFS_LI_IN_AIL; } @@ -485,7 +482,7 @@ xfs_trans_ail_update( lip->li_lsn = lsn; xfs_ail_insert(ailp, lip); - if (mlip == dlip) { + if (mlip == lip) { mlip = xfs_ail_min(ailp); /* * It is not safe to access mlip after the AIL lock is @@ -524,21 +521,18 @@ xfs_trans_ail_delete( struct xfs_ail *ailp, xfs_log_item_t *lip) __releases(ailp->xa_lock) { - xfs_log_item_t *dlip; xfs_log_item_t *mlip; xfs_lsn_t tail_lsn; if (lip->li_flags & XFS_LI_IN_AIL) { mlip = xfs_ail_min(ailp); - dlip = xfs_ail_delete(ailp, lip); - ASSERT(dlip == lip); - xfs_trans_ail_cursor_clear(ailp, dlip); + xfs_ail_delete(ailp, lip); lip->li_flags &= ~XFS_LI_IN_AIL; lip->li_lsn = 0; - if (mlip == dlip) { + if (mlip == lip) { mlip = xfs_ail_min(ailp); /* * It is not safe to access mlip after the AIL lock @@ -632,7 +626,6 @@ STATIC void xfs_ail_insert( struct xfs_ail *ailp, xfs_log_item_t *lip) -/* ARGSUSED */ { xfs_log_item_t *next_lip; @@ -661,18 +654,14 @@ xfs_ail_insert( /* * Delete the given item from the AIL. Return a pointer to the item. */ -/*ARGSUSED*/ -STATIC xfs_log_item_t * +STATIC void xfs_ail_delete( struct xfs_ail *ailp, xfs_log_item_t *lip) -/* ARGSUSED */ { xfs_ail_check(ailp, lip); - list_del(&lip->li_ail); - - return lip; + xfs_trans_ail_cursor_clear(ailp, lip); } /* @@ -682,7 +671,6 @@ xfs_ail_delete( STATIC xfs_log_item_t * xfs_ail_min( struct xfs_ail *ailp) -/* ARGSUSED */ { if (list_empty(&ailp->xa_ail)) return NULL; @@ -699,7 +687,6 @@ STATIC xfs_log_item_t * xfs_ail_next( struct xfs_ail *ailp, xfs_log_item_t *lip) -/* ARGSUSED */ { if (lip->li_ail.next == &ailp->xa_ail) return NULL; -- 1.7.2.3 From SRS0+p6vy+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7SDPC244710 for ; Tue, 21 Dec 2010 01:28:13 -0600 X-ASG-Debug-ID: 1292916608-28a402d60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0AB681CE33CC for ; Mon, 20 Dec 2010 23:30:08 -0800 (PST) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id 8k7Ink2F0QiLf0GU for ; Mon, 20 Dec 2010 23:30:08 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50692765-1927428 for ; Tue, 21 Dec 2010 18:00:07 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfT-0001D0-0B for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:55 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfH-0006ZN-Jx for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:43 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 15/34] xfs: Pull EFI/EFD handling out from under the AIL lock Subject: [PATCH 15/34] xfs: Pull EFI/EFD handling out from under the AIL lock Date: Tue, 21 Dec 2010 18:29:11 +1100 Message-Id: <1292916570-25015-16-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1292916610 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner EFI/EFD interactions are protected from races by the AIL lock. They are the only type of log items that require the the AIL lock to serialise internal state, so they need to be separated from the AIL lock before we can do bulk insert operations on the AIL. To acheive this, convert the counter of the number of extents in the EFI to an atomic so it can be safely manipulated by EFD processing without locks. Also, convert the EFI state flag manipulations to use atomic bit operations so no locks are needed to record state changes. Finally, use the state bits to determine when it is safe to free the EFI and clean up the code to do this neatly. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_extfree_item.c | 81 ++++++++++++++++++++++++-------------------- fs/xfs/xfs_extfree_item.h | 10 +++--- fs/xfs/xfs_log_recover.c | 9 ++--- fs/xfs/xfs_trans_extfree.c | 8 +++- 4 files changed, 59 insertions(+), 49 deletions(-) diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index 5997efa..75f2ef6 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -48,6 +48,28 @@ xfs_efi_item_free( } /* + * Freeing the efi requires that we remove it from the AIL if it has already + * been placed there. However, the EFI may not yet have been placed in the AIL + * when called by xfs_efi_release() from EFD processing due to the ordering of + * committed vs unpin operations in bulk insert operations. Hence the + * test_and_clear_bit(XFS_EFI_COMMITTED) to ensure only the last caller frees + * the EFI. + */ +STATIC void +__xfs_efi_release( + struct xfs_efi_log_item *efip) +{ + struct xfs_ail *ailp = efip->efi_item.li_ailp; + + if (!test_and_clear_bit(XFS_EFI_COMMITTED, &efip->efi_flags)) { + spin_lock(&ailp->xa_lock); + /* xfs_trans_ail_delete() drops the AIL lock. */ + xfs_trans_ail_delete(ailp, &efip->efi_item); + xfs_efi_item_free(efip); + } +} + +/* * This returns the number of iovecs needed to log the given efi item. * We only need 1 iovec for an efi item. It just logs the efi_log_format * structure. @@ -74,7 +96,8 @@ xfs_efi_item_format( struct xfs_efi_log_item *efip = EFI_ITEM(lip); uint size; - ASSERT(efip->efi_next_extent == efip->efi_format.efi_nextents); + ASSERT(atomic_read(&efip->efi_next_extent) == + efip->efi_format.efi_nextents); efip->efi_format.efi_type = XFS_LI_EFI; @@ -103,7 +126,8 @@ xfs_efi_item_pin( * which the EFI is manipulated during a transaction. If we are being asked to * 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. + * transaction and free it. Otherwise coordinate with xfs_efi_release() (via + * XFS_EFI_COMMITTED) to determine who gets to free the EFI. */ STATIC void xfs_efi_item_unpin( @@ -111,17 +135,14 @@ xfs_efi_item_unpin( int remove) { struct xfs_efi_log_item *efip = EFI_ITEM(lip); - struct xfs_ail *ailp = lip->li_ailp; - spin_lock(&ailp->xa_lock); if (remove) { ASSERT(!(lip->li_flags & XFS_LI_IN_AIL)); xfs_trans_del_item(lip); xfs_efi_item_free(efip); - } else { - efip->efi_flags |= XFS_EFI_COMMITTED; + return; } - spin_unlock(&ailp->xa_lock); + __xfs_efi_release(efip); } /* @@ -150,16 +171,20 @@ xfs_efi_item_unlock( } /* - * The EFI is logged only once and cannot be moved in the log, so - * simply return the lsn at which it's been logged. The canceled - * flag is not paid any attention here. Checking for that is delayed - * until the EFI is unpinned. + * The EFI is logged only once and cannot be moved in the log, so simply return + * the lsn at which it's been logged. For bulk transaction committed + * processing, the EFI may be processed but not yet unpinned prior to the EFD + * being processed. Set the XFS_EFI_COMMITTED flag so this case can be detected + * when processing the EFD. */ STATIC xfs_lsn_t xfs_efi_item_committed( struct xfs_log_item *lip, xfs_lsn_t lsn) { + struct xfs_efi_log_item *efip = EFI_ITEM(lip); + + set_bit(XFS_EFI_COMMITTED, &efip->efi_flags); return lsn; } @@ -228,6 +253,7 @@ xfs_efi_init( xfs_log_item_init(mp, &efip->efi_item, XFS_LI_EFI, &xfs_efi_item_ops); efip->efi_format.efi_nextents = nextents; efip->efi_format.efi_id = (__psint_t)(void*)efip; + atomic_set(&efip->efi_next_extent, 0); return efip; } @@ -287,37 +313,18 @@ xfs_efi_copy_format(xfs_log_iovec_t *buf, xfs_efi_log_format_t *dst_efi_fmt) } /* - * This is called by the efd item code below to release references to - * the given efi item. Each efd calls this with the number of - * extents that it has logged, and when the sum of these reaches - * the total number of extents logged by this efi item we can free - * the efi item. - * - * Freeing the efi item requires that we remove it from the AIL. - * We'll use the AIL lock to protect our counters as well as - * the removal from the AIL. + * This is called by the efd item code below to release references to the given + * efi item. Each efd calls this with the number of extents that it has + * logged, and when the sum of these reaches the total number of extents logged + * by this efi item we can free the efi item. */ void xfs_efi_release(xfs_efi_log_item_t *efip, uint nextents) { - struct xfs_ail *ailp = efip->efi_item.li_ailp; - int extents_left; - - ASSERT(efip->efi_next_extent > 0); - ASSERT(efip->efi_flags & XFS_EFI_COMMITTED); - - spin_lock(&ailp->xa_lock); - ASSERT(efip->efi_next_extent >= nextents); - efip->efi_next_extent -= nextents; - extents_left = efip->efi_next_extent; - if (extents_left == 0) { - /* xfs_trans_ail_delete() drops the AIL lock. */ - xfs_trans_ail_delete(ailp, (xfs_log_item_t *)efip); - xfs_efi_item_free(efip); - } else { - spin_unlock(&ailp->xa_lock); - } + ASSERT(atomic_read(&efip->efi_next_extent) >= nextents); + if (atomic_sub_and_test(nextents, &efip->efi_next_extent)) + __xfs_efi_release(efip); } static inline struct xfs_efd_log_item *EFD_ITEM(struct xfs_log_item *lip) diff --git a/fs/xfs/xfs_extfree_item.h b/fs/xfs/xfs_extfree_item.h index f7834ec..375f68e 100644 --- a/fs/xfs/xfs_extfree_item.h +++ b/fs/xfs/xfs_extfree_item.h @@ -111,10 +111,10 @@ typedef struct xfs_efd_log_format_64 { #define XFS_EFI_MAX_FAST_EXTENTS 16 /* - * Define EFI flags. + * Define EFI flag bits. Manipulated by set/clear/test_bit operators. */ -#define XFS_EFI_RECOVERED 0x1 -#define XFS_EFI_COMMITTED 0x2 +#define XFS_EFI_RECOVERED 1 +#define XFS_EFI_COMMITTED 2 /* * This is the "extent free intention" log item. It is used @@ -124,8 +124,8 @@ typedef struct xfs_efd_log_format_64 { */ typedef struct xfs_efi_log_item { xfs_log_item_t efi_item; - uint efi_flags; /* misc flags */ - uint efi_next_extent; + atomic_t efi_next_extent; + unsigned long efi_flags; /* misc flags */ xfs_efi_log_format_t efi_format; } xfs_efi_log_item_t; diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 4ab4f6f..d7219e2 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -2567,8 +2567,7 @@ xlog_recover_efi_pass2( xfs_efi_item_free(efip); return error; } - efip->efi_next_extent = efi_formatp->efi_nextents; - efip->efi_flags |= XFS_EFI_COMMITTED; + atomic_set(&efip->efi_next_extent, efi_formatp->efi_nextents); spin_lock(&log->l_ailp->xa_lock); /* @@ -2878,7 +2877,7 @@ xlog_recover_process_efi( xfs_extent_t *extp; xfs_fsblock_t startblock_fsb; - ASSERT(!(efip->efi_flags & XFS_EFI_RECOVERED)); + ASSERT(!test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)); /* * First check the validity of the extents described by the @@ -2917,7 +2916,7 @@ xlog_recover_process_efi( extp->ext_len); } - efip->efi_flags |= XFS_EFI_RECOVERED; + set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); error = xfs_trans_commit(tp, 0); return error; @@ -2974,7 +2973,7 @@ xlog_recover_process_efis( * Skip EFIs that we've already processed. */ efip = (xfs_efi_log_item_t *)lip; - if (efip->efi_flags & XFS_EFI_RECOVERED) { + if (test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)) { lip = xfs_trans_ail_cursor_next(ailp, &cur); continue; } diff --git a/fs/xfs/xfs_trans_extfree.c b/fs/xfs/xfs_trans_extfree.c index f783d5e..f7590f5 100644 --- a/fs/xfs/xfs_trans_extfree.c +++ b/fs/xfs/xfs_trans_extfree.c @@ -69,12 +69,16 @@ xfs_trans_log_efi_extent(xfs_trans_t *tp, tp->t_flags |= XFS_TRANS_DIRTY; efip->efi_item.li_desc->lid_flags |= XFS_LID_DIRTY; - next_extent = efip->efi_next_extent; + /* + * atomic_inc_return gives us the value after the increment; + * we want to use it as an array index so we need to subtract 1 from + * it. + */ + next_extent = atomic_inc_return(&efip->efi_next_extent) - 1; ASSERT(next_extent < efip->efi_format.efi_nextents); extp = &(efip->efi_format.efi_extents[next_extent]); extp->ext_start = start_block; extp->ext_len = ext_len; - efip->efi_next_extent++; } -- 1.7.2.3 From SRS0+f2mc+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7SIEw244757 for ; Tue, 21 Dec 2010 01:28:18 -0600 X-ASG-Debug-ID: 1292916613-31e801890000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A81BE147031F for ; Mon, 20 Dec 2010 23:30:14 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id WOarUWKLzfJzmz9Q for ; Mon, 20 Dec 2010 23:30:14 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51088109-1927428 for ; Tue, 21 Dec 2010 18:00:12 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfd-0001DK-2z for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:05 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfR-0006ZR-O3 for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:53 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 17/34] xfs: bulk AIL insertion during transaction commit Subject: [PATCH 17/34] xfs: bulk AIL insertion during transaction commit Date: Tue, 21 Dec 2010 18:29:13 +1100 Message-Id: <1292916570-25015-18-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1292916615 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50052 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner When inserting items into the AIL from the transaction committed callbacks, we take the AIL lock for every single item that is to be inserted. For a CIL checkpoint commit, this can be tens of thousands of individual inserts, yet almost all of the items will be inserted at the same point in the AIL because they have the same index. To reduce the overhead and contention on the AIL lock for such operations, introduce a "bulk insert" operation which allows a list of log items with the same LSN to be inserted in a single operation via a list splice. To do this, we need to pre-sort the log items being committed into a temporary list for insertion. The complexity is that not every log item will end up with the same LSN, and not every item is actually inserted into the AIL. Items that don't match the commit LSN will be inserted and unpinned as per the current one-at-a-time method (relatively rare), while items that are not to be inserted will be unpinned and freed immediately. Items that are to be inserted at the given commit lsn are placed in a temporary array and inserted into the AIL in bulk each time the array fills up. As a result of this, we trade off AIL hold time for a significant reduction in traffic. lock_stat output shows that the worst case hold time is unchanged, but contention from AIL inserts drops by an order of magnitude and the number of lock traversal decreases significantly. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_log_cil.c | 9 +--- fs/xfs/xfs_trans.c | 79 +++++++++++++++++++++++++++++++++- fs/xfs/xfs_trans_ail.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_trans_priv.h | 10 +++- 4 files changed, 195 insertions(+), 12 deletions(-) diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index 23d6ceb..f36f1a2 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -361,15 +361,10 @@ xlog_cil_committed( int abort) { struct xfs_cil_ctx *ctx = args; - struct xfs_log_vec *lv; - int abortflag = abort ? XFS_LI_ABORTED : 0; struct xfs_busy_extent *busyp, *n; - /* unpin all the log items */ - for (lv = ctx->lv_chain; lv; lv = lv->lv_next ) { - xfs_trans_item_committed(lv->lv_item, ctx->start_lsn, - abortflag); - } + xfs_trans_committed_bulk(ctx->cil->xc_log->l_ailp, ctx->lv_chain, + ctx->start_lsn, abort); list_for_each_entry_safe(busyp, n, &ctx->busy_extents, list) xfs_alloc_busy_clear(ctx->cil->xc_log->l_mp, busyp); diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 8139a2e..7bb1439 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -1347,7 +1347,7 @@ xfs_trans_fill_vecs( * they could be immediately flushed and we'd have to race with the flusher * trying to pull the item from the AIL as we add it. */ -void +static void xfs_trans_item_committed( struct xfs_log_item *lip, xfs_lsn_t commit_lsn, @@ -1422,6 +1422,83 @@ xfs_trans_committed( xfs_trans_free(tp); } +static inline void +xfs_log_item_batch_insert( + struct xfs_ail *ailp, + struct xfs_log_item **log_items, + int nr_items, + xfs_lsn_t commit_lsn) +{ + int i; + + spin_lock(&ailp->xa_lock); + /* xfs_trans_ail_update_bulk drops ailp->xa_lock */ + xfs_trans_ail_update_bulk(ailp, log_items, nr_items, commit_lsn); + + for (i = 0; i < nr_items; i++) + IOP_UNPIN(log_items[i], 0); +} + +/* + * Bulk operation version of xfs_trans_committed that takes a log vector of + * items to insert into the AIL. This uses bulk AIL insertion techniques to + * minimise lock traffic. + */ +void +xfs_trans_committed_bulk( + struct xfs_ail *ailp, + struct xfs_log_vec *log_vector, + xfs_lsn_t commit_lsn, + int aborted) +{ +#define LOG_ITEM_BATCH_SIZE 32 + struct xfs_log_item *log_items[LOG_ITEM_BATCH_SIZE]; + struct xfs_log_vec *lv; + int i = 0; + + /* unpin all the log items */ + for (lv = log_vector; lv; lv = lv->lv_next ) { + struct xfs_log_item *lip = lv->lv_item; + xfs_lsn_t item_lsn; + + if (aborted) + lip->li_flags |= XFS_LI_ABORTED; + item_lsn = IOP_COMMITTED(lip, commit_lsn); + + /* item_lsn of -1 means the item was freed */ + if (XFS_LSN_CMP(item_lsn, (xfs_lsn_t)-1) == 0) + continue; + + if (item_lsn != commit_lsn) { + + /* + * Not a bulk update option due to unusual item_lsn. + * Push into AIL immediately, rechecking the lsn once + * we have the ail lock. Then unpin the item. + */ + spin_lock(&ailp->xa_lock); + if (XFS_LSN_CMP(item_lsn, lip->li_lsn) > 0) + xfs_trans_ail_update(ailp, lip, item_lsn); + else + spin_unlock(&ailp->xa_lock); + IOP_UNPIN(lip, 0); + continue; + } + + /* Item is a candidate for bulk AIL insert. */ + log_items[i++] = lv->lv_item; + if (i >= LOG_ITEM_BATCH_SIZE) { + xfs_log_item_batch_insert(ailp, log_items, + LOG_ITEM_BATCH_SIZE, commit_lsn); + i = 0; + } + } + + /* make sure we insert the remainder! */ + if (i) + xfs_log_item_batch_insert(ailp, log_items, i, commit_lsn); +} + /* * Called from the trans_commit code when we notice that * the filesystem is in the middle of a forced shutdown. diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index 645928c..fe991a7 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -29,6 +29,7 @@ #include "xfs_error.h" STATIC void xfs_ail_insert(struct xfs_ail *, xfs_log_item_t *); +STATIC void xfs_ail_splice(struct xfs_ail *, struct list_head *, xfs_lsn_t); STATIC void xfs_ail_delete(struct xfs_ail *, xfs_log_item_t *); STATIC xfs_log_item_t * xfs_ail_min(struct xfs_ail *); STATIC xfs_log_item_t * xfs_ail_next(struct xfs_ail *, xfs_log_item_t *); @@ -502,6 +503,79 @@ xfs_trans_ail_update( } /* xfs_trans_update_ail */ /* + * xfs_trans_ail_update - bulk AIL insertion operation. + * + * @xfs_trans_ail_update takes an array of log items that all need to be + * positioned at the same LSN in the AIL. If an item is not in the AIL, it will + * be added. Otherwise, it will be repositioned by removing it and re-adding + * it to the AIL. If we move the first item in the AIL, update the log tail to + * match the new minimum LSN in the AIL. + * + * This function takes the AIL lock once to execute the update operations on + * all the items in the array, and as such should not be called with the AIL + * lock held. As a result, once we have the AIL lock, we need to check each log + * item LSN to confirm it needs to be moved forward in the AIL. + * + * To optimise the insert operation, we delete all the items from the AIL in + * the first pass, moving them into a temporary list, then splice the temporary + * list into the correct position in the AIL. This avoids needing to do an + * insert operation on every item. + * + * This function must be called with the AIL lock held. The lock is dropped + * before returning. + */ +void +xfs_trans_ail_update_bulk( + struct xfs_ail *ailp, + struct xfs_log_item **log_items, + int nr_items, + xfs_lsn_t lsn) __releases(ailp->xa_lock) +{ + xfs_log_item_t *mlip; + xfs_lsn_t tail_lsn; + int mlip_changed = 0; + int i; + LIST_HEAD(tmp); + + mlip = xfs_ail_min(ailp); + + for (i = 0; i < nr_items; i++) { + struct xfs_log_item *lip = log_items[i]; + if (lip->li_flags & XFS_LI_IN_AIL) { + /* check if we really need to move the item */ + if (XFS_LSN_CMP(lsn, lip->li_lsn) <= 0) + continue; + + xfs_ail_delete(ailp, lip); + if (mlip == lip) + mlip_changed = 1; + } else { + lip->li_flags |= XFS_LI_IN_AIL; + } + lip->li_lsn = lsn; + list_add(&lip->li_ail, &tmp); + } + + xfs_ail_splice(ailp, &tmp, lsn); + + if (!mlip_changed) { + spin_unlock(&ailp->xa_lock); + return; + } + + /* + * It is not safe to access mlip after the AIL lock is dropped, so we + * must get a copy of li_lsn before we do so. This is especially + * important on 32-bit platforms where accessing and updating 64-bit + * values like li_lsn is not atomic. + */ + mlip = xfs_ail_min(ailp); + tail_lsn = mlip->li_lsn; + spin_unlock(&ailp->xa_lock); + xfs_log_move_tail(ailp->xa_mount, tail_lsn); +} + +/* * Delete the given item from the AIL. It must already be in * the AIL. * @@ -642,8 +716,8 @@ xfs_ail_insert( break; } - ASSERT((&next_lip->li_ail == &ailp->xa_ail) || - (XFS_LSN_CMP(next_lip->li_lsn, lip->li_lsn) <= 0)); + ASSERT(&next_lip->li_ail == &ailp->xa_ail || + XFS_LSN_CMP(next_lip->li_lsn, lip->li_lsn) <= 0); list_add(&lip->li_ail, &next_lip->li_ail); @@ -652,6 +726,37 @@ xfs_ail_insert( } /* + * splice the log item list into the AIL at the given LSN. + */ +STATIC void +xfs_ail_splice( + struct xfs_ail *ailp, + struct list_head *list, + xfs_lsn_t lsn) +{ + xfs_log_item_t *next_lip; + + /* + * If the list is empty, just insert the item. + */ + if (list_empty(&ailp->xa_ail)) { + list_splice(list, &ailp->xa_ail); + return; + } + + list_for_each_entry_reverse(next_lip, &ailp->xa_ail, li_ail) { + if (XFS_LSN_CMP(next_lip->li_lsn, lsn) <= 0) + break; + } + + ASSERT((&next_lip->li_ail == &ailp->xa_ail) || + (XFS_LSN_CMP(next_lip->li_lsn, lsn) <= 0)); + + list_splice_init(list, &next_lip->li_ail); + return; +} + +/* * Delete the given item from the AIL. Return a pointer to the item. */ STATIC void diff --git a/fs/xfs/xfs_trans_priv.h b/fs/xfs/xfs_trans_priv.h index 62da86c..e039729 100644 --- a/fs/xfs/xfs_trans_priv.h +++ b/fs/xfs/xfs_trans_priv.h @@ -22,15 +22,17 @@ struct xfs_log_item; struct xfs_log_item_desc; struct xfs_mount; struct xfs_trans; +struct xfs_ail; +struct xfs_log_vec; void xfs_trans_add_item(struct xfs_trans *, struct xfs_log_item *); void xfs_trans_del_item(struct xfs_log_item *); void xfs_trans_free_items(struct xfs_trans *tp, xfs_lsn_t commit_lsn, int flags); -void xfs_trans_item_committed(struct xfs_log_item *lip, - xfs_lsn_t commit_lsn, int aborted); void xfs_trans_unreserve_and_mod_sb(struct xfs_trans *tp); +void xfs_trans_committed_bulk(struct xfs_ail *ailp, struct xfs_log_vec *lv, + xfs_lsn_t commit_lsn, int aborted); /* * AIL traversal cursor. * @@ -76,6 +78,10 @@ struct xfs_ail { void xfs_trans_ail_update(struct xfs_ail *ailp, struct xfs_log_item *lip, xfs_lsn_t lsn) __releases(ailp->xa_lock); +void xfs_trans_ail_update_bulk(struct xfs_ail *ailp, + struct xfs_log_item **log_items, + int nr_items, xfs_lsn_t lsn) + __releases(ailp->xa_lock); void xfs_trans_ail_delete(struct xfs_ail *ailp, struct xfs_log_item *lip) __releases(ailp->xa_lock); -- 1.7.2.3 From SRS0+f2mc+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:21 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7SK6i244774 for ; Tue, 21 Dec 2010 01:28:20 -0600 X-ASG-Debug-ID: 1292916616-39a701670000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CD5BE1470321 for ; Mon, 20 Dec 2010 23:30:16 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id u6mgSYrZOXX8y2jv for ; Mon, 20 Dec 2010 23:30:16 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51088111-1927428 for ; Tue, 21 Dec 2010 18:00:15 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfc-0001D7-Qi for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:04 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfH-0006ZI-GR for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:43 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 13/34] xfs: connect up buffer reclaim priority hooks Subject: [PATCH 13/34] xfs: connect up buffer reclaim priority hooks Date: Tue, 21 Dec 2010 18:29:09 +1100 Message-Id: <1292916570-25015-14-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1292916617 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50052 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Now that the buffer reclaim infrastructure can handle different reclaim priorities for different types of buffers, reconnect the hooks in the XFS code that has been sitting dormant since it was ported to Linux. This should finally give use reclaim prioritisation that is on a par with the functionality that Irix provided XFS 15 years ago. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_buf.h | 10 ++++++++-- fs/xfs/xfs_btree.c | 9 ++++----- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_trans.h | 2 +- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h index 4601eab..a76c242 100644 --- a/fs/xfs/linux-2.6/xfs_buf.h +++ b/fs/xfs/linux-2.6/xfs_buf.h @@ -336,9 +336,15 @@ void xfs_buf_stale(struct xfs_buf *bp); #define XFS_BUF_SIZE(bp) ((bp)->b_buffer_length) #define XFS_BUF_SET_SIZE(bp, cnt) ((bp)->b_buffer_length = (cnt)) -#define XFS_BUF_SET_VTYPE_REF(bp, type, ref) do { } while (0) +static inline void +xfs_buf_set_ref( + struct xfs_buf *bp, + int lru_ref) +{ + atomic_set(&bp->b_lru_ref, lru_ref); +} +#define XFS_BUF_SET_VTYPE_REF(bp, type, ref) xfs_buf_set_ref(bp, ref) #define XFS_BUF_SET_VTYPE(bp, type) do { } while (0) -#define XFS_BUF_SET_REF(bp, ref) do { } while (0) #define XFS_BUF_ISPINNED(bp) atomic_read(&((bp)->b_pin_count)) diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c index 04f9cca..2f9e97c 100644 --- a/fs/xfs/xfs_btree.c +++ b/fs/xfs/xfs_btree.c @@ -634,9 +634,8 @@ xfs_btree_read_bufl( return error; } ASSERT(!bp || !XFS_BUF_GETERROR(bp)); - if (bp != NULL) { + if (bp) XFS_BUF_SET_VTYPE_REF(bp, B_FS_MAP, refval); - } *bpp = bp; return 0; } @@ -944,13 +943,13 @@ xfs_btree_set_refs( switch (cur->bc_btnum) { case XFS_BTNUM_BNO: case XFS_BTNUM_CNT: - XFS_BUF_SET_VTYPE_REF(*bpp, B_FS_MAP, XFS_ALLOC_BTREE_REF); + XFS_BUF_SET_VTYPE_REF(bp, B_FS_MAP, XFS_ALLOC_BTREE_REF); break; case XFS_BTNUM_INO: - XFS_BUF_SET_VTYPE_REF(*bpp, B_FS_INOMAP, XFS_INO_BTREE_REF); + XFS_BUF_SET_VTYPE_REF(bp, B_FS_INOMAP, XFS_INO_BTREE_REF); break; case XFS_BTNUM_BMAP: - XFS_BUF_SET_VTYPE_REF(*bpp, B_FS_MAP, XFS_BMAP_BTREE_REF); + XFS_BUF_SET_VTYPE_REF(bp, B_FS_MAP, XFS_BMAP_BTREE_REF); break; default: ASSERT(0); diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 43ffd90..be7cf62 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -887,7 +887,7 @@ xfs_iread( * around for a while. This helps to keep recently accessed * meta-data in-core longer. */ - XFS_BUF_SET_REF(bp, XFS_INO_REF); + xfs_buf_set_ref(bp, XFS_INO_REF); /* * Use xfs_trans_brelse() to release the buffer containing the diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 246286b..c2042b7 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -294,8 +294,8 @@ struct xfs_log_item_desc { #define XFS_ALLOC_BTREE_REF 2 #define XFS_BMAP_BTREE_REF 2 #define XFS_DIR_BTREE_REF 2 +#define XFS_INO_REF 2 #define XFS_ATTR_BTREE_REF 1 -#define XFS_INO_REF 1 #define XFS_DQUOT_REF 1 #ifdef __KERNEL__ -- 1.7.2.3 From SRS0+K7iM+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7SLEm244790 for ; Tue, 21 Dec 2010 01:28:22 -0600 X-ASG-Debug-ID: 1292916617-337f01e50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 231E91CE33D1 for ; Mon, 20 Dec 2010 23:30:17 -0800 (PST) Received: from mail.internode.on.net (bld-mail20.adl6.internode.on.net [150.101.137.105]) by cuda.sgi.com with ESMTP id yaHmMUND84XgBqBj for ; Mon, 20 Dec 2010 23:30:17 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 5388616-1927428 for ; Tue, 21 Dec 2010 18:00:16 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfd-0001DS-9v for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:05 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfR-0006Zg-Ux for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:53 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 21/34] xfs: use AIL bulk update function to implement single updates Subject: [PATCH 21/34] xfs: use AIL bulk update function to implement single updates Date: Tue, 21 Dec 2010 18:29:17 +1100 Message-Id: <1292916570-25015-22-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail20.adl6.internode.on.net[150.101.137.105] X-Barracuda-Start-Time: 1292916619 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner We now have two copies of AIL insert operations that are mostly duplicate functionality. The single log item updates can be implemented via the bulk updates by turning xfs_trans_ail_update() into a simple wrapper. This removes all the duplicate insert functionality and associated helpers. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_log_recover.c | 2 +- fs/xfs/xfs_trans_ail.c | 88 ---------------------------------------------- fs/xfs/xfs_trans_priv.h | 19 ++++++---- 3 files changed, 13 insertions(+), 96 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index d7219e2..4abe7a9 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -2573,7 +2573,7 @@ xlog_recover_efi_pass2( /* * xfs_trans_ail_update() drops the AIL lock. */ - xfs_trans_ail_update(log->l_ailp, (xfs_log_item_t *)efip, lsn); + xfs_trans_ail_update(log->l_ailp, &efip->efi_item, lsn); return 0; } diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index 218f968..8481a5a 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -28,7 +28,6 @@ #include "xfs_trans_priv.h" #include "xfs_error.h" -STATIC void xfs_ail_insert(struct xfs_ail *, xfs_log_item_t *); STATIC void xfs_ail_splice(struct xfs_ail *, struct list_head *, xfs_lsn_t); STATIC void xfs_ail_delete(struct xfs_ail *, xfs_log_item_t *); STATIC xfs_log_item_t * xfs_ail_min(struct xfs_ail *); @@ -450,58 +449,6 @@ xfs_trans_unlocked_item( xfs_log_move_tail(ailp->xa_mount, 1); } /* xfs_trans_unlocked_item */ - -/* - * Update the position of the item in the AIL with the new - * lsn. If it is not yet in the AIL, add it. Otherwise, move - * it to its new position by removing it and re-adding it. - * - * Wakeup anyone with an lsn less than the item's lsn. If the item - * we move in the AIL is the minimum one, update the tail lsn in the - * log manager. - * - * This function must be called with the AIL lock held. The lock - * is dropped before returning. - */ -void -xfs_trans_ail_update( - struct xfs_ail *ailp, - xfs_log_item_t *lip, - xfs_lsn_t lsn) __releases(ailp->xa_lock) -{ - xfs_log_item_t *mlip; /* ptr to minimum lip */ - xfs_lsn_t tail_lsn; - - mlip = xfs_ail_min(ailp); - - if (lip->li_flags & XFS_LI_IN_AIL) { - xfs_ail_delete(ailp, lip); - } else { - lip->li_flags |= XFS_LI_IN_AIL; - } - - lip->li_lsn = lsn; - xfs_ail_insert(ailp, lip); - - if (mlip == lip) { - mlip = xfs_ail_min(ailp); - /* - * It is not safe to access mlip after the AIL lock is - * dropped, so we must get a copy of li_lsn before we do - * so. This is especially important on 32-bit platforms - * where accessing and updating 64-bit values like li_lsn - * is not atomic. - */ - tail_lsn = mlip->li_lsn; - spin_unlock(&ailp->xa_lock); - xfs_log_move_tail(ailp->xa_mount, tail_lsn); - } else { - spin_unlock(&ailp->xa_lock); - } - - -} /* xfs_trans_update_ail */ - /* * xfs_trans_ail_update - bulk AIL insertion operation. * @@ -764,41 +711,6 @@ xfs_trans_ail_destroy( } /* - * Insert the given log item into the AIL. - * We almost always insert at the end of the list, so on inserts - * we search from the end of the list to find where the - * new item belongs. - */ -STATIC void -xfs_ail_insert( - struct xfs_ail *ailp, - xfs_log_item_t *lip) -{ - xfs_log_item_t *next_lip; - - /* - * If the list is empty, just insert the item. - */ - if (list_empty(&ailp->xa_ail)) { - list_add(&lip->li_ail, &ailp->xa_ail); - return; - } - - list_for_each_entry_reverse(next_lip, &ailp->xa_ail, li_ail) { - if (XFS_LSN_CMP(next_lip->li_lsn, lip->li_lsn) <= 0) - break; - } - - ASSERT(&next_lip->li_ail == &ailp->xa_ail || - XFS_LSN_CMP(next_lip->li_lsn, lip->li_lsn) <= 0); - - list_add(&lip->li_ail, &next_lip->li_ail); - - xfs_ail_check(ailp, lip); - return; -} - -/* * splice the log item list into the AIL at the given LSN. */ STATIC void diff --git a/fs/xfs/xfs_trans_priv.h b/fs/xfs/xfs_trans_priv.h index 246ca4d..f469205 100644 --- a/fs/xfs/xfs_trans_priv.h +++ b/fs/xfs/xfs_trans_priv.h @@ -75,13 +75,18 @@ struct xfs_ail { /* * From xfs_trans_ail.c */ -void xfs_trans_ail_update(struct xfs_ail *ailp, - struct xfs_log_item *lip, xfs_lsn_t lsn) - __releases(ailp->xa_lock); -void xfs_trans_ail_update_bulk(struct xfs_ail *ailp, - struct xfs_log_item **log_items, - int nr_items, xfs_lsn_t lsn) - __releases(ailp->xa_lock); +void xfs_trans_ail_update_bulk(struct xfs_ail *ailp, + struct xfs_log_item **log_items, int nr_items, + xfs_lsn_t lsn) __releases(ailp->xa_lock); +static inline void +xfs_trans_ail_update( + struct xfs_ail *ailp, + struct xfs_log_item *lip, + xfs_lsn_t lsn) __releases(ailp->xa_lock) +{ + xfs_trans_ail_update_bulk(ailp, &lip, 1, lsn); +} + void xfs_trans_ail_delete(struct xfs_ail *ailp, struct xfs_log_item *lip) __releases(ailp->xa_lock); -- 1.7.2.3 From SRS0+f2mc+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:21 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7SL6R244786 for ; Tue, 21 Dec 2010 01:28:21 -0600 X-ASG-Debug-ID: 1292916617-25d203910000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id AE63621202B for ; Mon, 20 Dec 2010 23:30:17 -0800 (PST) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id hymCAFgU18PH7Hhu for ; Mon, 20 Dec 2010 23:30:17 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 39223389-1927428 for ; Tue, 21 Dec 2010 18:00:16 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfd-0001DW-D6 for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:05 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfS-0006Zi-0l for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:54 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 22/34] xfs: use AIL bulk delete function to implement single delete Subject: [PATCH 22/34] xfs: use AIL bulk delete function to implement single delete Date: Tue, 21 Dec 2010 18:29:18 +1100 Message-Id: <1292916570-25015-23-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1292916618 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner We now have two copies of AIL delete operations that are mostly duplicate functionality. The single log item deletes can be implemented via the bulk updates by turning xfs_trans_ail_delete() into a simple wrapper. This removes all the duplicate delete functionality and associated helpers. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_trans_ail.c | 65 ----------------------------------------------- fs/xfs/xfs_trans_priv.h | 18 ++++++++----- 2 files changed, 11 insertions(+), 72 deletions(-) diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index 8481a5a..c5bbbc4 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -523,70 +523,6 @@ xfs_trans_ail_update_bulk( } /* - * Delete the given item from the AIL. It must already be in - * the AIL. - * - * Wakeup anyone with an lsn less than item's lsn. If the item - * we delete in the AIL is the minimum one, update the tail lsn in the - * log manager. - * - * Clear the IN_AIL flag from the item, reset its lsn to 0, and - * bump the AIL's generation count to indicate that the tree - * has changed. - * - * This function must be called with the AIL lock held. The lock - * is dropped before returning. - */ -void -xfs_trans_ail_delete( - struct xfs_ail *ailp, - xfs_log_item_t *lip) __releases(ailp->xa_lock) -{ - xfs_log_item_t *mlip; - xfs_lsn_t tail_lsn; - - if (lip->li_flags & XFS_LI_IN_AIL) { - mlip = xfs_ail_min(ailp); - xfs_ail_delete(ailp, lip); - - - lip->li_flags &= ~XFS_LI_IN_AIL; - lip->li_lsn = 0; - - if (mlip == lip) { - mlip = xfs_ail_min(ailp); - /* - * It is not safe to access mlip after the AIL lock - * is dropped, so we must get a copy of li_lsn - * before we do so. This is especially important - * on 32-bit platforms where accessing and updating - * 64-bit values like li_lsn is not atomic. - */ - tail_lsn = mlip ? mlip->li_lsn : 0; - spin_unlock(&ailp->xa_lock); - xfs_log_move_tail(ailp->xa_mount, tail_lsn); - } else { - spin_unlock(&ailp->xa_lock); - } - } - else { - /* - * If the file system is not being shutdown, we are in - * serious trouble if we get to this stage. - */ - struct xfs_mount *mp = ailp->xa_mount; - - spin_unlock(&ailp->xa_lock); - if (!XFS_FORCED_SHUTDOWN(mp)) { - xfs_cmn_err(XFS_PTAG_AILDELETE, CE_ALERT, mp, - "%s: attempting to delete a log item that is not in the AIL", - __func__); - xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); - } - } -} - -/* * xfs_trans_ail_delete_bulk - remove multiple log items from the AIL * * @xfs_trans_ail_delete_bulk takes an array of log items that all need to @@ -660,7 +596,6 @@ xfs_trans_ail_delete_bulk( xfs_log_move_tail(ailp->xa_mount, tail_lsn); } - /* * The active item list (AIL) is a doubly linked list of log * items sorted by ascending lsn. The base of the list is diff --git a/fs/xfs/xfs_trans_priv.h b/fs/xfs/xfs_trans_priv.h index f469205..35162c2 100644 --- a/fs/xfs/xfs_trans_priv.h +++ b/fs/xfs/xfs_trans_priv.h @@ -87,13 +87,17 @@ xfs_trans_ail_update( xfs_trans_ail_update_bulk(ailp, &lip, 1, lsn); } -void xfs_trans_ail_delete(struct xfs_ail *ailp, - struct xfs_log_item *lip) - __releases(ailp->xa_lock); -void xfs_trans_ail_delete_bulk(struct xfs_ail *ailp, - struct xfs_log_item **log_items, - int nr_items) - __releases(ailp->xa_lock); +void xfs_trans_ail_delete_bulk(struct xfs_ail *ailp, + struct xfs_log_item **log_items, int nr_items) + __releases(ailp->xa_lock); +static inline void +xfs_trans_ail_delete( + struct xfs_ail *ailp, + xfs_log_item_t *lip) __releases(ailp->xa_lock) +{ + xfs_trans_ail_delete_bulk(ailp, &lip, 1); +} + void xfs_trans_ail_push(struct xfs_ail *, xfs_lsn_t); void xfs_trans_unlocked_item(struct xfs_ail *, xfs_log_item_t *); -- 1.7.2.3 From SRS0++ukE+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_TICKET autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7SMhC244804 for ; Tue, 21 Dec 2010 01:28:22 -0600 X-ASG-Debug-ID: 1292916617-218c03da0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8337221202B for ; Mon, 20 Dec 2010 23:30:18 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id yZq6tYkBMFaR2Zuk for ; Mon, 20 Dec 2010 23:30:18 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50071198-1927428 for ; Tue, 21 Dec 2010 18:00:17 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfn-0001Ds-G6 for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:15 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfS-0006Zm-3V for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:54 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 23/34] xfs: convert log grant ticket queues to list heads Subject: [PATCH 23/34] xfs: convert log grant ticket queues to list heads Date: Tue, 21 Dec 2010 18:29:19 +1100 Message-Id: <1292916570-25015-24-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1292916619 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The grant write and reserve queues use a roll-your-own double linked list, so convert it to a standard list_head structure and convert all the list traversals to use list_for_each_entry(). We can also get rid of the XLOG_TIC_IN_Q flag as we can use the list_empty() check to tell if the ticket is in a list or not. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_trace.h | 16 +++--- fs/xfs/xfs_log.c | 123 ++++++++++++++---------------------------- fs/xfs/xfs_log_priv.h | 11 ++--- 3 files changed, 53 insertions(+), 97 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index 83e8760..69b9e1f 100644 --- a/fs/xfs/linux-2.6/xfs_trace.h +++ b/fs/xfs/linux-2.6/xfs_trace.h @@ -766,8 +766,8 @@ DECLARE_EVENT_CLASS(xfs_loggrant_class, __field(int, curr_res) __field(int, unit_res) __field(unsigned int, flags) - __field(void *, reserve_headq) - __field(void *, write_headq) + __field(int, reserveq) + __field(int, writeq) __field(int, grant_reserve_cycle) __field(int, grant_reserve_bytes) __field(int, grant_write_cycle) @@ -784,8 +784,8 @@ DECLARE_EVENT_CLASS(xfs_loggrant_class, __entry->curr_res = tic->t_curr_res; __entry->unit_res = tic->t_unit_res; __entry->flags = tic->t_flags; - __entry->reserve_headq = log->l_reserve_headq; - __entry->write_headq = log->l_write_headq; + __entry->reserveq = list_empty(&log->l_reserveq); + __entry->writeq = list_empty(&log->l_writeq); __entry->grant_reserve_cycle = log->l_grant_reserve_cycle; __entry->grant_reserve_bytes = log->l_grant_reserve_bytes; __entry->grant_write_cycle = log->l_grant_write_cycle; @@ -795,8 +795,8 @@ DECLARE_EVENT_CLASS(xfs_loggrant_class, __entry->tail_lsn = log->l_tail_lsn; ), TP_printk("dev %d:%d type %s t_ocnt %u t_cnt %u t_curr_res %u " - "t_unit_res %u t_flags %s reserve_headq 0x%p " - "write_headq 0x%p grant_reserve_cycle %d " + "t_unit_res %u t_flags %s reserveq %s " + "writeq %s grant_reserve_cycle %d " "grant_reserve_bytes %d grant_write_cycle %d " "grant_write_bytes %d curr_cycle %d curr_block %d " "tail_cycle %d tail_block %d", @@ -807,8 +807,8 @@ DECLARE_EVENT_CLASS(xfs_loggrant_class, __entry->curr_res, __entry->unit_res, __print_flags(__entry->flags, "|", XLOG_TIC_FLAGS), - __entry->reserve_headq, - __entry->write_headq, + __entry->reserveq ? "empty" : "active", + __entry->writeq ? "empty" : "active", __entry->grant_reserve_cycle, __entry->grant_reserve_bytes, __entry->grant_write_cycle, diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index cee4ab9..1b82735 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -95,38 +95,6 @@ STATIC void xlog_verify_tail_lsn(xlog_t *log, xlog_in_core_t *iclog, STATIC int xlog_iclogs_empty(xlog_t *log); - -static void -xlog_ins_ticketq(struct xlog_ticket **qp, struct xlog_ticket *tic) -{ - if (*qp) { - tic->t_next = (*qp); - tic->t_prev = (*qp)->t_prev; - (*qp)->t_prev->t_next = tic; - (*qp)->t_prev = tic; - } else { - tic->t_prev = tic->t_next = tic; - *qp = tic; - } - - tic->t_flags |= XLOG_TIC_IN_Q; -} - -static void -xlog_del_ticketq(struct xlog_ticket **qp, struct xlog_ticket *tic) -{ - if (tic == tic->t_next) { - *qp = NULL; - } else { - *qp = tic->t_next; - tic->t_next->t_prev = tic->t_prev; - tic->t_prev->t_next = tic->t_next; - } - - tic->t_next = tic->t_prev = NULL; - tic->t_flags &= ~XLOG_TIC_IN_Q; -} - static void xlog_grant_sub_space(struct log *log, int bytes) { @@ -724,7 +692,7 @@ xfs_log_move_tail(xfs_mount_t *mp, log->l_tail_lsn = tail_lsn; } - if ((tic = log->l_write_headq)) { + if (!list_empty(&log->l_writeq)) { #ifdef DEBUG if (log->l_flags & XLOG_ACTIVE_RECOVERY) panic("Recovery problem"); @@ -732,7 +700,7 @@ xfs_log_move_tail(xfs_mount_t *mp, cycle = log->l_grant_write_cycle; bytes = log->l_grant_write_bytes; free_bytes = xlog_space_left(log, cycle, bytes); - do { + list_for_each_entry(tic, &log->l_writeq, t_queue) { ASSERT(tic->t_flags & XLOG_TIC_PERM_RESERV); if (free_bytes < tic->t_unit_res && tail_lsn != 1) @@ -740,10 +708,10 @@ xfs_log_move_tail(xfs_mount_t *mp, tail_lsn = 0; free_bytes -= tic->t_unit_res; sv_signal(&tic->t_wait); - tic = tic->t_next; - } while (tic != log->l_write_headq); + } } - if ((tic = log->l_reserve_headq)) { + + if (!list_empty(&log->l_reserveq)) { #ifdef DEBUG if (log->l_flags & XLOG_ACTIVE_RECOVERY) panic("Recovery problem"); @@ -751,7 +719,7 @@ xfs_log_move_tail(xfs_mount_t *mp, cycle = log->l_grant_reserve_cycle; bytes = log->l_grant_reserve_bytes; free_bytes = xlog_space_left(log, cycle, bytes); - do { + list_for_each_entry(tic, &log->l_reserveq, t_queue) { if (tic->t_flags & XLOG_TIC_PERM_RESERV) need_bytes = tic->t_unit_res*tic->t_cnt; else @@ -761,8 +729,7 @@ xfs_log_move_tail(xfs_mount_t *mp, tail_lsn = 0; free_bytes -= need_bytes; sv_signal(&tic->t_wait); - tic = tic->t_next; - } while (tic != log->l_reserve_headq); + } } spin_unlock(&log->l_grant_lock); } /* xfs_log_move_tail */ @@ -1053,6 +1020,8 @@ xlog_alloc_log(xfs_mount_t *mp, log->l_curr_cycle = 1; /* 0 is bad since this is initial value */ log->l_grant_reserve_cycle = 1; log->l_grant_write_cycle = 1; + INIT_LIST_HEAD(&log->l_reserveq); + INIT_LIST_HEAD(&log->l_writeq); error = EFSCORRUPTED; if (xfs_sb_version_hassector(&mp->m_sb)) { @@ -2550,8 +2519,8 @@ xlog_grant_log_space(xlog_t *log, trace_xfs_log_grant_enter(log, tic); /* something is already sleeping; insert new transaction at end */ - if (log->l_reserve_headq) { - xlog_ins_ticketq(&log->l_reserve_headq, tic); + if (!list_empty(&log->l_reserveq)) { + list_add_tail(&tic->t_queue, &log->l_reserveq); trace_xfs_log_grant_sleep1(log, tic); @@ -2583,8 +2552,8 @@ redo: free_bytes = xlog_space_left(log, log->l_grant_reserve_cycle, log->l_grant_reserve_bytes); if (free_bytes < need_bytes) { - if ((tic->t_flags & XLOG_TIC_IN_Q) == 0) - xlog_ins_ticketq(&log->l_reserve_headq, tic); + if (list_empty(&tic->t_queue)) + list_add_tail(&tic->t_queue, &log->l_reserveq); trace_xfs_log_grant_sleep2(log, tic); @@ -2602,8 +2571,9 @@ redo: trace_xfs_log_grant_wake2(log, tic); goto redo; - } else if (tic->t_flags & XLOG_TIC_IN_Q) - xlog_del_ticketq(&log->l_reserve_headq, tic); + } + + list_del_init(&tic->t_queue); /* we've got enough space */ xlog_grant_add_space(log, need_bytes); @@ -2626,9 +2596,7 @@ redo: return 0; error_return: - if (tic->t_flags & XLOG_TIC_IN_Q) - xlog_del_ticketq(&log->l_reserve_headq, tic); - + list_del_init(&tic->t_queue); trace_xfs_log_grant_error(log, tic); /* @@ -2653,7 +2621,6 @@ xlog_regrant_write_log_space(xlog_t *log, xlog_ticket_t *tic) { int free_bytes, need_bytes; - xlog_ticket_t *ntic; #ifdef DEBUG xfs_lsn_t tail_lsn; #endif @@ -2683,22 +2650,23 @@ xlog_regrant_write_log_space(xlog_t *log, * this transaction. */ need_bytes = tic->t_unit_res; - if ((ntic = log->l_write_headq)) { + if (!list_empty(&log->l_writeq)) { + struct xlog_ticket *ntic; free_bytes = xlog_space_left(log, log->l_grant_write_cycle, log->l_grant_write_bytes); - do { + list_for_each_entry(ntic, &log->l_writeq, t_queue) { ASSERT(ntic->t_flags & XLOG_TIC_PERM_RESERV); if (free_bytes < ntic->t_unit_res) break; free_bytes -= ntic->t_unit_res; sv_signal(&ntic->t_wait); - ntic = ntic->t_next; - } while (ntic != log->l_write_headq); + } - if (ntic != log->l_write_headq) { - if ((tic->t_flags & XLOG_TIC_IN_Q) == 0) - xlog_ins_ticketq(&log->l_write_headq, tic); + if (ntic != list_first_entry(&log->l_writeq, + struct xlog_ticket, t_queue)) { + if (list_empty(&tic->t_queue)) + list_add_tail(&tic->t_queue, &log->l_writeq); trace_xfs_log_regrant_write_sleep1(log, tic); @@ -2727,8 +2695,8 @@ redo: free_bytes = xlog_space_left(log, log->l_grant_write_cycle, log->l_grant_write_bytes); if (free_bytes < need_bytes) { - if ((tic->t_flags & XLOG_TIC_IN_Q) == 0) - xlog_ins_ticketq(&log->l_write_headq, tic); + if (list_empty(&tic->t_queue)) + list_add_tail(&tic->t_queue, &log->l_writeq); spin_unlock(&log->l_grant_lock); xlog_grant_push_ail(log->l_mp, need_bytes); spin_lock(&log->l_grant_lock); @@ -2745,8 +2713,9 @@ redo: trace_xfs_log_regrant_write_wake2(log, tic); goto redo; - } else if (tic->t_flags & XLOG_TIC_IN_Q) - xlog_del_ticketq(&log->l_write_headq, tic); + } + + list_del_init(&tic->t_queue); /* we've got enough space */ xlog_grant_add_space_write(log, need_bytes); @@ -2766,9 +2735,7 @@ redo: error_return: - if (tic->t_flags & XLOG_TIC_IN_Q) - xlog_del_ticketq(&log->l_reserve_headq, tic); - + list_del_init(&tic->t_queue); trace_xfs_log_regrant_write_error(log, tic); /* @@ -3435,6 +3402,7 @@ xlog_ticket_alloc( } atomic_set(&tic->t_ref, 1); + INIT_LIST_HEAD(&tic->t_queue); tic->t_unit_res = unit_bytes; tic->t_curr_res = unit_bytes; tic->t_cnt = cnt; @@ -3742,26 +3710,17 @@ xfs_log_force_umount( spin_unlock(&log->l_icloglock); /* - * We don't want anybody waiting for log reservations - * after this. That means we have to wake up everybody - * queued up on reserve_headq as well as write_headq. - * In addition, we make sure in xlog_{re}grant_log_space - * that we don't enqueue anything once the SHUTDOWN flag - * is set, and this action is protected by the GRANTLOCK. + * We don't want anybody waiting for log reservations after this. That + * means we have to wake up everybody queued up on reserveq as well as + * writeq. In addition, we make sure in xlog_{re}grant_log_space that + * we don't enqueue anything once the SHUTDOWN flag is set, and this + * action is protected by the GRANTLOCK. */ - if ((tic = log->l_reserve_headq)) { - do { - sv_signal(&tic->t_wait); - tic = tic->t_next; - } while (tic != log->l_reserve_headq); - } + list_for_each_entry(tic, &log->l_reserveq, t_queue) + sv_signal(&tic->t_wait); - if ((tic = log->l_write_headq)) { - do { - sv_signal(&tic->t_wait); - tic = tic->t_next; - } while (tic != log->l_write_headq); - } + list_for_each_entry(tic, &log->l_writeq, t_queue) + sv_signal(&tic->t_wait); spin_unlock(&log->l_grant_lock); if (!(log->l_iclog->ic_state & XLOG_STATE_IOERROR)) { diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index c1ce505..a5b3c02 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -132,12 +132,10 @@ static inline uint xlog_get_client_id(__be32 i) */ #define XLOG_TIC_INITED 0x1 /* has been initialized */ #define XLOG_TIC_PERM_RESERV 0x2 /* permanent reservation */ -#define XLOG_TIC_IN_Q 0x4 #define XLOG_TIC_FLAGS \ { XLOG_TIC_INITED, "XLOG_TIC_INITED" }, \ - { XLOG_TIC_PERM_RESERV, "XLOG_TIC_PERM_RESERV" }, \ - { XLOG_TIC_IN_Q, "XLOG_TIC_IN_Q" } + { XLOG_TIC_PERM_RESERV, "XLOG_TIC_PERM_RESERV" } #endif /* __KERNEL__ */ @@ -244,8 +242,7 @@ typedef struct xlog_res { typedef struct xlog_ticket { sv_t t_wait; /* ticket wait queue : 20 */ - struct xlog_ticket *t_next; /* :4|8 */ - struct xlog_ticket *t_prev; /* :4|8 */ + struct list_head t_queue; /* reserve/write queue */ xlog_tid_t t_tid; /* transaction identifier : 4 */ atomic_t t_ref; /* ticket reference count : 4 */ int t_curr_res; /* current reservation in bytes : 4 */ @@ -519,8 +516,8 @@ typedef struct log { /* The following block of fields are changed while holding grant_lock */ spinlock_t l_grant_lock ____cacheline_aligned_in_smp; - xlog_ticket_t *l_reserve_headq; - xlog_ticket_t *l_write_headq; + struct list_head l_reserveq; + struct list_head l_writeq; int l_grant_reserve_cycle; int l_grant_reserve_bytes; int l_grant_write_cycle; -- 1.7.2.3 From SRS0+f2mc+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:24 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_57 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7SNQt244816 for ; Tue, 21 Dec 2010 01:28:23 -0600 X-ASG-Debug-ID: 1292916618-2260031e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0F1481CE33D1 for ; Mon, 20 Dec 2010 23:30:18 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id nPEA6ynSHtdUWHXm for ; Mon, 20 Dec 2010 23:30:18 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50575233-1927428 for ; Tue, 21 Dec 2010 18:00:17 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfn-0001E2-OE for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:15 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfc-0006Zy-CR for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:04 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 27/34] xfs: use wait queues directly for the log wait queues Subject: [PATCH 27/34] xfs: use wait queues directly for the log wait queues Date: Tue, 21 Dec 2010 18:29:23 +1100 Message-Id: <1292916570-25015-28-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1292916620 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The log grant queues are one of the few places left using sv_t constructs for waiting. Given we are touching this code, we should convert them to plain wait queues. While there, convert all the other sv_t users in the log code as well. Seeing as this removes the last users of the sv_t type, remove the header file defining the wrapper and the fragments that still reference it. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/sv.h | 59 -------------------------------------- fs/xfs/linux-2.6/xfs_linux.h | 1 - fs/xfs/quota/xfs_dquot.c | 1 - fs/xfs/xfs_log.c | 64 ++++++++++++++++++----------------------- fs/xfs/xfs_log_cil.c | 8 ++-- fs/xfs/xfs_log_priv.h | 25 +++++++++++++--- 6 files changed, 52 insertions(+), 106 deletions(-) delete mode 100644 fs/xfs/linux-2.6/sv.h diff --git a/fs/xfs/linux-2.6/sv.h b/fs/xfs/linux-2.6/sv.h deleted file mode 100644 index 4dfc7c3..0000000 --- a/fs/xfs/linux-2.6/sv.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_SUPPORT_SV_H__ -#define __XFS_SUPPORT_SV_H__ - -#include -#include -#include - -/* - * Synchronisation variables. - * - * (Parameters "pri", "svf" and "rts" are not implemented) - */ - -typedef struct sv_s { - wait_queue_head_t waiters; -} sv_t; - -static inline void _sv_wait(sv_t *sv, spinlock_t *lock) -{ - DECLARE_WAITQUEUE(wait, current); - - add_wait_queue_exclusive(&sv->waiters, &wait); - __set_current_state(TASK_UNINTERRUPTIBLE); - spin_unlock(lock); - - schedule(); - - remove_wait_queue(&sv->waiters, &wait); -} - -#define sv_init(sv,flag,name) \ - init_waitqueue_head(&(sv)->waiters) -#define sv_destroy(sv) \ - /*NOTHING*/ -#define sv_wait(sv, pri, lock, s) \ - _sv_wait(sv, lock) -#define sv_signal(sv) \ - wake_up(&(sv)->waiters) -#define sv_broadcast(sv) \ - wake_up_all(&(sv)->waiters) - -#endif /* __XFS_SUPPORT_SV_H__ */ diff --git a/fs/xfs/linux-2.6/xfs_linux.h b/fs/xfs/linux-2.6/xfs_linux.h index 9fa4f2a..ccebd86 100644 --- a/fs/xfs/linux-2.6/xfs_linux.h +++ b/fs/xfs/linux-2.6/xfs_linux.h @@ -37,7 +37,6 @@ #include #include -#include #include #include diff --git a/fs/xfs/quota/xfs_dquot.c b/fs/xfs/quota/xfs_dquot.c index faf8e1a..d22aa31 100644 --- a/fs/xfs/quota/xfs_dquot.c +++ b/fs/xfs/quota/xfs_dquot.c @@ -149,7 +149,6 @@ xfs_qm_dqdestroy( ASSERT(list_empty(&dqp->q_freelist)); mutex_destroy(&dqp->q_qlock); - sv_destroy(&dqp->q_pinwait); kmem_zone_free(xfs_Gqm->qm_dqzone, dqp); atomic_dec(&xfs_Gqm->qm_totaldquots); diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 6bba8b4..cc0504e 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -547,8 +547,8 @@ xfs_log_unmount_write(xfs_mount_t *mp) if (!(iclog->ic_state == XLOG_STATE_ACTIVE || iclog->ic_state == XLOG_STATE_DIRTY)) { if (!XLOG_FORCED_SHUTDOWN(log)) { - sv_wait(&iclog->ic_force_wait, PMEM, - &log->l_icloglock, s); + xlog_wait(&iclog->ic_force_wait, + &log->l_icloglock); } else { spin_unlock(&log->l_icloglock); } @@ -588,8 +588,8 @@ xfs_log_unmount_write(xfs_mount_t *mp) || iclog->ic_state == XLOG_STATE_DIRTY || iclog->ic_state == XLOG_STATE_IOERROR) ) { - sv_wait(&iclog->ic_force_wait, PMEM, - &log->l_icloglock, s); + xlog_wait(&iclog->ic_force_wait, + &log->l_icloglock); } else { spin_unlock(&log->l_icloglock); } @@ -700,7 +700,7 @@ xfs_log_move_tail(xfs_mount_t *mp, break; tail_lsn = 0; free_bytes -= tic->t_unit_res; - sv_signal(&tic->t_wait); + wake_up(&tic->t_wait); } } @@ -719,7 +719,7 @@ xfs_log_move_tail(xfs_mount_t *mp, break; tail_lsn = 0; free_bytes -= need_bytes; - sv_signal(&tic->t_wait); + wake_up(&tic->t_wait); } } spin_unlock(&log->l_grant_lock); @@ -1060,7 +1060,7 @@ xlog_alloc_log(xfs_mount_t *mp, spin_lock_init(&log->l_icloglock); spin_lock_init(&log->l_grant_lock); - sv_init(&log->l_flush_wait, 0, "flush_wait"); + init_waitqueue_head(&log->l_flush_wait); /* log record size must be multiple of BBSIZE; see xlog_rec_header_t */ ASSERT((XFS_BUF_SIZE(bp) & BBMASK) == 0); @@ -1116,8 +1116,8 @@ xlog_alloc_log(xfs_mount_t *mp, ASSERT(XFS_BUF_ISBUSY(iclog->ic_bp)); ASSERT(XFS_BUF_VALUSEMA(iclog->ic_bp) <= 0); - sv_init(&iclog->ic_force_wait, SV_DEFAULT, "iclog-force"); - sv_init(&iclog->ic_write_wait, SV_DEFAULT, "iclog-write"); + init_waitqueue_head(&iclog->ic_force_wait); + init_waitqueue_head(&iclog->ic_write_wait); iclogp = &iclog->ic_next; } @@ -1132,11 +1132,8 @@ xlog_alloc_log(xfs_mount_t *mp, out_free_iclog: for (iclog = log->l_iclog; iclog; iclog = prev_iclog) { prev_iclog = iclog->ic_next; - if (iclog->ic_bp) { - sv_destroy(&iclog->ic_force_wait); - sv_destroy(&iclog->ic_write_wait); + if (iclog->ic_bp) xfs_buf_free(iclog->ic_bp); - } kmem_free(iclog); } spinlock_destroy(&log->l_icloglock); @@ -1453,8 +1450,6 @@ xlog_dealloc_log(xlog_t *log) iclog = log->l_iclog; for (i=0; il_iclog_bufs; i++) { - sv_destroy(&iclog->ic_force_wait); - sv_destroy(&iclog->ic_write_wait); xfs_buf_free(iclog->ic_bp); next_iclog = iclog->ic_next; kmem_free(iclog); @@ -2261,7 +2256,7 @@ xlog_state_do_callback( xlog_state_clean_log(log); /* wake up threads waiting in xfs_log_force() */ - sv_broadcast(&iclog->ic_force_wait); + wake_up_all(&iclog->ic_force_wait); iclog = iclog->ic_next; } while (first_iclog != iclog); @@ -2308,7 +2303,7 @@ xlog_state_do_callback( spin_unlock(&log->l_icloglock); if (wake) - sv_broadcast(&log->l_flush_wait); + wake_up_all(&log->l_flush_wait); } @@ -2359,7 +2354,7 @@ xlog_state_done_syncing( * iclog buffer, we wake them all, one will get to do the * I/O, the others get to wait for the result. */ - sv_broadcast(&iclog->ic_write_wait); + wake_up_all(&iclog->ic_write_wait); spin_unlock(&log->l_icloglock); xlog_state_do_callback(log, aborted, iclog); /* also cleans log */ } /* xlog_state_done_syncing */ @@ -2408,7 +2403,7 @@ restart: XFS_STATS_INC(xs_log_noiclogs); /* Wait for log writes to have flushed */ - sv_wait(&log->l_flush_wait, 0, &log->l_icloglock, 0); + xlog_wait(&log->l_flush_wait, &log->l_icloglock); goto restart; } @@ -2523,7 +2518,8 @@ xlog_grant_log_space(xlog_t *log, goto error_return; XFS_STATS_INC(xs_sleep_logspace); - sv_wait(&tic->t_wait, PINOD|PLTWAIT, &log->l_grant_lock, s); + xlog_wait(&tic->t_wait, &log->l_grant_lock); + /* * If we got an error, and the filesystem is shutting down, * we'll catch it down below. So just continue... @@ -2552,7 +2548,7 @@ redo: spin_lock(&log->l_grant_lock); XFS_STATS_INC(xs_sleep_logspace); - sv_wait(&tic->t_wait, PINOD|PLTWAIT, &log->l_grant_lock, s); + xlog_wait(&tic->t_wait, &log->l_grant_lock); spin_lock(&log->l_grant_lock); if (XLOG_FORCED_SHUTDOWN(log)) @@ -2635,7 +2631,7 @@ xlog_regrant_write_log_space(xlog_t *log, if (free_bytes < ntic->t_unit_res) break; free_bytes -= ntic->t_unit_res; - sv_signal(&ntic->t_wait); + wake_up(&ntic->t_wait); } if (ntic != list_first_entry(&log->l_writeq, @@ -2650,8 +2646,7 @@ xlog_regrant_write_log_space(xlog_t *log, spin_lock(&log->l_grant_lock); XFS_STATS_INC(xs_sleep_logspace); - sv_wait(&tic->t_wait, PINOD|PLTWAIT, - &log->l_grant_lock, s); + xlog_wait(&tic->t_wait, &log->l_grant_lock); /* If we're shutting down, this tic is already * off the queue */ @@ -2677,8 +2672,7 @@ redo: XFS_STATS_INC(xs_sleep_logspace); trace_xfs_log_regrant_write_sleep2(log, tic); - - sv_wait(&tic->t_wait, PINOD|PLTWAIT, &log->l_grant_lock, s); + xlog_wait(&tic->t_wait, &log->l_grant_lock); /* If we're shutting down, this tic is already off the queue */ spin_lock(&log->l_grant_lock); @@ -3029,7 +3023,7 @@ maybe_sleep: return XFS_ERROR(EIO); } XFS_STATS_INC(xs_log_force_sleep); - sv_wait(&iclog->ic_force_wait, PINOD, &log->l_icloglock, s); + xlog_wait(&iclog->ic_force_wait, &log->l_icloglock); /* * No need to grab the log lock here since we're * only deciding whether or not to return EIO @@ -3147,8 +3141,8 @@ try_again: XFS_STATS_INC(xs_log_force_sleep); - sv_wait(&iclog->ic_prev->ic_write_wait, - PSWP, &log->l_icloglock, s); + xlog_wait(&iclog->ic_prev->ic_write_wait, + &log->l_icloglock); if (log_flushed) *log_flushed = 1; already_slept = 1; @@ -3176,7 +3170,7 @@ try_again: return XFS_ERROR(EIO); } XFS_STATS_INC(xs_log_force_sleep); - sv_wait(&iclog->ic_force_wait, PSWP, &log->l_icloglock, s); + xlog_wait(&iclog->ic_force_wait, &log->l_icloglock); /* * No need to grab the log lock here since we're * only deciding whether or not to return EIO @@ -3251,10 +3245,8 @@ xfs_log_ticket_put( xlog_ticket_t *ticket) { ASSERT(atomic_read(&ticket->t_ref) > 0); - if (atomic_dec_and_test(&ticket->t_ref)) { - sv_destroy(&ticket->t_wait); + if (atomic_dec_and_test(&ticket->t_ref)) kmem_zone_free(xfs_log_ticket_zone, ticket); - } } xlog_ticket_t * @@ -3387,7 +3379,7 @@ xlog_ticket_alloc( tic->t_trans_type = 0; if (xflags & XFS_LOG_PERM_RESERV) tic->t_flags |= XLOG_TIC_PERM_RESERV; - sv_init(&tic->t_wait, SV_DEFAULT, "logtick"); + init_waitqueue_head(&tic->t_wait); xlog_tic_reset_res(tic); @@ -3719,10 +3711,10 @@ xfs_log_force_umount( * action is protected by the GRANTLOCK. */ list_for_each_entry(tic, &log->l_reserveq, t_queue) - sv_signal(&tic->t_wait); + wake_up(&tic->t_wait); list_for_each_entry(tic, &log->l_writeq, t_queue) - sv_signal(&tic->t_wait); + wake_up(&tic->t_wait); spin_unlock(&log->l_grant_lock); if (!(log->l_iclog->ic_state & XLOG_STATE_IOERROR)) { diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index f36f1a2..9dc8125 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -61,7 +61,7 @@ xlog_cil_init( INIT_LIST_HEAD(&cil->xc_committing); spin_lock_init(&cil->xc_cil_lock); init_rwsem(&cil->xc_ctx_lock); - sv_init(&cil->xc_commit_wait, SV_DEFAULT, "cilwait"); + init_waitqueue_head(&cil->xc_commit_wait); INIT_LIST_HEAD(&ctx->committing); INIT_LIST_HEAD(&ctx->busy_extents); @@ -563,7 +563,7 @@ restart: * It is still being pushed! Wait for the push to * complete, then start again from the beginning. */ - sv_wait(&cil->xc_commit_wait, 0, &cil->xc_cil_lock, 0); + xlog_wait(&cil->xc_commit_wait, &cil->xc_cil_lock); goto restart; } } @@ -587,7 +587,7 @@ restart: */ spin_lock(&cil->xc_cil_lock); ctx->commit_lsn = commit_lsn; - sv_broadcast(&cil->xc_commit_wait); + wake_up_all(&cil->xc_commit_wait); spin_unlock(&cil->xc_cil_lock); /* release the hounds! */ @@ -752,7 +752,7 @@ restart: * It is still being pushed! Wait for the push to * complete, then start again from the beginning. */ - sv_wait(&cil->xc_commit_wait, 0, &cil->xc_cil_lock, 0); + xlog_wait(&cil->xc_commit_wait, &cil->xc_cil_lock); goto restart; } if (ctx->sequence != sequence) diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index 2f74c80..e2bb276 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -241,7 +241,7 @@ typedef struct xlog_res { } xlog_res_t; typedef struct xlog_ticket { - sv_t t_wait; /* ticket wait queue : 20 */ + wait_queue_head_t t_wait; /* ticket wait queue */ struct list_head t_queue; /* reserve/write queue */ xlog_tid_t t_tid; /* transaction identifier : 4 */ atomic_t t_ref; /* ticket reference count : 4 */ @@ -349,8 +349,8 @@ typedef union xlog_in_core2 { * and move everything else out to subsequent cachelines. */ typedef struct xlog_in_core { - sv_t ic_force_wait; - sv_t ic_write_wait; + wait_queue_head_t ic_force_wait; + wait_queue_head_t ic_write_wait; struct xlog_in_core *ic_next; struct xlog_in_core *ic_prev; struct xfs_buf *ic_bp; @@ -417,7 +417,7 @@ struct xfs_cil { struct xfs_cil_ctx *xc_ctx; struct rw_semaphore xc_ctx_lock; struct list_head xc_committing; - sv_t xc_commit_wait; + wait_queue_head_t xc_commit_wait; xfs_lsn_t xc_current_sequence; }; @@ -499,7 +499,7 @@ typedef struct log { int l_logBBsize; /* size of log in BB chunks */ /* The following block of fields are changed while holding icloglock */ - sv_t l_flush_wait ____cacheline_aligned_in_smp; + wait_queue_head_t l_flush_wait ____cacheline_aligned_in_smp; /* waiting for iclog flush */ int l_covered_state;/* state of "covering disk * log entries" */ @@ -602,6 +602,21 @@ xlog_cil_force(struct log *log) */ #define XLOG_UNMOUNT_REC_TYPE (-1U) +/* + * Wrapper function for waiting on a wait queue serialised against wakeups + * by a spinlock. This matches the semantics of all the wait queues used in the + * log code. + */ +static inline void xlog_wait(wait_queue_head_t *wq, spinlock_t *lock) +{ + DECLARE_WAITQUEUE(wait, current); + + add_wait_queue_exclusive(wq, &wait); + __set_current_state(TASK_UNINTERRUPTIBLE); + spin_unlock(lock); + schedule(); + remove_wait_queue(wq, &wait); +} #endif /* __KERNEL__ */ #endif /* __XFS_LOG_PRIV_H__ */ -- 1.7.2.3 From SRS0+CBlE+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7SMq1244793 for ; Tue, 21 Dec 2010 01:28:22 -0600 X-ASG-Debug-ID: 1292916617-17c903b50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7AA271470326 for ; Mon, 20 Dec 2010 23:30:18 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id VnlKOKGMmlvwTnJG for ; Mon, 20 Dec 2010 23:30:18 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50434443-1927428 for ; Tue, 21 Dec 2010 18:00:17 +1030 (CDT) Received: from [192.168.1.1] (helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfn-0001Da-Dn for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:15 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfS-0006Zo-5D for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:54 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 24/34] xfs: fact out common grant head/log tail verification code Subject: [PATCH 24/34] xfs: fact out common grant head/log tail verification code Date: Tue, 21 Dec 2010 18:29:20 +1100 Message-Id: <1292916570-25015-25-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1292916619 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50052 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Factor repeated debug code out of grant head manipulation functions into a separate function. This removes ifdef DEBUG spagetti from the code and makes the code easier to follow. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_log.c | 51 ++++++++++++++++++++++----------------------------- 1 files changed, 22 insertions(+), 29 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 1b82735..99c6285 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -82,6 +82,7 @@ STATIC void xlog_ungrant_log_space(xlog_t *log, #if defined(DEBUG) STATIC void xlog_verify_dest_ptr(xlog_t *log, char *ptr); STATIC void xlog_verify_grant_head(xlog_t *log, int equals); +STATIC void xlog_verify_grant_tail(struct log *log); STATIC void xlog_verify_iclog(xlog_t *log, xlog_in_core_t *iclog, int count, boolean_t syncing); STATIC void xlog_verify_tail_lsn(xlog_t *log, xlog_in_core_t *iclog, @@ -89,6 +90,7 @@ STATIC void xlog_verify_tail_lsn(xlog_t *log, xlog_in_core_t *iclog, #else #define xlog_verify_dest_ptr(a,b) #define xlog_verify_grant_head(a,b) +#define xlog_verify_grant_tail(a) #define xlog_verify_iclog(a,b,c,d) #define xlog_verify_tail_lsn(a,b,c) #endif @@ -2503,10 +2505,6 @@ xlog_grant_log_space(xlog_t *log, { int free_bytes; int need_bytes; -#ifdef DEBUG - xfs_lsn_t tail_lsn; -#endif - #ifdef DEBUG if (log->l_flags & XLOG_ACTIVE_RECOVERY) @@ -2577,21 +2575,9 @@ redo: /* we've got enough space */ xlog_grant_add_space(log, need_bytes); -#ifdef DEBUG - tail_lsn = log->l_tail_lsn; - /* - * Check to make sure the grant write head didn't just over lap the - * tail. If the cycles are the same, we can't be overlapping. - * Otherwise, make sure that the cycles differ by exactly one and - * check the byte count. - */ - if (CYCLE_LSN(tail_lsn) != log->l_grant_write_cycle) { - ASSERT(log->l_grant_write_cycle-1 == CYCLE_LSN(tail_lsn)); - ASSERT(log->l_grant_write_bytes <= BBTOB(BLOCK_LSN(tail_lsn))); - } -#endif trace_xfs_log_grant_exit(log, tic); xlog_verify_grant_head(log, 1); + xlog_verify_grant_tail(log); spin_unlock(&log->l_grant_lock); return 0; @@ -2621,9 +2607,6 @@ xlog_regrant_write_log_space(xlog_t *log, xlog_ticket_t *tic) { int free_bytes, need_bytes; -#ifdef DEBUG - xfs_lsn_t tail_lsn; -#endif tic->t_curr_res = tic->t_unit_res; xlog_tic_reset_res(tic); @@ -2719,17 +2702,9 @@ redo: /* we've got enough space */ xlog_grant_add_space_write(log, need_bytes); -#ifdef DEBUG - tail_lsn = log->l_tail_lsn; - if (CYCLE_LSN(tail_lsn) != log->l_grant_write_cycle) { - ASSERT(log->l_grant_write_cycle-1 == CYCLE_LSN(tail_lsn)); - ASSERT(log->l_grant_write_bytes <= BBTOB(BLOCK_LSN(tail_lsn))); - } -#endif - trace_xfs_log_regrant_write_exit(log, tic); - xlog_verify_grant_head(log, 1); + xlog_verify_grant_tail(log); spin_unlock(&log->l_grant_lock); return 0; @@ -3465,6 +3440,24 @@ xlog_verify_grant_head(xlog_t *log, int equals) } } /* xlog_verify_grant_head */ +STATIC void +xlog_verify_grant_tail( + struct log *log) +{ + xfs_lsn_t tail_lsn = log->l_tail_lsn; + + /* + * Check to make sure the grant write head didn't just over lap the + * tail. If the cycles are the same, we can't be overlapping. + * Otherwise, make sure that the cycles differ by exactly one and + * check the byte count. + */ + if (CYCLE_LSN(tail_lsn) != log->l_grant_write_cycle) { + ASSERT(log->l_grant_write_cycle - 1 == CYCLE_LSN(tail_lsn)); + ASSERT(log->l_grant_write_bytes <= BBTOB(BLOCK_LSN(tail_lsn))); + } +} + /* check if it will fit */ STATIC void xlog_verify_tail_lsn(xlog_t *log, -- 1.7.2.3 From SRS0+K7iM+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_61 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7SVct244895 for ; Tue, 21 Dec 2010 01:28:32 -0600 X-ASG-Debug-ID: 1292916627-362902330000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 40209212031 for ; Mon, 20 Dec 2010 23:30:27 -0800 (PST) Received: from mail.internode.on.net (bld-mail20.adl6.internode.on.net [150.101.137.105]) by cuda.sgi.com with ESMTP id 6R9kk4J9kkPdL7U4 for ; Mon, 20 Dec 2010 23:30:27 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 5388621-1927428 for ; Tue, 21 Dec 2010 18:00:26 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfd-0001DQ-86 for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:05 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfR-0006Zd-TM for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:53 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 20/34] xfs: remove all the inodes on a buffer from the AIL in bulk Subject: [PATCH 20/34] xfs: remove all the inodes on a buffer from the AIL in bulk Date: Tue, 21 Dec 2010 18:29:16 +1100 Message-Id: <1292916570-25015-21-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail20.adl6.internode.on.net[150.101.137.105] X-Barracuda-Start-Time: 1292916629 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner When inode buffer IO completes, usually all of the inodes are removed from the AIL. This involves processing them one at a time and taking the AIL lock once for every inode. When all CPUs are processing inode IO completions, this causes excessive amount sof contention on the AIL lock. Instead, change the way we process inode IO completion in the buffer IO done callback. Allow the inode IO done callback to walk the list of IO done callbacks and pull all the inodes off the buffer in one go and then process them as a batch. Once all the inodes for removal are collected, take the AIL lock once and do a bulk removal operation to minimise traffic on the AIL lock. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_inode_item.c | 92 ++++++++++++++++++++++++++++++++++++++--------- fs/xfs/xfs_trans_ail.c | 73 +++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_trans_priv.h | 4 ++ 3 files changed, 152 insertions(+), 17 deletions(-) diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 7c8d30c..fd4f398 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -842,15 +842,64 @@ xfs_inode_item_destroy( * flushed to disk. It is responsible for removing the inode item * from the AIL if it has not been re-logged, and unlocking the inode's * flush lock. + * + * To reduce AIL lock traffic as much as possible, we scan the buffer log item + * list for other inodes that will run this function. We remove them from the + * buffer list so we can process all the inode IO completions in one AIL lock + * traversal. */ void xfs_iflush_done( struct xfs_buf *bp, struct xfs_log_item *lip) { - struct xfs_inode_log_item *iip = INODE_ITEM(lip); - xfs_inode_t *ip = iip->ili_inode; + struct xfs_inode_log_item *iip; + struct xfs_log_item *blip; + struct xfs_log_item *next; + struct xfs_log_item *prev; struct xfs_ail *ailp = lip->li_ailp; + int need_ail = 0; + + /* + * Scan the buffer IO completions for other inodes being completed and + * attach them to the current inode log item. + */ + blip = XFS_BUF_FSPRIVATE(bp, xfs_log_item_t *); + prev = NULL; + while (blip != NULL) { + if (lip->li_cb != xfs_iflush_done) { + prev = blip; + blip = blip->li_bio_list; + continue; + } + + /* remove from list */ + next = blip->li_bio_list; + if (!prev) { + XFS_BUF_SET_FSPRIVATE(bp, next); + } else { + prev->li_bio_list = next; + } + + /* add to current list */ + blip->li_bio_list = lip->li_bio_list; + lip->li_bio_list = blip; + + /* + * while we have the item, do the unlocked check for needing + * the AIL lock. + */ + iip = INODE_ITEM(blip); + if (iip->ili_logged && blip->li_lsn == iip->ili_flush_lsn) + need_ail++; + + blip = next; + } + + /* make sure we capture the state of the initial inode. */ + iip = INODE_ITEM(lip); + if (iip->ili_logged && lip->li_lsn == iip->ili_flush_lsn) + need_ail++; /* * We only want to pull the item from the AIL if it is @@ -861,28 +910,37 @@ xfs_iflush_done( * the lock since it's cheaper, and then we recheck while * holding the lock before removing the inode from the AIL. */ - if (iip->ili_logged && lip->li_lsn == iip->ili_flush_lsn) { + if (need_ail) { + struct xfs_log_item *log_items[need_ail]; + int i = 0; spin_lock(&ailp->xa_lock); - if (lip->li_lsn == iip->ili_flush_lsn) { - /* xfs_trans_ail_delete() drops the AIL lock. */ - xfs_trans_ail_delete(ailp, lip); - } else { - spin_unlock(&ailp->xa_lock); + for (blip = lip; blip; blip = blip->li_bio_list) { + iip = INODE_ITEM(blip); + if (iip->ili_logged && + blip->li_lsn == iip->ili_flush_lsn) { + log_items[i++] = blip; + } + ASSERT(i <= need_ail); } + /* xfs_trans_ail_delete_bulk() drops the AIL lock. */ + xfs_trans_ail_delete_bulk(ailp, log_items, i); } - iip->ili_logged = 0; /* - * Clear the ili_last_fields bits now that we know that the - * data corresponding to them is safely on disk. + * clean up and unlock the flush lock now we are done. We can clear the + * ili_last_fields bits now that we know that the data corresponding to + * them is safely on disk. */ - iip->ili_last_fields = 0; + for (blip = lip; blip; blip = next) { + next = blip->li_bio_list; + blip->li_bio_list = NULL; - /* - * Release the inode's flush lock since we're done with it. - */ - xfs_ifunlock(ip); + iip = INODE_ITEM(blip); + iip->ili_logged = 0; + iip->ili_last_fields = 0; + xfs_ifunlock(iip->ili_inode); + } } /* diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index fe991a7..218f968 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -639,6 +639,79 @@ xfs_trans_ail_delete( } } +/* + * xfs_trans_ail_delete_bulk - remove multiple log items from the AIL + * + * @xfs_trans_ail_delete_bulk takes an array of log items that all need to + * removed from the AIL. The caller is already holding the AIL lock, and done + * all the checks necessary to ensure the items passed in via @log_items are + * ready for deletion. This includes checking that the items are in the AIL. + * + * For each log item to be removed, unlink it from the AIL, clear the IN_AIL + * flag from the item and reset the item's lsn to 0. If we remove the first + * item in the AIL, update the log tail to match the new minimum LSN in the + * AIL. + * + * This function will not drop the AIL lock until all items are removed from + * the AIL to minimise the amount of lock traffic on the AIL. This does not + * greatly increase the AIL hold time, but does significantly reduce the amount + * of traffic on the lock, especially during IO completion. + * + * This function must be called with the AIL lock held. The lock is dropped + * before returning. + */ +void +xfs_trans_ail_delete_bulk( + struct xfs_ail *ailp, + struct xfs_log_item **log_items, + int nr_items) __releases(ailp->xa_lock) +{ + xfs_log_item_t *mlip; + xfs_lsn_t tail_lsn; + int mlip_changed = 0; + int i; + + mlip = xfs_ail_min(ailp); + + for (i = 0; i < nr_items; i++) { + struct xfs_log_item *lip = log_items[i]; + if (!(lip->li_flags & XFS_LI_IN_AIL)) { + struct xfs_mount *mp = ailp->xa_mount; + + spin_unlock(&ailp->xa_lock); + if (!XFS_FORCED_SHUTDOWN(mp)) { + xfs_cmn_err(XFS_PTAG_AILDELETE, CE_ALERT, mp, + "%s: attempting to delete a log item that is not in the AIL", + __func__); + xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); + } + return; + } + + xfs_ail_delete(ailp, lip); + lip->li_flags &= ~XFS_LI_IN_AIL; + lip->li_lsn = 0; + if (mlip == lip) + mlip_changed = 1; + } + + if (!mlip_changed) { + spin_unlock(&ailp->xa_lock); + return; + } + + /* + * It is not safe to access mlip after the AIL lock is dropped, so we + * must get a copy of li_lsn before we do so. This is especially + * important on 32-bit platforms where accessing and updating 64-bit + * values like li_lsn is not atomic. It is possible we've emptied the + * AIL here, so if that is the case, pass an LSN of 0 to the tail move. + */ + mlip = xfs_ail_min(ailp); + tail_lsn = mlip ? mlip->li_lsn : 0; + spin_unlock(&ailp->xa_lock); + xfs_log_move_tail(ailp->xa_mount, tail_lsn); +} /* diff --git a/fs/xfs/xfs_trans_priv.h b/fs/xfs/xfs_trans_priv.h index e039729..246ca4d 100644 --- a/fs/xfs/xfs_trans_priv.h +++ b/fs/xfs/xfs_trans_priv.h @@ -85,6 +85,10 @@ void xfs_trans_ail_update_bulk(struct xfs_ail *ailp, void xfs_trans_ail_delete(struct xfs_ail *ailp, struct xfs_log_item *lip) __releases(ailp->xa_lock); +void xfs_trans_ail_delete_bulk(struct xfs_ail *ailp, + struct xfs_log_item **log_items, + int nr_items) + __releases(ailp->xa_lock); void xfs_trans_ail_push(struct xfs_ail *, xfs_lsn_t); void xfs_trans_unlocked_item(struct xfs_ail *, xfs_log_item_t *); -- 1.7.2.3 From SRS0+f2mc+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7SVXw244893 for ; Tue, 21 Dec 2010 01:28:32 -0600 X-ASG-Debug-ID: 1292916627-40d600b60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C7A691470328 for ; Mon, 20 Dec 2010 23:30:27 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id rYS4GVXXi1GtZrxF for ; Mon, 20 Dec 2010 23:30:27 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50575236-1927428 for ; Tue, 21 Dec 2010 18:00:26 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfn-0001Do-6J for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:15 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfR-0006Za-Re for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:53 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 19/34] xfs: consume iodone callback items on buffers as they are processed Subject: [PATCH 19/34] xfs: consume iodone callback items on buffers as they are processed Date: Tue, 21 Dec 2010 18:29:15 +1100 Message-Id: <1292916570-25015-20-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1292916628 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50052 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner To allow buffer iodone callbacks to consume multiple items off the callback list, first we need to convert the xfs_buf_do_callbacks() to consume items and always pull the next item from the head of the list. The means the item list walk is never dependent on knowing the next item on the list and hence allows callbacks to remove items from the list as well. This allows callbacks to do bulk operations by scanning the list for identical callbacks, consuming them all and then processing them in bulk, negating the need for multiple callbacks of that type. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_buf_item.c | 32 +++++++++++++++++++++----------- 1 files changed, 21 insertions(+), 11 deletions(-) diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 2686d0d..ed2b65f 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -142,7 +142,7 @@ xfs_buf_item_log_check( #endif STATIC void xfs_buf_error_relse(xfs_buf_t *bp); -STATIC void xfs_buf_do_callbacks(xfs_buf_t *bp, xfs_log_item_t *lip); +STATIC void xfs_buf_do_callbacks(struct xfs_buf *bp); /* * This returns the number of log iovecs needed to log the @@ -450,7 +450,7 @@ xfs_buf_item_unpin( * xfs_trans_ail_delete() drops the AIL lock. */ if (bip->bli_flags & XFS_BLI_STALE_INODE) { - xfs_buf_do_callbacks(bp, (xfs_log_item_t *)bip); + xfs_buf_do_callbacks(bp); XFS_BUF_SET_FSPRIVATE(bp, NULL); XFS_BUF_CLR_IODONE_FUNC(bp); } else { @@ -918,15 +918,26 @@ xfs_buf_attach_iodone( XFS_BUF_SET_IODONE_FUNC(bp, xfs_buf_iodone_callbacks); } +/* + * We can have many callbacks on a buffer. Running the callbacks individually + * can cause a lot of contention on the AIL lock, so we allow for a single + * callback to be able to scan the remaining lip->li_bio_list for other items + * of the same type and callback to be processed in the first call. + * + * As a result, the loop walking the callback list below will also modify the + * list. it removes the first item from the list and then runs the callback. + * The loop then restarts from the new head of the list. This allows the + * callback to scan and modify the list attached to the buffer and we don't + * have to care about maintaining a next item pointer. + */ STATIC void xfs_buf_do_callbacks( - xfs_buf_t *bp, - xfs_log_item_t *lip) + struct xfs_buf *bp) { - xfs_log_item_t *nlip; + struct xfs_log_item *lip; - while (lip != NULL) { - nlip = lip->li_bio_list; + while ((lip = XFS_BUF_FSPRIVATE(bp, xfs_log_item_t *)) != NULL) { + XFS_BUF_SET_FSPRIVATE(bp, lip->li_bio_list); ASSERT(lip->li_cb != NULL); /* * Clear the next pointer so we don't have any @@ -936,7 +947,6 @@ xfs_buf_do_callbacks( */ lip->li_bio_list = NULL; lip->li_cb(bp, lip); - lip = nlip; } } @@ -970,7 +980,7 @@ xfs_buf_iodone_callbacks( ASSERT(XFS_BUF_TARGET(bp) == mp->m_ddev_targp); XFS_BUF_SUPER_STALE(bp); trace_xfs_buf_item_iodone(bp, _RET_IP_); - xfs_buf_do_callbacks(bp, lip); + xfs_buf_do_callbacks(bp); XFS_BUF_SET_FSPRIVATE(bp, NULL); XFS_BUF_CLR_IODONE_FUNC(bp); xfs_buf_ioend(bp, 0); @@ -1029,7 +1039,7 @@ xfs_buf_iodone_callbacks( return; } - xfs_buf_do_callbacks(bp, lip); + xfs_buf_do_callbacks(bp); XFS_BUF_SET_FSPRIVATE(bp, NULL); XFS_BUF_CLR_IODONE_FUNC(bp); xfs_buf_ioend(bp, 0); @@ -1063,7 +1073,7 @@ xfs_buf_error_relse( * We have to unpin the pinned buffers so do the * callbacks. */ - xfs_buf_do_callbacks(bp, lip); + xfs_buf_do_callbacks(bp); XFS_BUF_SET_FSPRIVATE(bp, NULL); XFS_BUF_CLR_IODONE_FUNC(bp); XFS_BUF_SET_BRELSE_FUNC(bp,NULL); -- 1.7.2.3 From SRS0+f2mc+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7SXv5244913 for ; Tue, 21 Dec 2010 01:28:34 -0600 X-ASG-Debug-ID: 1292916628-4a9600000000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7B3F1147032A for ; Mon, 20 Dec 2010 23:30:29 -0800 (PST) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id fmOCwNABDGSibCgo for ; Mon, 20 Dec 2010 23:30:29 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 39223400-1927428 for ; Tue, 21 Dec 2010 18:00:27 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfs-0001EB-Hr for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:20 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfc-0006Zr-5m for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:04 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 25/34] xfs: rework log grant space calculations Subject: [PATCH 25/34] xfs: rework log grant space calculations Date: Tue, 21 Dec 2010 18:29:21 +1100 Message-Id: <1292916570-25015-26-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1292916630 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50052 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The log grant space calculations are repeated for both write and reserve grant heads. To make it simpler to convert the calculations toa different algorithm, factor them so both the gratn heads use the same calculation functions. Once this is done we can drop the wrappers that are used in only a couple of place to update both grant heads at once as they don't provide any particular value. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_log.c | 95 +++++++++++++++++++++++++++-------------------------- 1 files changed, 48 insertions(+), 47 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 99c6285..9a4b9ed 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -98,53 +98,34 @@ STATIC void xlog_verify_tail_lsn(xlog_t *log, xlog_in_core_t *iclog, STATIC int xlog_iclogs_empty(xlog_t *log); static void -xlog_grant_sub_space(struct log *log, int bytes) -{ - log->l_grant_write_bytes -= bytes; - if (log->l_grant_write_bytes < 0) { - log->l_grant_write_bytes += log->l_logsize; - log->l_grant_write_cycle--; - } - - log->l_grant_reserve_bytes -= bytes; - if ((log)->l_grant_reserve_bytes < 0) { - log->l_grant_reserve_bytes += log->l_logsize; - log->l_grant_reserve_cycle--; - } - -} - -static void -xlog_grant_add_space_write(struct log *log, int bytes) +xlog_grant_sub_space( + struct log *log, + int *cycle, + int *space, + int bytes) { - int tmp = log->l_logsize - log->l_grant_write_bytes; - if (tmp > bytes) - log->l_grant_write_bytes += bytes; - else { - log->l_grant_write_cycle++; - log->l_grant_write_bytes = bytes - tmp; + *space -= bytes; + if (*space < 0) { + *space += log->l_logsize; + (*cycle)--; } } static void -xlog_grant_add_space_reserve(struct log *log, int bytes) +xlog_grant_add_space( + struct log *log, + int *cycle, + int *space, + int bytes) { - int tmp = log->l_logsize - log->l_grant_reserve_bytes; + int tmp = log->l_logsize - *space; if (tmp > bytes) - log->l_grant_reserve_bytes += bytes; + *space += bytes; else { - log->l_grant_reserve_cycle++; - log->l_grant_reserve_bytes = bytes - tmp; + *space = bytes - tmp; + (*cycle)++; } } - -static inline void -xlog_grant_add_space(struct log *log, int bytes) -{ - xlog_grant_add_space_write(log, bytes); - xlog_grant_add_space_reserve(log, bytes); -} - static void xlog_tic_reset_res(xlog_ticket_t *tic) { @@ -1344,7 +1325,10 @@ xlog_sync(xlog_t *log, /* move grant heads by roundoff in sync */ spin_lock(&log->l_grant_lock); - xlog_grant_add_space(log, roundoff); + xlog_grant_add_space(log, &log->l_grant_reserve_cycle, + &log->l_grant_reserve_bytes, roundoff); + xlog_grant_add_space(log, &log->l_grant_write_cycle, + &log->l_grant_write_bytes, roundoff); spin_unlock(&log->l_grant_lock); /* put cycle number in every block */ @@ -2574,7 +2558,10 @@ redo: list_del_init(&tic->t_queue); /* we've got enough space */ - xlog_grant_add_space(log, need_bytes); + xlog_grant_add_space(log, &log->l_grant_reserve_cycle, + &log->l_grant_reserve_bytes, need_bytes); + xlog_grant_add_space(log, &log->l_grant_write_cycle, + &log->l_grant_write_bytes, need_bytes); trace_xfs_log_grant_exit(log, tic); xlog_verify_grant_head(log, 1); xlog_verify_grant_tail(log); @@ -2701,7 +2688,8 @@ redo: list_del_init(&tic->t_queue); /* we've got enough space */ - xlog_grant_add_space_write(log, need_bytes); + xlog_grant_add_space(log, &log->l_grant_write_cycle, + &log->l_grant_write_bytes, need_bytes); trace_xfs_log_regrant_write_exit(log, tic); xlog_verify_grant_head(log, 1); xlog_verify_grant_tail(log); @@ -2742,7 +2730,12 @@ xlog_regrant_reserve_log_space(xlog_t *log, ticket->t_cnt--; spin_lock(&log->l_grant_lock); - xlog_grant_sub_space(log, ticket->t_curr_res); + xlog_grant_sub_space(log, &log->l_grant_reserve_cycle, + &log->l_grant_reserve_bytes, + ticket->t_curr_res); + xlog_grant_sub_space(log, &log->l_grant_write_cycle, + &log->l_grant_write_bytes, + ticket->t_curr_res); ticket->t_curr_res = ticket->t_unit_res; xlog_tic_reset_res(ticket); @@ -2756,7 +2749,9 @@ xlog_regrant_reserve_log_space(xlog_t *log, return; } - xlog_grant_add_space_reserve(log, ticket->t_unit_res); + xlog_grant_add_space(log, &log->l_grant_reserve_cycle, + &log->l_grant_reserve_bytes, + ticket->t_unit_res); trace_xfs_log_regrant_reserve_exit(log, ticket); @@ -2785,24 +2780,30 @@ STATIC void xlog_ungrant_log_space(xlog_t *log, xlog_ticket_t *ticket) { + int bytes; + if (ticket->t_cnt > 0) ticket->t_cnt--; spin_lock(&log->l_grant_lock); trace_xfs_log_ungrant_enter(log, ticket); - - xlog_grant_sub_space(log, ticket->t_curr_res); - trace_xfs_log_ungrant_sub(log, ticket); - /* If this is a permanent reservation ticket, we may be able to free + /* + * If this is a permanent reservation ticket, we may be able to free * up more space based on the remaining count. */ + bytes = ticket->t_curr_res; if (ticket->t_cnt > 0) { ASSERT(ticket->t_flags & XLOG_TIC_PERM_RESERV); - xlog_grant_sub_space(log, ticket->t_unit_res*ticket->t_cnt); + bytes += ticket->t_unit_res*ticket->t_cnt; } + xlog_grant_sub_space(log, &log->l_grant_reserve_cycle, + &log->l_grant_reserve_bytes, bytes); + xlog_grant_sub_space(log, &log->l_grant_write_cycle, + &log->l_grant_write_bytes, bytes); + trace_xfs_log_ungrant_exit(log, ticket); xlog_verify_grant_head(log, 1); -- 1.7.2.3 From SRS0+K7iM+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7SXJK244910 for ; Tue, 21 Dec 2010 01:28:33 -0600 X-ASG-Debug-ID: 1292916628-362d02530000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2AAC9212031 for ; Mon, 20 Dec 2010 23:30:28 -0800 (PST) Received: from mail.internode.on.net (bld-mail20.adl6.internode.on.net [150.101.137.105]) by cuda.sgi.com with ESMTP id TFPMHGGoKEdY7kYS for ; Mon, 20 Dec 2010 23:30:28 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 5388622-1927428 for ; Tue, 21 Dec 2010 18:00:27 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfy-0001EN-2e for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:26 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfm-0006aJ-NG for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:14 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 33/34] xfs: convert grant head manipulations to lockless algorithm Subject: [PATCH 33/34] xfs: convert grant head manipulations to lockless algorithm Date: Tue, 21 Dec 2010 18:29:29 +1100 Message-Id: <1292916570-25015-34-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail20.adl6.internode.on.net[150.101.137.105] X-Barracuda-Start-Time: 1292916630 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The only thing that the grant lock remains to protect is the grant head manipulations when adding or removing space from the log. These calculations are already based on atomic variables, so we can already update them safely without locks. However, the grant head manpulations require atomic multi-step calculations to be executed, which the algorithms currently don't allow. To make these multi-step calculations atomic, convert the algorithms to compare-and-exchange loops on the atomic variables. That is, we sample the old value, perform the calculation and use atomic64_cmpxchg() to attempt to update the head with the new value. If the head has not changed since we sampled it, it will succeed and we are done. Otherwise, we rerun the calculation again from a new sample of the head. This allows us to remove the grant lock from around all the grant head space manipulations, and that effectively removes the grant lock from the log completely. Hence we can remove the grant lock completely from the log at this point. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_log.c | 103 ++++++++++++++++--------------------------------- fs/xfs/xfs_log_priv.h | 23 +++++++---- 2 files changed, 49 insertions(+), 77 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 6fcc9d0..0bf24b1 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -81,7 +81,6 @@ STATIC void xlog_ungrant_log_space(xlog_t *log, #if defined(DEBUG) STATIC void xlog_verify_dest_ptr(xlog_t *log, char *ptr); -STATIC void xlog_verify_grant_head(xlog_t *log, int equals); STATIC void xlog_verify_grant_tail(struct log *log); STATIC void xlog_verify_iclog(xlog_t *log, xlog_in_core_t *iclog, int count, boolean_t syncing); @@ -89,7 +88,6 @@ STATIC void xlog_verify_tail_lsn(xlog_t *log, xlog_in_core_t *iclog, xfs_lsn_t tail_lsn); #else #define xlog_verify_dest_ptr(a,b) -#define xlog_verify_grant_head(a,b) #define xlog_verify_grant_tail(a) #define xlog_verify_iclog(a,b,c,d) #define xlog_verify_tail_lsn(a,b,c) @@ -103,17 +101,24 @@ xlog_grant_sub_space( atomic64_t *head, int bytes) { - int cycle, space; + int64_t head_val = atomic64_read(head); + int64_t new, old; - xlog_crack_grant_head(head, &cycle, &space); + do { + int cycle, space; - space -= bytes; - if (space < 0) { - space += log->l_logsize; - cycle--; - } + xlog_crack_grant_head_val(head_val, &cycle, &space); - xlog_assign_grant_head(head, cycle, space); + space -= bytes; + if (space < 0) { + space += log->l_logsize; + cycle--; + } + + old = head_val; + new = xlog_assign_grant_head_val(cycle, space); + head_val = atomic64_cmpxchg(head, old, new); + } while (head_val != old); } static void @@ -122,20 +127,27 @@ xlog_grant_add_space( atomic64_t *head, int bytes) { - int tmp; - int cycle, space; + int64_t head_val = atomic64_read(head); + int64_t new, old; - xlog_crack_grant_head(head, &cycle, &space); + do { + int tmp; + int cycle, space; - tmp = log->l_logsize - space; - if (tmp > bytes) - space += bytes; - else { - space = bytes - tmp; - cycle++; - } + xlog_crack_grant_head_val(head_val, &cycle, &space); - xlog_assign_grant_head(head, cycle, space); + tmp = log->l_logsize - space; + if (tmp > bytes) + space += bytes; + else { + space = bytes - tmp; + cycle++; + } + + old = head_val; + new = xlog_assign_grant_head_val(cycle, space); + head_val = atomic64_cmpxchg(head, old, new); + } while (head_val != old); } static void @@ -318,9 +330,7 @@ xfs_log_reserve( trace_xfs_log_reserve(log, internal_ticket); - spin_lock(&log->l_grant_lock); xlog_grant_push_ail(log, internal_ticket->t_unit_res); - spin_unlock(&log->l_grant_lock); retval = xlog_regrant_write_log_space(log, internal_ticket); } else { /* may sleep if need to allocate more tickets */ @@ -334,11 +344,9 @@ xfs_log_reserve( trace_xfs_log_reserve(log, internal_ticket); - spin_lock(&log->l_grant_lock); xlog_grant_push_ail(log, (internal_ticket->t_unit_res * internal_ticket->t_cnt)); - spin_unlock(&log->l_grant_lock); retval = xlog_grant_log_space(log, internal_ticket); } @@ -1057,7 +1065,6 @@ xlog_alloc_log(xfs_mount_t *mp, log->l_xbuf = bp; spin_lock_init(&log->l_icloglock); - spin_lock_init(&log->l_grant_lock); init_waitqueue_head(&log->l_flush_wait); /* log record size must be multiple of BBSIZE; see xlog_rec_header_t */ @@ -1135,7 +1142,6 @@ out_free_iclog: kmem_free(iclog); } spinlock_destroy(&log->l_icloglock); - spinlock_destroy(&log->l_grant_lock); xfs_buf_free(log->l_xbuf); out_free_log: kmem_free(log); @@ -1331,10 +1337,8 @@ xlog_sync(xlog_t *log, roundoff < BBTOB(1))); /* move grant heads by roundoff in sync */ - spin_lock(&log->l_grant_lock); xlog_grant_add_space(log, &log->l_grant_reserve_head, roundoff); xlog_grant_add_space(log, &log->l_grant_write_head, roundoff); - spin_unlock(&log->l_grant_lock); /* put cycle number in every block */ xlog_pack_data(log, iclog, roundoff); @@ -1455,7 +1459,6 @@ xlog_dealloc_log(xlog_t *log) iclog = next_iclog; } spinlock_destroy(&log->l_icloglock); - spinlock_destroy(&log->l_grant_lock); xfs_buf_free(log->l_xbuf); log->l_mp->m_log = NULL; @@ -2574,13 +2577,10 @@ redo: } /* we've got enough space */ - spin_lock(&log->l_grant_lock); xlog_grant_add_space(log, &log->l_grant_reserve_head, need_bytes); xlog_grant_add_space(log, &log->l_grant_write_head, need_bytes); trace_xfs_log_grant_exit(log, tic); - xlog_verify_grant_head(log, 1); xlog_verify_grant_tail(log); - spin_unlock(&log->l_grant_lock); return 0; error_return_unlocked: @@ -2694,12 +2694,9 @@ redo: } /* we've got enough space */ - spin_lock(&log->l_grant_lock); xlog_grant_add_space(log, &log->l_grant_write_head, need_bytes); trace_xfs_log_regrant_write_exit(log, tic); - xlog_verify_grant_head(log, 1); xlog_verify_grant_tail(log); - spin_unlock(&log->l_grant_lock); return 0; @@ -2737,7 +2734,6 @@ xlog_regrant_reserve_log_space(xlog_t *log, if (ticket->t_cnt > 0) ticket->t_cnt--; - spin_lock(&log->l_grant_lock); xlog_grant_sub_space(log, &log->l_grant_reserve_head, ticket->t_curr_res); xlog_grant_sub_space(log, &log->l_grant_write_head, @@ -2747,21 +2743,15 @@ xlog_regrant_reserve_log_space(xlog_t *log, trace_xfs_log_regrant_reserve_sub(log, ticket); - xlog_verify_grant_head(log, 1); - /* just return if we still have some of the pre-reserved space */ - if (ticket->t_cnt > 0) { - spin_unlock(&log->l_grant_lock); + if (ticket->t_cnt > 0) return; - } xlog_grant_add_space(log, &log->l_grant_reserve_head, ticket->t_unit_res); trace_xfs_log_regrant_reserve_exit(log, ticket); - xlog_verify_grant_head(log, 0); - spin_unlock(&log->l_grant_lock); ticket->t_curr_res = ticket->t_unit_res; xlog_tic_reset_res(ticket); } /* xlog_regrant_reserve_log_space */ @@ -2790,7 +2780,6 @@ xlog_ungrant_log_space(xlog_t *log, if (ticket->t_cnt > 0) ticket->t_cnt--; - spin_lock(&log->l_grant_lock); trace_xfs_log_ungrant_enter(log, ticket); trace_xfs_log_ungrant_sub(log, ticket); @@ -2809,8 +2798,6 @@ xlog_ungrant_log_space(xlog_t *log, trace_xfs_log_ungrant_exit(log, ticket); - xlog_verify_grant_head(log, 1); - spin_unlock(&log->l_grant_lock); xfs_log_move_tail(log->l_mp, 1); } /* xlog_ungrant_log_space */ @@ -3429,28 +3416,6 @@ xlog_verify_dest_ptr( } STATIC void -xlog_verify_grant_head(xlog_t *log, int equals) -{ - int reserve_cycle, reserve_space; - int write_cycle, write_space; - - xlog_crack_grant_head(&log->l_grant_reserve_head, - &reserve_cycle, &reserve_space); - xlog_crack_grant_head(&log->l_grant_write_head, - &write_cycle, &write_space); - - if (reserve_cycle == write_cycle) { - if (equals) - ASSERT(reserve_space >= write_space); - else - ASSERT(reserve_space > write_space); - } else { - ASSERT(reserve_cycle - 1 == write_cycle); - ASSERT(write_space >= reserve_space); - } -} - -STATIC void xlog_verify_grant_tail( struct log *log) { diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index befb2fc..d5f8be8 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -510,9 +510,6 @@ typedef struct log { int l_curr_block; /* current logical log block */ int l_prev_block; /* previous logical log block */ - /* The following block of fields are changed while holding grant_lock */ - spinlock_t l_grant_lock ____cacheline_aligned_in_smp; - /* * l_last_sync_lsn and l_tail_lsn are atomics so they can be set and * read without needing to hold specific locks. To avoid operations @@ -599,23 +596,33 @@ xlog_assign_atomic_lsn(atomic64_t *lsn, uint cycle, uint block) } /* - * When we crack the grrant head, we sample it first so that the value will not + * When we crack the grant head, we sample it first so that the value will not * change while we are cracking it into the component values. This means we * will always get consistent component values to work from. */ static inline void -xlog_crack_grant_head(atomic64_t *head, int *cycle, int *space) +xlog_crack_grant_head_val(int64_t val, int *cycle, int *space) { - int64_t val = atomic64_read(head); - *cycle = val >> 32; *space = val & 0xffffffff; } static inline void +xlog_crack_grant_head(atomic64_t *head, int *cycle, int *space) +{ + xlog_crack_grant_head_val(atomic64_read(head), cycle, space); +} + +static inline int64_t +xlog_assign_grant_head_val(int cycle, int space) +{ + return ((int64_t)cycle << 32) | space; +} + +static inline void xlog_assign_grant_head(atomic64_t *head, int cycle, int space) { - atomic64_set(head, ((int64_t)cycle << 32) | space); + atomic64_set(head, xlog_assign_grant_head_val(cycle, space)); } /* -- 1.7.2.3 From SRS0+f2mc+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7SXrE244914 for ; Tue, 21 Dec 2010 01:28:34 -0600 X-ASG-Debug-ID: 1292916628-177303b90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 36DEE1470328 for ; Mon, 20 Dec 2010 23:30:28 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id ZgUKcNdeHWlStF9i for ; Mon, 20 Dec 2010 23:30:28 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50575237-1927428 for ; Tue, 21 Dec 2010 18:00:27 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfn-0001E1-MG for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:15 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfc-0006Zw-Ae for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:04 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 26/34] xfs: combine grant heads into a single 64 bit integer Subject: [PATCH 26/34] xfs: combine grant heads into a single 64 bit integer Date: Tue, 21 Dec 2010 18:29:22 +1100 Message-Id: <1292916570-25015-27-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1292916630 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50052 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Prepare for switching the grant heads to atomic variables by combining the two 32 bit values that make up the grant head into a single 64 bit variable. Provide wrapper functions to combine and split the grant heads appropriately for calculations and use them as necessary. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_trace.h | 10 ++- fs/xfs/xfs_log.c | 166 ++++++++++++++++++++++-------------------- fs/xfs/xfs_log_priv.h | 26 ++++++- fs/xfs/xfs_log_recover.c | 8 +- 4 files changed, 119 insertions(+), 91 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index 69b9e1f..3ff6b35 100644 --- a/fs/xfs/linux-2.6/xfs_trace.h +++ b/fs/xfs/linux-2.6/xfs_trace.h @@ -786,10 +786,12 @@ DECLARE_EVENT_CLASS(xfs_loggrant_class, __entry->flags = tic->t_flags; __entry->reserveq = list_empty(&log->l_reserveq); __entry->writeq = list_empty(&log->l_writeq); - __entry->grant_reserve_cycle = log->l_grant_reserve_cycle; - __entry->grant_reserve_bytes = log->l_grant_reserve_bytes; - __entry->grant_write_cycle = log->l_grant_write_cycle; - __entry->grant_write_bytes = log->l_grant_write_bytes; + xlog_crack_grant_head(&log->l_grant_reserve_head, + &__entry->grant_reserve_cycle, + &__entry->grant_reserve_bytes); + xlog_crack_grant_head(&log->l_grant_write_head, + &__entry->grant_write_cycle, + &__entry->grant_write_bytes); __entry->curr_cycle = log->l_curr_cycle; __entry->curr_block = log->l_curr_block; __entry->tail_lsn = log->l_tail_lsn; diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 9a4b9ed..6bba8b4 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -47,7 +47,7 @@ STATIC xlog_t * xlog_alloc_log(xfs_mount_t *mp, xfs_buftarg_t *log_target, xfs_daddr_t blk_offset, int num_bblks); -STATIC int xlog_space_left(xlog_t *log, int cycle, int bytes); +STATIC int xlog_space_left(struct log *log, int64_t *head); STATIC int xlog_sync(xlog_t *log, xlog_in_core_t *iclog); STATIC void xlog_dealloc_log(xlog_t *log); @@ -100,32 +100,44 @@ STATIC int xlog_iclogs_empty(xlog_t *log); static void xlog_grant_sub_space( struct log *log, - int *cycle, - int *space, + int64_t *head, int bytes) { - *space -= bytes; - if (*space < 0) { - *space += log->l_logsize; - (*cycle)--; + int cycle, space; + + xlog_crack_grant_head(head, &cycle, &space); + + space -= bytes; + if (space < 0) { + space += log->l_logsize; + cycle--; } + + xlog_assign_grant_head(head, cycle, space); } static void xlog_grant_add_space( struct log *log, - int *cycle, - int *space, + int64_t *head, int bytes) { - int tmp = log->l_logsize - *space; + int tmp; + int cycle, space; + + xlog_crack_grant_head(head, &cycle, &space); + + tmp = log->l_logsize - space; if (tmp > bytes) - *space += bytes; + space += bytes; else { - *space = bytes - tmp; - (*cycle)++; + space = bytes - tmp; + cycle++; } + + xlog_assign_grant_head(head, cycle, space); } + static void xlog_tic_reset_res(xlog_ticket_t *tic) { @@ -654,7 +666,7 @@ xfs_log_move_tail(xfs_mount_t *mp, { xlog_ticket_t *tic; xlog_t *log = mp->m_log; - int need_bytes, free_bytes, cycle, bytes; + int need_bytes, free_bytes; if (XLOG_FORCED_SHUTDOWN(log)) return; @@ -680,9 +692,7 @@ xfs_log_move_tail(xfs_mount_t *mp, if (log->l_flags & XLOG_ACTIVE_RECOVERY) panic("Recovery problem"); #endif - cycle = log->l_grant_write_cycle; - bytes = log->l_grant_write_bytes; - free_bytes = xlog_space_left(log, cycle, bytes); + free_bytes = xlog_space_left(log, &log->l_grant_write_head); list_for_each_entry(tic, &log->l_writeq, t_queue) { ASSERT(tic->t_flags & XLOG_TIC_PERM_RESERV); @@ -699,9 +709,7 @@ xfs_log_move_tail(xfs_mount_t *mp, if (log->l_flags & XLOG_ACTIVE_RECOVERY) panic("Recovery problem"); #endif - cycle = log->l_grant_reserve_cycle; - bytes = log->l_grant_reserve_bytes; - free_bytes = xlog_space_left(log, cycle, bytes); + free_bytes = xlog_space_left(log, &log->l_grant_reserve_head); list_for_each_entry(tic, &log->l_reserveq, t_queue) { if (tic->t_flags & XLOG_TIC_PERM_RESERV) need_bytes = tic->t_unit_res*tic->t_cnt; @@ -814,21 +822,26 @@ xlog_assign_tail_lsn(xfs_mount_t *mp) * result is that we return the size of the log as the amount of space left. */ STATIC int -xlog_space_left(xlog_t *log, int cycle, int bytes) +xlog_space_left( + struct log *log, + int64_t *head) { - int free_bytes; - int tail_bytes; - int tail_cycle; + int free_bytes; + int tail_bytes; + int tail_cycle; + int head_cycle; + int head_bytes; + xlog_crack_grant_head(head, &head_cycle, &head_bytes); tail_bytes = BBTOB(BLOCK_LSN(log->l_tail_lsn)); tail_cycle = CYCLE_LSN(log->l_tail_lsn); - if ((tail_cycle == cycle) && (bytes >= tail_bytes)) { - free_bytes = log->l_logsize - (bytes - tail_bytes); - } else if ((tail_cycle + 1) < cycle) { + if (tail_cycle == head_cycle && head_bytes >= tail_bytes) + free_bytes = log->l_logsize - (head_bytes - tail_bytes); + else if (tail_cycle + 1 < head_cycle) return 0; - } else if (tail_cycle < cycle) { - ASSERT(tail_cycle == (cycle - 1)); - free_bytes = tail_bytes - bytes; + else if (tail_cycle < head_cycle) { + ASSERT(tail_cycle == (head_cycle - 1)); + free_bytes = tail_bytes - head_bytes; } else { /* * The reservation head is behind the tail. @@ -839,12 +852,12 @@ xlog_space_left(xlog_t *log, int cycle, int bytes) "xlog_space_left: head behind tail\n" " tail_cycle = %d, tail_bytes = %d\n" " GH cycle = %d, GH bytes = %d", - tail_cycle, tail_bytes, cycle, bytes); + tail_cycle, tail_bytes, head_cycle, head_bytes); ASSERT(0); free_bytes = log->l_logsize; } return free_bytes; -} /* xlog_space_left */ +} /* @@ -1001,8 +1014,8 @@ xlog_alloc_log(xfs_mount_t *mp, /* log->l_tail_lsn = 0x100000000LL; cycle = 1; current block = 0 */ log->l_last_sync_lsn = log->l_tail_lsn; log->l_curr_cycle = 1; /* 0 is bad since this is initial value */ - log->l_grant_reserve_cycle = 1; - log->l_grant_write_cycle = 1; + xlog_assign_grant_head(&log->l_grant_reserve_head, 1, 0); + xlog_assign_grant_head(&log->l_grant_write_head, 1, 0); INIT_LIST_HEAD(&log->l_reserveq); INIT_LIST_HEAD(&log->l_writeq); @@ -1190,9 +1203,7 @@ xlog_grant_push_ail(xfs_mount_t *mp, ASSERT(BTOBB(need_bytes) < log->l_logBBsize); spin_lock(&log->l_grant_lock); - free_bytes = xlog_space_left(log, - log->l_grant_reserve_cycle, - log->l_grant_reserve_bytes); + free_bytes = xlog_space_left(log, &log->l_grant_reserve_head); tail_lsn = log->l_tail_lsn; free_blocks = BTOBBT(free_bytes); @@ -1325,10 +1336,8 @@ xlog_sync(xlog_t *log, /* move grant heads by roundoff in sync */ spin_lock(&log->l_grant_lock); - xlog_grant_add_space(log, &log->l_grant_reserve_cycle, - &log->l_grant_reserve_bytes, roundoff); - xlog_grant_add_space(log, &log->l_grant_write_cycle, - &log->l_grant_write_bytes, roundoff); + xlog_grant_add_space(log, &log->l_grant_reserve_head, roundoff); + xlog_grant_add_space(log, &log->l_grant_write_head, roundoff); spin_unlock(&log->l_grant_lock); /* put cycle number in every block */ @@ -2531,8 +2540,7 @@ redo: if (XLOG_FORCED_SHUTDOWN(log)) goto error_return; - free_bytes = xlog_space_left(log, log->l_grant_reserve_cycle, - log->l_grant_reserve_bytes); + free_bytes = xlog_space_left(log, &log->l_grant_reserve_head); if (free_bytes < need_bytes) { if (list_empty(&tic->t_queue)) list_add_tail(&tic->t_queue, &log->l_reserveq); @@ -2558,10 +2566,8 @@ redo: list_del_init(&tic->t_queue); /* we've got enough space */ - xlog_grant_add_space(log, &log->l_grant_reserve_cycle, - &log->l_grant_reserve_bytes, need_bytes); - xlog_grant_add_space(log, &log->l_grant_write_cycle, - &log->l_grant_write_bytes, need_bytes); + xlog_grant_add_space(log, &log->l_grant_reserve_head, need_bytes); + xlog_grant_add_space(log, &log->l_grant_write_head, need_bytes); trace_xfs_log_grant_exit(log, tic); xlog_verify_grant_head(log, 1); xlog_verify_grant_tail(log); @@ -2622,8 +2628,7 @@ xlog_regrant_write_log_space(xlog_t *log, need_bytes = tic->t_unit_res; if (!list_empty(&log->l_writeq)) { struct xlog_ticket *ntic; - free_bytes = xlog_space_left(log, log->l_grant_write_cycle, - log->l_grant_write_bytes); + free_bytes = xlog_space_left(log, &log->l_grant_write_head); list_for_each_entry(ntic, &log->l_writeq, t_queue) { ASSERT(ntic->t_flags & XLOG_TIC_PERM_RESERV); @@ -2662,8 +2667,7 @@ redo: if (XLOG_FORCED_SHUTDOWN(log)) goto error_return; - free_bytes = xlog_space_left(log, log->l_grant_write_cycle, - log->l_grant_write_bytes); + free_bytes = xlog_space_left(log, &log->l_grant_write_head); if (free_bytes < need_bytes) { if (list_empty(&tic->t_queue)) list_add_tail(&tic->t_queue, &log->l_writeq); @@ -2688,8 +2692,7 @@ redo: list_del_init(&tic->t_queue); /* we've got enough space */ - xlog_grant_add_space(log, &log->l_grant_write_cycle, - &log->l_grant_write_bytes, need_bytes); + xlog_grant_add_space(log, &log->l_grant_write_head, need_bytes); trace_xfs_log_regrant_write_exit(log, tic); xlog_verify_grant_head(log, 1); xlog_verify_grant_tail(log); @@ -2730,12 +2733,10 @@ xlog_regrant_reserve_log_space(xlog_t *log, ticket->t_cnt--; spin_lock(&log->l_grant_lock); - xlog_grant_sub_space(log, &log->l_grant_reserve_cycle, - &log->l_grant_reserve_bytes, - ticket->t_curr_res); - xlog_grant_sub_space(log, &log->l_grant_write_cycle, - &log->l_grant_write_bytes, - ticket->t_curr_res); + xlog_grant_sub_space(log, &log->l_grant_reserve_head, + ticket->t_curr_res); + xlog_grant_sub_space(log, &log->l_grant_write_head, + ticket->t_curr_res); ticket->t_curr_res = ticket->t_unit_res; xlog_tic_reset_res(ticket); @@ -2749,9 +2750,8 @@ xlog_regrant_reserve_log_space(xlog_t *log, return; } - xlog_grant_add_space(log, &log->l_grant_reserve_cycle, - &log->l_grant_reserve_bytes, - ticket->t_unit_res); + xlog_grant_add_space(log, &log->l_grant_reserve_head, + ticket->t_unit_res); trace_xfs_log_regrant_reserve_exit(log, ticket); @@ -2799,10 +2799,8 @@ xlog_ungrant_log_space(xlog_t *log, bytes += ticket->t_unit_res*ticket->t_cnt; } - xlog_grant_sub_space(log, &log->l_grant_reserve_cycle, - &log->l_grant_reserve_bytes, bytes); - xlog_grant_sub_space(log, &log->l_grant_write_cycle, - &log->l_grant_write_bytes, bytes); + xlog_grant_sub_space(log, &log->l_grant_reserve_head, bytes); + xlog_grant_sub_space(log, &log->l_grant_write_head, bytes); trace_xfs_log_ungrant_exit(log, ticket); @@ -3430,22 +3428,31 @@ xlog_verify_dest_ptr( STATIC void xlog_verify_grant_head(xlog_t *log, int equals) { - if (log->l_grant_reserve_cycle == log->l_grant_write_cycle) { - if (equals) - ASSERT(log->l_grant_reserve_bytes >= log->l_grant_write_bytes); - else - ASSERT(log->l_grant_reserve_bytes > log->l_grant_write_bytes); - } else { - ASSERT(log->l_grant_reserve_cycle-1 == log->l_grant_write_cycle); - ASSERT(log->l_grant_write_bytes >= log->l_grant_reserve_bytes); - } -} /* xlog_verify_grant_head */ + int reserve_cycle, reserve_space; + int write_cycle, write_space; + + xlog_crack_grant_head(&log->l_grant_reserve_head, + &reserve_cycle, &reserve_space); + xlog_crack_grant_head(&log->l_grant_write_head, + &write_cycle, &write_space); + + if (reserve_cycle == write_cycle) { + if (equals) + ASSERT(reserve_space >= write_space); + else + ASSERT(reserve_space > write_space); + } else { + ASSERT(reserve_cycle - 1 == write_cycle); + ASSERT(write_space >= reserve_space); + } +} STATIC void xlog_verify_grant_tail( struct log *log) { xfs_lsn_t tail_lsn = log->l_tail_lsn; + int cycle, space; /* * Check to make sure the grant write head didn't just over lap the @@ -3453,9 +3460,10 @@ xlog_verify_grant_tail( * Otherwise, make sure that the cycles differ by exactly one and * check the byte count. */ - if (CYCLE_LSN(tail_lsn) != log->l_grant_write_cycle) { - ASSERT(log->l_grant_write_cycle - 1 == CYCLE_LSN(tail_lsn)); - ASSERT(log->l_grant_write_bytes <= BBTOB(BLOCK_LSN(tail_lsn))); + xlog_crack_grant_head(&log->l_grant_write_head, &cycle, &space); + if (CYCLE_LSN(tail_lsn) != cycle) { + ASSERT(cycle - 1 == CYCLE_LSN(tail_lsn)); + ASSERT(space <= BBTOB(BLOCK_LSN(tail_lsn))); } } diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index a5b3c02..2f74c80 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -518,10 +518,8 @@ typedef struct log { spinlock_t l_grant_lock ____cacheline_aligned_in_smp; struct list_head l_reserveq; struct list_head l_writeq; - int l_grant_reserve_cycle; - int l_grant_reserve_bytes; - int l_grant_write_cycle; - int l_grant_write_bytes; + int64_t l_grant_reserve_head; + int64_t l_grant_write_head; /* The following field are used for debugging; need to hold icloglock */ #ifdef DEBUG @@ -561,6 +559,26 @@ int xlog_write(struct log *log, struct xfs_log_vec *log_vector, xlog_in_core_t **commit_iclog, uint flags); /* + * When we crack the grrant head, we sample it first so that the value will not + * change while we are cracking it into the component values. This means we + * will always get consistent component values to work from. + */ +static inline void +xlog_crack_grant_head(int64_t *head, int *cycle, int *space) +{ + int64_t val = *head; + + *cycle = val >> 32; + *space = val & 0xffffffff; +} + +static inline void +xlog_assign_grant_head(int64_t *head, int cycle, int space) +{ + *head = ((int64_t)cycle << 32) | space; +} + +/* * Committed Item List interfaces */ int xlog_cil_init(struct log *log); diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 4abe7a9..1550404 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -938,10 +938,10 @@ xlog_find_tail( log->l_curr_cycle++; log->l_tail_lsn = be64_to_cpu(rhead->h_tail_lsn); log->l_last_sync_lsn = be64_to_cpu(rhead->h_lsn); - log->l_grant_reserve_cycle = log->l_curr_cycle; - log->l_grant_reserve_bytes = BBTOB(log->l_curr_block); - log->l_grant_write_cycle = log->l_curr_cycle; - log->l_grant_write_bytes = BBTOB(log->l_curr_block); + xlog_assign_grant_head(&log->l_grant_reserve_head, log->l_curr_cycle, + BBTOB(log->l_curr_block)); + xlog_assign_grant_head(&log->l_grant_write_head, log->l_curr_cycle, + BBTOB(log->l_curr_block)); /* * Look for unmount record. If we find it, then we know there -- 1.7.2.3 From SRS0+Brkf+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:42 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7Sgte244994 for ; Tue, 21 Dec 2010 01:28:42 -0600 X-ASG-Debug-ID: 1292916638-165103b20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8C3621CE33D9 for ; Mon, 20 Dec 2010 23:30:38 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id BTjpepplhlLzJR6M for ; Mon, 20 Dec 2010 23:30:38 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50839345-1927428 for ; Tue, 21 Dec 2010 18:00:37 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfx-0001EG-RN for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:25 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfm-0006a8-FV for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:14 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 29/34] xfs: convert l_last_sync_lsn to an atomic variable Subject: [PATCH 29/34] xfs: convert l_last_sync_lsn to an atomic variable Date: Tue, 21 Dec 2010 18:29:25 +1100 Message-Id: <1292916570-25015-30-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1292916639 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner log->l_last_sync_lsn is updated in only one critical spot - log buffer Io completion - and is protected by the grant lock here. This requires the grant lock to be taken for every log buffer IO completion. Converting the l_last_sync_lsn variable to an atomic64_t means that we do not need to take the grant lock in log buffer IO completion to update it. This also removes the need for explicitly holding a spinlock to read the l_last_sync_lsn on 32 bit platforms. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_log.c | 55 +++++++++++++++++++++------------------------- fs/xfs/xfs_log_priv.h | 9 ++++++- fs/xfs/xfs_log_recover.c | 6 ++-- 3 files changed, 36 insertions(+), 34 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 1e2020d..70790eb 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -675,12 +675,8 @@ xfs_log_move_tail(xfs_mount_t *mp, if (XLOG_FORCED_SHUTDOWN(log)) return; - if (tail_lsn == 0) { - /* needed since sync_lsn is 64 bits */ - spin_lock(&log->l_icloglock); - tail_lsn = log->l_last_sync_lsn; - spin_unlock(&log->l_icloglock); - } + if (tail_lsn == 0) + tail_lsn = atomic64_read(&log->l_last_sync_lsn); spin_lock(&log->l_grant_lock); @@ -800,11 +796,9 @@ xlog_assign_tail_lsn(xfs_mount_t *mp) tail_lsn = xfs_trans_ail_tail(mp->m_ail); spin_lock(&log->l_grant_lock); - if (tail_lsn != 0) { - log->l_tail_lsn = tail_lsn; - } else { - tail_lsn = log->l_tail_lsn = log->l_last_sync_lsn; - } + if (!tail_lsn) + tail_lsn = atomic64_read(&log->l_last_sync_lsn); + log->l_tail_lsn = tail_lsn; spin_unlock(&log->l_grant_lock); return tail_lsn; @@ -1014,9 +1008,9 @@ xlog_alloc_log(xfs_mount_t *mp, log->l_flags |= XLOG_ACTIVE_RECOVERY; log->l_prev_block = -1; - log->l_tail_lsn = xlog_assign_lsn(1, 0); /* log->l_tail_lsn = 0x100000000LL; cycle = 1; current block = 0 */ - log->l_last_sync_lsn = log->l_tail_lsn; + log->l_tail_lsn = xlog_assign_lsn(1, 0); + atomic64_set(&log->l_last_sync_lsn, xlog_assign_lsn(1, 0)); log->l_curr_cycle = 1; /* 0 is bad since this is initial value */ xlog_assign_grant_head(&log->l_grant_reserve_head, 1, 0); xlog_assign_grant_head(&log->l_grant_write_head, 1, 0); @@ -1194,6 +1188,7 @@ xlog_grant_push_ail( int need_bytes) { xfs_lsn_t threshold_lsn = 0; + xfs_lsn_t last_sync_lsn; xfs_lsn_t tail_lsn; int free_blocks; int free_bytes; @@ -1228,10 +1223,12 @@ xlog_grant_push_ail( threshold_block); /* * Don't pass in an lsn greater than the lsn of the last - * log record known to be on disk. + * log record known to be on disk. Use a snapshot of the last sync lsn + * so that it doesn't change between the compare and the set. */ - if (XFS_LSN_CMP(threshold_lsn, log->l_last_sync_lsn) > 0) - threshold_lsn = log->l_last_sync_lsn; + last_sync_lsn = atomic64_read(&log->l_last_sync_lsn); + if (XFS_LSN_CMP(threshold_lsn, last_sync_lsn) > 0) + threshold_lsn = last_sync_lsn; /* * Get the transaction layer to kick the dirty buffers out to @@ -2194,7 +2191,7 @@ xlog_state_do_callback( lowest_lsn = xlog_get_lowest_lsn(log); if (lowest_lsn && XFS_LSN_CMP(lowest_lsn, - be64_to_cpu(iclog->ic_header.h_lsn)) < 0) { + be64_to_cpu(iclog->ic_header.h_lsn)) < 0) { iclog = iclog->ic_next; continue; /* Leave this iclog for * another thread */ @@ -2202,23 +2199,21 @@ xlog_state_do_callback( iclog->ic_state = XLOG_STATE_CALLBACK; - spin_unlock(&log->l_icloglock); - /* l_last_sync_lsn field protected by - * l_grant_lock. Don't worry about iclog's lsn. - * No one else can be here except us. + /* + * update the last_sync_lsn before we drop the + * icloglock to ensure we are the only one that + * can update it. */ - spin_lock(&log->l_grant_lock); - ASSERT(XFS_LSN_CMP(log->l_last_sync_lsn, - be64_to_cpu(iclog->ic_header.h_lsn)) <= 0); - log->l_last_sync_lsn = - be64_to_cpu(iclog->ic_header.h_lsn); - spin_unlock(&log->l_grant_lock); + ASSERT(XFS_LSN_CMP(atomic64_read(&log->l_last_sync_lsn), + be64_to_cpu(iclog->ic_header.h_lsn)) <= 0); + atomic64_set(&log->l_last_sync_lsn, + be64_to_cpu(iclog->ic_header.h_lsn)); - } else { - spin_unlock(&log->l_icloglock); + } else ioerrors++; - } + + spin_unlock(&log->l_icloglock); /* * Keep processing entries in the callback list until diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index e2bb276..958f356 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -507,7 +507,6 @@ typedef struct log { spinlock_t l_icloglock; /* grab to change iclog state */ xfs_lsn_t l_tail_lsn; /* lsn of 1st LR with unflushed * buffers */ - xfs_lsn_t l_last_sync_lsn;/* lsn of last LR on disk */ int l_curr_cycle; /* Cycle number of log writes */ int l_prev_cycle; /* Cycle number before last * block increment */ @@ -521,6 +520,14 @@ typedef struct log { int64_t l_grant_reserve_head; int64_t l_grant_write_head; + /* + * l_last_sync_lsn is an atomic so it can be set and read without + * needing to hold specific locks. To avoid operations contending with + * other hot objects, place it on a separate cacheline. + */ + /* lsn of last LR on disk */ + atomic64_t l_last_sync_lsn ____cacheline_aligned_in_smp; + /* The following field are used for debugging; need to hold icloglock */ #ifdef DEBUG char *l_iclog_bak[XLOG_MAX_ICLOGS]; diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 1550404..18e1e18 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -937,7 +937,7 @@ xlog_find_tail( if (found == 2) log->l_curr_cycle++; log->l_tail_lsn = be64_to_cpu(rhead->h_tail_lsn); - log->l_last_sync_lsn = be64_to_cpu(rhead->h_lsn); + atomic64_set(&log->l_last_sync_lsn, be64_to_cpu(rhead->h_lsn)); xlog_assign_grant_head(&log->l_grant_reserve_head, log->l_curr_cycle, BBTOB(log->l_curr_block)); xlog_assign_grant_head(&log->l_grant_write_head, log->l_curr_cycle, @@ -989,9 +989,9 @@ xlog_find_tail( log->l_tail_lsn = xlog_assign_lsn(log->l_curr_cycle, after_umount_blk); - log->l_last_sync_lsn = + atomic64_set(&log->l_last_sync_lsn, xlog_assign_lsn(log->l_curr_cycle, - after_umount_blk); + after_umount_blk)); *tail_blk = after_umount_blk; /* -- 1.7.2.3 From SRS0+Brkf+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7SaBB244956 for ; Tue, 21 Dec 2010 01:28:36 -0600 X-ASG-Debug-ID: 1292916632-225f032b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C6B6F1CE33D7 for ; Mon, 20 Dec 2010 23:30:32 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id pGKamhftCvhvENtu for ; Mon, 20 Dec 2010 23:30:32 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50839318-1927428 for ; Tue, 21 Dec 2010 18:00:28 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfc-0001DA-SQ for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:04 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfH-0006ZL-IH for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:43 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 14/34] xfs: fix EFI transaction cancellation. Subject: [PATCH 14/34] xfs: fix EFI transaction cancellation. Date: Tue, 21 Dec 2010 18:29:10 +1100 Message-Id: <1292916570-25015-15-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1292916633 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner XFS_EFI_CANCELED has not been set in the code base since xfs_efi_cancel() was removed back in 2006 by commit 065d312e15902976d256ddaf396a7950ec0350a8 ("[XFS] Remove unused iop_abort log item operation), and even then xfs_efi_cancel() was never called. I haven't tracked it back further than that (beyond git history), but it indicates that the handling of EFIs in cancelled transactions has been broken for a long time. Basically, when we get an IOP_UNPIN(lip, 1); call from xfs_trans_uncommit() (i.e. remove == 1), if we don't free the log item descriptor we leak it. Fix the behviour to be correct and kill the XFS_EFI_CANCELED flag. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_extfree_item.c | 20 +++++++++----------- fs/xfs/xfs_extfree_item.h | 1 - 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index a55e687..5997efa 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -99,10 +99,11 @@ xfs_efi_item_pin( } /* - * While EFIs cannot really be pinned, the unpin operation is the - * last place at which the EFI is manipulated during a transaction. - * Here we coordinate with xfs_efi_cancel() to determine who gets to - * free the EFI. + * While EFIs cannot really be pinned, the unpin operation is the last place at + * which the EFI is manipulated during a transaction. If we are being asked to + * 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. */ STATIC void xfs_efi_item_unpin( @@ -113,17 +114,14 @@ xfs_efi_item_unpin( struct xfs_ail *ailp = lip->li_ailp; spin_lock(&ailp->xa_lock); - if (efip->efi_flags & XFS_EFI_CANCELED) { - if (remove) - xfs_trans_del_item(lip); - - /* xfs_trans_ail_delete() drops the AIL lock. */ - xfs_trans_ail_delete(ailp, lip); + if (remove) { + ASSERT(!(lip->li_flags & XFS_LI_IN_AIL)); + xfs_trans_del_item(lip); xfs_efi_item_free(efip); } else { efip->efi_flags |= XFS_EFI_COMMITTED; - spin_unlock(&ailp->xa_lock); } + spin_unlock(&ailp->xa_lock); } /* diff --git a/fs/xfs/xfs_extfree_item.h b/fs/xfs/xfs_extfree_item.h index 0d22c56..f7834ec 100644 --- a/fs/xfs/xfs_extfree_item.h +++ b/fs/xfs/xfs_extfree_item.h @@ -115,7 +115,6 @@ typedef struct xfs_efd_log_format_64 { */ #define XFS_EFI_RECOVERED 0x1 #define XFS_EFI_COMMITTED 0x2 -#define XFS_EFI_CANCELED 0x4 /* * This is the "extent free intention" log item. It is used -- 1.7.2.3 From SRS0+f2mc+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7SYre244929 for ; Tue, 21 Dec 2010 01:28:35 -0600 X-ASG-Debug-ID: 1292916628-4a9600000002-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4AF211470328 for ; Mon, 20 Dec 2010 23:30:31 -0800 (PST) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id uTyZVeVr0bKrU1IG for ; Mon, 20 Dec 2010 23:30:31 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 39223402-1927428 for ; Tue, 21 Dec 2010 18:00:28 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfy-0001EU-4P for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:26 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfm-0006aM-PQ for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:14 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 34/34] xfs: kill useless spinlock_destroy macro Subject: [PATCH 34/34] xfs: kill useless spinlock_destroy macro Date: Tue, 21 Dec 2010 18:29:30 +1100 Message-Id: <1292916570-25015-35-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1292916632 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50052 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner It is only used in 2 places in the log code, and is an empty macro, so get rid of it. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_linux.h | 2 -- fs/xfs/xfs_log.c | 2 -- 2 files changed, 0 insertions(+), 4 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_linux.h b/fs/xfs/linux-2.6/xfs_linux.h index ccebd86..e7cfa27 100644 --- a/fs/xfs/linux-2.6/xfs_linux.h +++ b/fs/xfs/linux-2.6/xfs_linux.h @@ -113,8 +113,6 @@ #define current_restore_flags_nested(sp, f) \ (current->flags = ((current->flags & ~(f)) | (*(sp) & (f)))) -#define spinlock_destroy(lock) - #define NBBY 8 /* number of bits per byte */ /* diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 0bf24b1..f94016d 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -1141,7 +1141,6 @@ out_free_iclog: xfs_buf_free(iclog->ic_bp); kmem_free(iclog); } - spinlock_destroy(&log->l_icloglock); xfs_buf_free(log->l_xbuf); out_free_log: kmem_free(log); @@ -1458,7 +1457,6 @@ xlog_dealloc_log(xlog_t *log) kmem_free(iclog); iclog = next_iclog; } - spinlock_destroy(&log->l_icloglock); xfs_buf_free(log->l_xbuf); log->l_mp->m_log = NULL; -- 1.7.2.3 From SRS0+f2mc+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_TICKET autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7ShOf245012 for ; Tue, 21 Dec 2010 01:28:44 -0600 X-ASG-Debug-ID: 1292916638-31a701dc0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B1C961470332 for ; Mon, 20 Dec 2010 23:30:39 -0800 (PST) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id VWPh2nynagmkmIDr for ; Mon, 20 Dec 2010 23:30:39 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 39223413-1927428 for ; Tue, 21 Dec 2010 18:00:38 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwg3-0001Ed-1J for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:31 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfm-0006aG-LS for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:14 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 32/34] xfs: introduce new locks for the log grant ticket wait queues Subject: [PATCH 32/34] xfs: introduce new locks for the log grant ticket wait queues Date: Tue, 21 Dec 2010 18:29:28 +1100 Message-Id: <1292916570-25015-33-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1292916640 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50052 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The log grant ticket wait queues are currently protected by the log grant lock. However, the queues are functionally independent from each other, and operations on them only require serialisation against other queue operations now that all of the other log variables they use are atomic values. Hence, we can make them independent of the grant lock by introducing new locks just to protect the lists operations. because the lists are independent, we can use a lock per list and ensure that reserve and write head queuing do not contend. To ensure forced shutdowns work correctly in conjunction with the new fast paths, ensure that we check whether the log has been shut down in the grant functions once we hold the relevant spin locks but before we go to sleep. This is needed to co-ordinate correctly with the wakeups that are issued on the ticket queues so we don't leave any processes sleeping on the queues during a shutdown. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_trace.h | 2 + fs/xfs/xfs_log.c | 139 +++++++++++++++++++++++++----------------- fs/xfs/xfs_log_priv.h | 16 ++++- 3 files changed, 97 insertions(+), 60 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index b180e1b..647af2a 100644 --- a/fs/xfs/linux-2.6/xfs_trace.h +++ b/fs/xfs/linux-2.6/xfs_trace.h @@ -837,6 +837,7 @@ DEFINE_LOGGRANT_EVENT(xfs_log_grant_sleep1); DEFINE_LOGGRANT_EVENT(xfs_log_grant_wake1); DEFINE_LOGGRANT_EVENT(xfs_log_grant_sleep2); DEFINE_LOGGRANT_EVENT(xfs_log_grant_wake2); +DEFINE_LOGGRANT_EVENT(xfs_log_grant_wake_up); DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_enter); DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_exit); DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_error); @@ -844,6 +845,7 @@ DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_sleep1); DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_wake1); DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_sleep2); DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_wake2); +DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_wake_up); DEFINE_LOGGRANT_EVENT(xfs_log_regrant_reserve_enter); DEFINE_LOGGRANT_EVENT(xfs_log_regrant_reserve_exit); DEFINE_LOGGRANT_EVENT(xfs_log_regrant_reserve_sub); diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index a1d7d12..6fcc9d0 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -682,12 +682,12 @@ xfs_log_move_tail(xfs_mount_t *mp, if (tail_lsn != 1) atomic64_set(&log->l_tail_lsn, tail_lsn); - spin_lock(&log->l_grant_lock); - if (!list_empty(&log->l_writeq)) { + if (!list_empty_careful(&log->l_writeq)) { #ifdef DEBUG if (log->l_flags & XLOG_ACTIVE_RECOVERY) panic("Recovery problem"); #endif + spin_lock(&log->l_grant_write_lock); free_bytes = xlog_space_left(log, &log->l_grant_write_head); list_for_each_entry(tic, &log->l_writeq, t_queue) { ASSERT(tic->t_flags & XLOG_TIC_PERM_RESERV); @@ -696,15 +696,18 @@ xfs_log_move_tail(xfs_mount_t *mp, break; tail_lsn = 0; free_bytes -= tic->t_unit_res; + trace_xfs_log_regrant_write_wake_up(log, tic); wake_up(&tic->t_wait); } + spin_unlock(&log->l_grant_write_lock); } - if (!list_empty(&log->l_reserveq)) { + if (!list_empty_careful(&log->l_reserveq)) { #ifdef DEBUG if (log->l_flags & XLOG_ACTIVE_RECOVERY) panic("Recovery problem"); #endif + spin_lock(&log->l_grant_reserve_lock); free_bytes = xlog_space_left(log, &log->l_grant_reserve_head); list_for_each_entry(tic, &log->l_reserveq, t_queue) { if (tic->t_flags & XLOG_TIC_PERM_RESERV) @@ -715,11 +718,12 @@ xfs_log_move_tail(xfs_mount_t *mp, break; tail_lsn = 0; free_bytes -= need_bytes; + trace_xfs_log_grant_wake_up(log, tic); wake_up(&tic->t_wait); } + spin_unlock(&log->l_grant_reserve_lock); } - spin_unlock(&log->l_grant_lock); -} /* xfs_log_move_tail */ +} /* * Determine if we have a transaction that has gone to disk @@ -1010,6 +1014,8 @@ xlog_alloc_log(xfs_mount_t *mp, xlog_assign_grant_head(&log->l_grant_write_head, 1, 0); INIT_LIST_HEAD(&log->l_reserveq); INIT_LIST_HEAD(&log->l_writeq); + spin_lock_init(&log->l_grant_reserve_lock); + spin_lock_init(&log->l_grant_write_lock); error = EFSCORRUPTED; if (xfs_sb_version_hassector(&mp->m_sb)) { @@ -2477,6 +2483,18 @@ restart: * * Once a ticket gets put onto the reserveq, it will only return after * the needed reservation is satisfied. + * + * This function is structured so that it has a lock free fast path. This is + * necessary because every new transaction reservation will come through this + * path. Hence any lock will be globally hot if we take it unconditionally on + * every pass. + * + * As tickets are only ever moved on and off the reserveq under the + * l_grant_reserve_lock, we only need to take that lock if we are going + * to add the ticket to the queue and sleep. We can avoid taking the lock if the + * ticket was never added to the reserveq because the t_queue list head will be + * empty and we hold the only reference to it so it can safely be checked + * unlocked. */ STATIC int xlog_grant_log_space(xlog_t *log, @@ -2490,13 +2508,20 @@ xlog_grant_log_space(xlog_t *log, panic("grant Recovery problem"); #endif - /* Is there space or do we need to sleep? */ - spin_lock(&log->l_grant_lock); - trace_xfs_log_grant_enter(log, tic); + need_bytes = tic->t_unit_res; + if (tic->t_flags & XFS_LOG_PERM_RESERV) + need_bytes *= tic->t_ocnt; + /* something is already sleeping; insert new transaction at end */ - if (!list_empty(&log->l_reserveq)) { + if (!list_empty_careful(&log->l_reserveq)) { + spin_lock(&log->l_grant_reserve_lock); + /* recheck the queue now we are locked */ + if (list_empty(&log->l_reserveq)) { + spin_unlock(&log->l_grant_reserve_lock); + goto redo; + } list_add_tail(&tic->t_queue, &log->l_reserveq); trace_xfs_log_grant_sleep1(log, tic); @@ -2509,48 +2534,47 @@ xlog_grant_log_space(xlog_t *log, goto error_return; XFS_STATS_INC(xs_sleep_logspace); - xlog_wait(&tic->t_wait, &log->l_grant_lock); + xlog_wait(&tic->t_wait, &log->l_grant_reserve_lock); /* * If we got an error, and the filesystem is shutting down, * we'll catch it down below. So just continue... */ trace_xfs_log_grant_wake1(log, tic); - spin_lock(&log->l_grant_lock); } - if (tic->t_flags & XFS_LOG_PERM_RESERV) - need_bytes = tic->t_unit_res*tic->t_ocnt; - else - need_bytes = tic->t_unit_res; redo: if (XLOG_FORCED_SHUTDOWN(log)) - goto error_return; + goto error_return_unlocked; free_bytes = xlog_space_left(log, &log->l_grant_reserve_head); if (free_bytes < need_bytes) { + spin_lock(&log->l_grant_reserve_lock); if (list_empty(&tic->t_queue)) list_add_tail(&tic->t_queue, &log->l_reserveq); trace_xfs_log_grant_sleep2(log, tic); + if (XLOG_FORCED_SHUTDOWN(log)) + goto error_return; + xlog_grant_push_ail(log, need_bytes); XFS_STATS_INC(xs_sleep_logspace); - xlog_wait(&tic->t_wait, &log->l_grant_lock); - - spin_lock(&log->l_grant_lock); - if (XLOG_FORCED_SHUTDOWN(log)) - goto error_return; + xlog_wait(&tic->t_wait, &log->l_grant_reserve_lock); trace_xfs_log_grant_wake2(log, tic); - goto redo; } - list_del_init(&tic->t_queue); + if (!list_empty(&tic->t_queue)) { + spin_lock(&log->l_grant_reserve_lock); + list_del_init(&tic->t_queue); + spin_unlock(&log->l_grant_reserve_lock); + } /* we've got enough space */ + spin_lock(&log->l_grant_lock); xlog_grant_add_space(log, &log->l_grant_reserve_head, need_bytes); xlog_grant_add_space(log, &log->l_grant_write_head, need_bytes); trace_xfs_log_grant_exit(log, tic); @@ -2559,8 +2583,11 @@ redo: spin_unlock(&log->l_grant_lock); return 0; - error_return: +error_return_unlocked: + spin_lock(&log->l_grant_reserve_lock); +error_return: list_del_init(&tic->t_queue); + spin_unlock(&log->l_grant_reserve_lock); trace_xfs_log_grant_error(log, tic); /* @@ -2570,7 +2597,6 @@ redo: */ tic->t_curr_res = 0; tic->t_cnt = 0; /* ungrant will give back unit_res * t_cnt. */ - spin_unlock(&log->l_grant_lock); return XFS_ERROR(EIO); } /* xlog_grant_log_space */ @@ -2578,7 +2604,8 @@ redo: /* * Replenish the byte reservation required by moving the grant write head. * - * + * Similar to xlog_grant_log_space, the function is structured to have a lock + * free fast path. */ STATIC int xlog_regrant_write_log_space(xlog_t *log, @@ -2597,12 +2624,9 @@ xlog_regrant_write_log_space(xlog_t *log, panic("regrant Recovery problem"); #endif - spin_lock(&log->l_grant_lock); - trace_xfs_log_regrant_write_enter(log, tic); - if (XLOG_FORCED_SHUTDOWN(log)) - goto error_return; + goto error_return_unlocked; /* If there are other waiters on the queue then give them a * chance at logspace before us. Wake up the first waiters, @@ -2611,8 +2635,10 @@ xlog_regrant_write_log_space(xlog_t *log, * this transaction. */ need_bytes = tic->t_unit_res; - if (!list_empty(&log->l_writeq)) { + if (!list_empty_careful(&log->l_writeq)) { struct xlog_ticket *ntic; + + spin_lock(&log->l_grant_write_lock); free_bytes = xlog_space_left(log, &log->l_grant_write_head); list_for_each_entry(ntic, &log->l_writeq, t_queue) { ASSERT(ntic->t_flags & XLOG_TIC_PERM_RESERV); @@ -2627,50 +2653,48 @@ xlog_regrant_write_log_space(xlog_t *log, struct xlog_ticket, t_queue)) { if (list_empty(&tic->t_queue)) list_add_tail(&tic->t_queue, &log->l_writeq); - trace_xfs_log_regrant_write_sleep1(log, tic); xlog_grant_push_ail(log, need_bytes); XFS_STATS_INC(xs_sleep_logspace); - xlog_wait(&tic->t_wait, &log->l_grant_lock); - - /* If we're shutting down, this tic is already - * off the queue */ - spin_lock(&log->l_grant_lock); - if (XLOG_FORCED_SHUTDOWN(log)) - goto error_return; - + xlog_wait(&tic->t_wait, &log->l_grant_write_lock); trace_xfs_log_regrant_write_wake1(log, tic); - } + } else + spin_unlock(&log->l_grant_write_lock); } redo: if (XLOG_FORCED_SHUTDOWN(log)) - goto error_return; + goto error_return_unlocked; free_bytes = xlog_space_left(log, &log->l_grant_write_head); if (free_bytes < need_bytes) { + spin_lock(&log->l_grant_write_lock); if (list_empty(&tic->t_queue)) list_add_tail(&tic->t_queue, &log->l_writeq); + + if (XLOG_FORCED_SHUTDOWN(log)) + goto error_return; + xlog_grant_push_ail(log, need_bytes); XFS_STATS_INC(xs_sleep_logspace); trace_xfs_log_regrant_write_sleep2(log, tic); - xlog_wait(&tic->t_wait, &log->l_grant_lock); - - /* If we're shutting down, this tic is already off the queue */ - spin_lock(&log->l_grant_lock); - if (XLOG_FORCED_SHUTDOWN(log)) - goto error_return; + xlog_wait(&tic->t_wait, &log->l_grant_write_lock); trace_xfs_log_regrant_write_wake2(log, tic); goto redo; } - list_del_init(&tic->t_queue); + if (!list_empty(&tic->t_queue)) { + spin_lock(&log->l_grant_write_lock); + list_del_init(&tic->t_queue); + spin_unlock(&log->l_grant_write_lock); + } /* we've got enough space */ + spin_lock(&log->l_grant_lock); xlog_grant_add_space(log, &log->l_grant_write_head, need_bytes); trace_xfs_log_regrant_write_exit(log, tic); xlog_verify_grant_head(log, 1); @@ -2679,8 +2703,11 @@ redo: return 0; + error_return_unlocked: + spin_lock(&log->l_grant_write_lock); error_return: list_del_init(&tic->t_queue); + spin_unlock(&log->l_grant_write_lock); trace_xfs_log_regrant_write_error(log, tic); /* @@ -2690,7 +2717,6 @@ redo: */ tic->t_curr_res = 0; tic->t_cnt = 0; /* ungrant will give back unit_res * t_cnt. */ - spin_unlock(&log->l_grant_lock); return XFS_ERROR(EIO); } /* xlog_regrant_write_log_space */ @@ -3664,12 +3690,10 @@ xfs_log_force_umount( xlog_cil_force(log); /* - * We must hold both the GRANT lock and the LOG lock, - * before we mark the filesystem SHUTDOWN and wake - * everybody up to tell the bad news. + * mark the filesystem and the as in a shutdown state and wake + * everybody up to tell them the bad news. */ spin_lock(&log->l_icloglock); - spin_lock(&log->l_grant_lock); mp->m_flags |= XFS_MOUNT_FS_SHUTDOWN; if (mp->m_sb_bp) XFS_BUF_DONE(mp->m_sb_bp); @@ -3694,14 +3718,17 @@ xfs_log_force_umount( * means we have to wake up everybody queued up on reserveq as well as * writeq. In addition, we make sure in xlog_{re}grant_log_space that * we don't enqueue anything once the SHUTDOWN flag is set, and this - * action is protected by the GRANTLOCK. + * action is protected by the grant locks. */ + spin_lock(&log->l_grant_reserve_lock); list_for_each_entry(tic, &log->l_reserveq, t_queue) wake_up(&tic->t_wait); + spin_unlock(&log->l_grant_reserve_lock); + spin_lock(&log->l_grant_write_lock); list_for_each_entry(tic, &log->l_writeq, t_queue) wake_up(&tic->t_wait); - spin_unlock(&log->l_grant_lock); + spin_unlock(&log->l_grant_write_lock); if (!(log->l_iclog->ic_state & XLOG_STATE_IOERROR)) { ASSERT(!logerror); diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index 7619d6a..befb2fc 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -512,10 +512,6 @@ typedef struct log { /* The following block of fields are changed while holding grant_lock */ spinlock_t l_grant_lock ____cacheline_aligned_in_smp; - struct list_head l_reserveq; - struct list_head l_writeq; - atomic64_t l_grant_reserve_head; - atomic64_t l_grant_write_head; /* * l_last_sync_lsn and l_tail_lsn are atomics so they can be set and @@ -528,6 +524,18 @@ typedef struct log { /* lsn of 1st LR with unflushed * buffers */ atomic64_t l_tail_lsn ____cacheline_aligned_in_smp; + /* + * ticket grant locks, queues and accounting have their own cachlines + * as these are quite hot and can be operated on concurrently. + */ + spinlock_t l_grant_reserve_lock ____cacheline_aligned_in_smp; + struct list_head l_reserveq; + atomic64_t l_grant_reserve_head; + + spinlock_t l_grant_write_lock ____cacheline_aligned_in_smp; + struct list_head l_writeq; + atomic64_t l_grant_write_head; + /* The following field are used for debugging; need to hold icloglock */ #ifdef DEBUG char *l_iclog_bak[XLOG_MAX_ICLOGS]; -- 1.7.2.3 From SRS0+K7iM+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:44 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_65, LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7SgUQ244998 for ; Tue, 21 Dec 2010 01:28:43 -0600 X-ASG-Debug-ID: 1292916638-40d600b90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E1CB71470330 for ; Mon, 20 Dec 2010 23:30:38 -0800 (PST) Received: from mail.internode.on.net (bld-mail20.adl6.internode.on.net [150.101.137.105]) by cuda.sgi.com with ESMTP id TqxVfw06OEexU1sk for ; Mon, 20 Dec 2010 23:30:38 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 5388626-1927428 for ; Tue, 21 Dec 2010 18:00:37 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfx-0001EH-TG for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:25 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfm-0006aA-Hq for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:14 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 30/34] xfs: convert l_tail_lsn to an atomic variable. Subject: [PATCH 30/34] xfs: convert l_tail_lsn to an atomic variable. Date: Tue, 21 Dec 2010 18:29:26 +1100 Message-Id: <1292916570-25015-31-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail20.adl6.internode.on.net[150.101.137.105] X-Barracuda-Start-Time: 1292916639 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50052 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner log->l_tail_lsn is currently protected by the log grant lock. The lock is only needed for serialising readers against writers, so we don't really need the lock if we make the l_tail_lsn variable an atomic. Converting the l_tail_lsn variable to an atomic64_t means we can start to peel back the grant lock from various operations. Also, provide functions to safely crack an atomic LSN variable into it's component pieces and to recombined the components into an atomic variable. Use them where appropriate. This also removes the need for explicitly holding a spinlock to read the l_tail_lsn on 32 bit platforms. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_trace.h | 2 +- fs/xfs/xfs_log.c | 56 ++++++++++++++++++----------------------- fs/xfs/xfs_log_priv.h | 37 +++++++++++++++++++++++---- fs/xfs/xfs_log_recover.c | 14 ++++------ 4 files changed, 63 insertions(+), 46 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_trace.h b/fs/xfs/linux-2.6/xfs_trace.h index 3ff6b35..b180e1b 100644 --- a/fs/xfs/linux-2.6/xfs_trace.h +++ b/fs/xfs/linux-2.6/xfs_trace.h @@ -794,7 +794,7 @@ DECLARE_EVENT_CLASS(xfs_loggrant_class, &__entry->grant_write_bytes); __entry->curr_cycle = log->l_curr_cycle; __entry->curr_block = log->l_curr_block; - __entry->tail_lsn = log->l_tail_lsn; + __entry->tail_lsn = atomic64_read(&log->l_tail_lsn); ), TP_printk("dev %d:%d type %s t_ocnt %u t_cnt %u t_curr_res %u " "t_unit_res %u t_flags %s reserveq %s " diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 70790eb..d118bf8 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -678,15 +678,11 @@ xfs_log_move_tail(xfs_mount_t *mp, if (tail_lsn == 0) tail_lsn = atomic64_read(&log->l_last_sync_lsn); - spin_lock(&log->l_grant_lock); - - /* Also an invalid lsn. 1 implies that we aren't passing in a valid - * tail_lsn. - */ - if (tail_lsn != 1) { - log->l_tail_lsn = tail_lsn; - } + /* tail_lsn == 1 implies that we weren't passed a valid value. */ + if (tail_lsn != 1) + atomic64_set(&log->l_tail_lsn, tail_lsn); + spin_lock(&log->l_grant_lock); if (!list_empty(&log->l_writeq)) { #ifdef DEBUG if (log->l_flags & XLOG_ACTIVE_RECOVERY) @@ -789,21 +785,19 @@ xfs_log_need_covered(xfs_mount_t *mp) * We may be holding the log iclog lock upon entering this routine. */ xfs_lsn_t -xlog_assign_tail_lsn(xfs_mount_t *mp) +xlog_assign_tail_lsn( + struct xfs_mount *mp) { - xfs_lsn_t tail_lsn; - xlog_t *log = mp->m_log; + xfs_lsn_t tail_lsn; + struct log *log = mp->m_log; tail_lsn = xfs_trans_ail_tail(mp->m_ail); - spin_lock(&log->l_grant_lock); if (!tail_lsn) tail_lsn = atomic64_read(&log->l_last_sync_lsn); - log->l_tail_lsn = tail_lsn; - spin_unlock(&log->l_grant_lock); + atomic64_set(&log->l_tail_lsn, tail_lsn); return tail_lsn; -} /* xlog_assign_tail_lsn */ - +} /* * Return the space in the log between the tail and the head. The head @@ -831,8 +825,8 @@ xlog_space_left( int head_bytes; xlog_crack_grant_head(head, &head_cycle, &head_bytes); - tail_bytes = BBTOB(BLOCK_LSN(log->l_tail_lsn)); - tail_cycle = CYCLE_LSN(log->l_tail_lsn); + xlog_crack_atomic_lsn(&log->l_tail_lsn, &tail_cycle, &tail_bytes); + tail_bytes = BBTOB(tail_bytes); if (tail_cycle == head_cycle && head_bytes >= tail_bytes) free_bytes = log->l_logsize - (head_bytes - tail_bytes); else if (tail_cycle + 1 < head_cycle) @@ -1009,8 +1003,8 @@ xlog_alloc_log(xfs_mount_t *mp, log->l_prev_block = -1; /* log->l_tail_lsn = 0x100000000LL; cycle = 1; current block = 0 */ - log->l_tail_lsn = xlog_assign_lsn(1, 0); - atomic64_set(&log->l_last_sync_lsn, xlog_assign_lsn(1, 0)); + xlog_assign_atomic_lsn(&log->l_tail_lsn, 1, 0); + xlog_assign_atomic_lsn(&log->l_last_sync_lsn, 1, 0); log->l_curr_cycle = 1; /* 0 is bad since this is initial value */ xlog_assign_grant_head(&log->l_grant_reserve_head, 1, 0); xlog_assign_grant_head(&log->l_grant_write_head, 1, 0); @@ -1189,7 +1183,6 @@ xlog_grant_push_ail( { xfs_lsn_t threshold_lsn = 0; xfs_lsn_t last_sync_lsn; - xfs_lsn_t tail_lsn; int free_blocks; int free_bytes; int threshold_block; @@ -1198,7 +1191,6 @@ xlog_grant_push_ail( ASSERT(BTOBB(need_bytes) < log->l_logBBsize); - tail_lsn = log->l_tail_lsn; free_bytes = xlog_space_left(log, &log->l_grant_reserve_head); free_blocks = BTOBBT(free_bytes); @@ -1213,8 +1205,9 @@ xlog_grant_push_ail( if (free_blocks >= free_threshold) return; - threshold_block = BLOCK_LSN(tail_lsn) + free_threshold; - threshold_cycle = CYCLE_LSN(tail_lsn); + xlog_crack_atomic_lsn(&log->l_tail_lsn, &threshold_cycle, + &threshold_block); + threshold_block += free_threshold; if (threshold_block >= log->l_logBBsize) { threshold_block -= log->l_logBBsize; threshold_cycle += 1; @@ -2828,11 +2821,11 @@ xlog_state_release_iclog( if (iclog->ic_state == XLOG_STATE_WANT_SYNC) { /* update tail before writing to iclog */ - xlog_assign_tail_lsn(log->l_mp); + xfs_lsn_t tail_lsn = xlog_assign_tail_lsn(log->l_mp); sync++; iclog->ic_state = XLOG_STATE_SYNCING; - iclog->ic_header.h_tail_lsn = cpu_to_be64(log->l_tail_lsn); - xlog_verify_tail_lsn(log, iclog, log->l_tail_lsn); + iclog->ic_header.h_tail_lsn = cpu_to_be64(tail_lsn); + xlog_verify_tail_lsn(log, iclog, tail_lsn); /* cycle incremented when incrementing curr_block */ } spin_unlock(&log->l_icloglock); @@ -3435,7 +3428,7 @@ STATIC void xlog_verify_grant_tail( struct log *log) { - xfs_lsn_t tail_lsn = log->l_tail_lsn; + int tail_cycle, tail_blocks; int cycle, space; /* @@ -3445,9 +3438,10 @@ xlog_verify_grant_tail( * check the byte count. */ xlog_crack_grant_head(&log->l_grant_write_head, &cycle, &space); - if (CYCLE_LSN(tail_lsn) != cycle) { - ASSERT(cycle - 1 == CYCLE_LSN(tail_lsn)); - ASSERT(space <= BBTOB(BLOCK_LSN(tail_lsn))); + xlog_crack_atomic_lsn(&log->l_tail_lsn, &tail_cycle, &tail_blocks); + if (tail_cycle != cycle) { + ASSERT(cycle - 1 == tail_cycle); + ASSERT(space <= BBTOB(tail_blocks)); } } diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index 958f356..d34af1c 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -53,7 +53,6 @@ struct xfs_mount; BTOBB(XLOG_MAX_ICLOGS << (xfs_sb_version_haslogv2(&log->l_mp->m_sb) ? \ XLOG_MAX_RECORD_BSHIFT : XLOG_BIG_RECORD_BSHIFT)) - static inline xfs_lsn_t xlog_assign_lsn(uint cycle, uint block) { return ((xfs_lsn_t)cycle << 32) | block; @@ -505,8 +504,6 @@ typedef struct log { * log entries" */ xlog_in_core_t *l_iclog; /* head log queue */ spinlock_t l_icloglock; /* grab to change iclog state */ - xfs_lsn_t l_tail_lsn; /* lsn of 1st LR with unflushed - * buffers */ int l_curr_cycle; /* Cycle number of log writes */ int l_prev_cycle; /* Cycle number before last * block increment */ @@ -521,12 +518,15 @@ typedef struct log { int64_t l_grant_write_head; /* - * l_last_sync_lsn is an atomic so it can be set and read without - * needing to hold specific locks. To avoid operations contending with - * other hot objects, place it on a separate cacheline. + * l_last_sync_lsn and l_tail_lsn are atomics so they can be set and + * read without needing to hold specific locks. To avoid operations + * contending with other hot objects, place each of them on a separate + * cacheline. */ /* lsn of last LR on disk */ atomic64_t l_last_sync_lsn ____cacheline_aligned_in_smp; + /* lsn of 1st LR with unflushed * buffers */ + atomic64_t l_tail_lsn ____cacheline_aligned_in_smp; /* The following field are used for debugging; need to hold icloglock */ #ifdef DEBUG @@ -566,6 +566,31 @@ int xlog_write(struct log *log, struct xfs_log_vec *log_vector, xlog_in_core_t **commit_iclog, uint flags); /* + * When we crack an atomic LSN, we sample it first so that the value will not + * change while we are cracking it into the component values. This means we + * will always get consistent component values to work from. This should always + * be used to smaple and crack LSNs taht are stored and updated in atomic + * variables. + */ +static inline void +xlog_crack_atomic_lsn(atomic64_t *lsn, uint *cycle, uint *block) +{ + xfs_lsn_t val = atomic64_read(lsn); + + *cycle = CYCLE_LSN(val); + *block = BLOCK_LSN(val); +} + +/* + * Calculate and assign a value to an atomic LSN variable from component pieces. + */ +static inline void +xlog_assign_atomic_lsn(atomic64_t *lsn, uint cycle, uint block) +{ + atomic64_set(lsn, xlog_assign_lsn(cycle, block)); +} + +/* * When we crack the grrant head, we sample it first so that the value will not * change while we are cracking it into the component values. This means we * will always get consistent component values to work from. diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 18e1e18..204d8e5 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -936,7 +936,7 @@ xlog_find_tail( log->l_curr_cycle = be32_to_cpu(rhead->h_cycle); if (found == 2) log->l_curr_cycle++; - log->l_tail_lsn = be64_to_cpu(rhead->h_tail_lsn); + atomic64_set(&log->l_tail_lsn, be64_to_cpu(rhead->h_tail_lsn)); atomic64_set(&log->l_last_sync_lsn, be64_to_cpu(rhead->h_lsn)); xlog_assign_grant_head(&log->l_grant_reserve_head, log->l_curr_cycle, BBTOB(log->l_curr_block)); @@ -971,7 +971,7 @@ xlog_find_tail( } after_umount_blk = (i + hblks + (int) BTOBB(be32_to_cpu(rhead->h_len))) % log->l_logBBsize; - tail_lsn = log->l_tail_lsn; + tail_lsn = atomic64_read(&log->l_tail_lsn); if (*head_blk == after_umount_blk && be32_to_cpu(rhead->h_num_logops) == 1) { umount_data_blk = (i + hblks) % log->l_logBBsize; @@ -986,12 +986,10 @@ xlog_find_tail( * log records will point recovery to after the * current unmount record. */ - log->l_tail_lsn = - xlog_assign_lsn(log->l_curr_cycle, - after_umount_blk); - atomic64_set(&log->l_last_sync_lsn, - xlog_assign_lsn(log->l_curr_cycle, - after_umount_blk)); + xlog_assign_atomic_lsn(&log->l_tail_lsn, + log->l_curr_cycle, after_umount_blk); + xlog_assign_atomic_lsn(&log->l_last_sync_lsn, + log->l_curr_cycle, after_umount_blk); *tail_blk = after_umount_blk; /* -- 1.7.2.3 From SRS0+Brkf+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:37 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7Sbeo244960 for ; Tue, 21 Dec 2010 01:28:37 -0600 X-ASG-Debug-ID: 1292916632-25d303bb0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 964F7212035 for ; Mon, 20 Dec 2010 23:30:33 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id dFN8aAPtqcxZwCCM for ; Mon, 20 Dec 2010 23:30:33 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50839323-1927428 for ; Tue, 21 Dec 2010 18:00:32 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfd-0001DO-4o for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:05 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfR-0006ZY-Px for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:29:53 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 18/34] xfs: reduce the number of AIL push wakeups Subject: [PATCH 18/34] xfs: reduce the number of AIL push wakeups Date: Tue, 21 Dec 2010 18:29:14 +1100 Message-Id: <1292916570-25015-19-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1292916634 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The xfaild often tries to rest to wait for congestion to pass of for IO to complete, but is regularly woken in tail-pushing situations. In severe cases, the xfsaild is getting woken tens of thousands of times a second. Reduce the number needless wakeups by only waking the xfsaild if the new target is larger than the old one. Further make short sleeps uninterruptible as they occur when the xfsaild has decided it needs to back off to allow some IO to complete and being woken early is counter-productive. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_super.c | 20 ++++++++++++++++---- 1 files changed, 16 insertions(+), 4 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index abcda07..6a12da3 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -834,8 +834,11 @@ xfsaild_wakeup( struct xfs_ail *ailp, xfs_lsn_t threshold_lsn) { - ailp->xa_target = threshold_lsn; - wake_up_process(ailp->xa_task); + /* only ever move the target forwards */ + if (XFS_LSN_CMP(threshold_lsn, ailp->xa_target) > 0) { + ailp->xa_target = threshold_lsn; + wake_up_process(ailp->xa_task); + } } STATIC int @@ -847,8 +850,17 @@ xfsaild( long tout = 0; /* milliseconds */ while (!kthread_should_stop()) { - schedule_timeout_interruptible(tout ? - msecs_to_jiffies(tout) : MAX_SCHEDULE_TIMEOUT); + /* + * for short sleeps indicating congestion, don't allow us to + * get woken early. Otherwise all we do is bang on the AIL lock + * without making progress. + */ + if (tout && tout <= 20) + __set_current_state(TASK_KILLABLE); + else + __set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(tout ? + msecs_to_jiffies(tout) : MAX_SCHEDULE_TIMEOUT); /* swsusp */ try_to_freeze(); -- 1.7.2.3 From SRS0+Brkf+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:43 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7ShAa245000 for ; Tue, 21 Dec 2010 01:28:43 -0600 X-ASG-Debug-ID: 1292916638-1efa03370000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 542081CE33DD for ; Mon, 20 Dec 2010 23:30:39 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id CmkzloHfFL5pAySt for ; Mon, 20 Dec 2010 23:30:39 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50839347-1927428 for ; Tue, 21 Dec 2010 18:00:38 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfx-0001EK-Us for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:25 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfm-0006aD-Ja for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:14 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 31/34] xfs: convert log grant heads to atomic variables Subject: [PATCH 31/34] xfs: convert log grant heads to atomic variables Date: Tue, 21 Dec 2010 18:29:27 +1100 Message-Id: <1292916570-25015-32-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1292916640 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Convert the log grant heads to atomic64_t types in preparation for converting the accounting algorithms to atomic operations. his patch just converts the variables; the algorithmic changes are in a separate patch for clarity. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_log.c | 8 ++++---- fs/xfs/xfs_log_priv.h | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index d118bf8..a1d7d12 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -47,7 +47,7 @@ STATIC xlog_t * xlog_alloc_log(xfs_mount_t *mp, xfs_buftarg_t *log_target, xfs_daddr_t blk_offset, int num_bblks); -STATIC int xlog_space_left(struct log *log, int64_t *head); +STATIC int xlog_space_left(struct log *log, atomic64_t *head); STATIC int xlog_sync(xlog_t *log, xlog_in_core_t *iclog); STATIC void xlog_dealloc_log(xlog_t *log); @@ -100,7 +100,7 @@ STATIC int xlog_iclogs_empty(xlog_t *log); static void xlog_grant_sub_space( struct log *log, - int64_t *head, + atomic64_t *head, int bytes) { int cycle, space; @@ -119,7 +119,7 @@ xlog_grant_sub_space( static void xlog_grant_add_space( struct log *log, - int64_t *head, + atomic64_t *head, int bytes) { int tmp; @@ -816,7 +816,7 @@ xlog_assign_tail_lsn( STATIC int xlog_space_left( struct log *log, - int64_t *head) + atomic64_t *head) { int free_bytes; int tail_bytes; diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index d34af1c..7619d6a 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -514,8 +514,8 @@ typedef struct log { spinlock_t l_grant_lock ____cacheline_aligned_in_smp; struct list_head l_reserveq; struct list_head l_writeq; - int64_t l_grant_reserve_head; - int64_t l_grant_write_head; + atomic64_t l_grant_reserve_head; + atomic64_t l_grant_write_head; /* * l_last_sync_lsn and l_tail_lsn are atomics so they can be set and @@ -596,18 +596,18 @@ xlog_assign_atomic_lsn(atomic64_t *lsn, uint cycle, uint block) * will always get consistent component values to work from. */ static inline void -xlog_crack_grant_head(int64_t *head, int *cycle, int *space) +xlog_crack_grant_head(atomic64_t *head, int *cycle, int *space) { - int64_t val = *head; + int64_t val = atomic64_read(head); *cycle = val >> 32; *space = val & 0xffffffff; } static inline void -xlog_assign_grant_head(int64_t *head, int cycle, int space) +xlog_assign_grant_head(atomic64_t *head, int cycle, int space) { - *head = ((int64_t)cycle << 32) | space; + atomic64_set(head, ((int64_t)cycle << 32) | space); } /* -- 1.7.2.3 From SRS0+CBlE+24+fromorbit.com=dave@internode.on.net Tue Dec 21 01:28:43 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL7Sgwv244997 for ; Tue, 21 Dec 2010 01:28:43 -0600 X-ASG-Debug-ID: 1292916638-35e5024b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 20A3A21203C for ; Mon, 20 Dec 2010 23:30:39 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id 4Sk7cbEWUm8f9y95 for ; Mon, 20 Dec 2010 23:30:39 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50434469-1927428 for ; Tue, 21 Dec 2010 18:00:38 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUwfx-0001EF-Pl for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:25 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUwfm-0006a0-Da for xfs@oss.sgi.com; Tue, 21 Dec 2010 18:30:14 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 28/34] xfs: make AIL tail pushing independent of the grant lock Subject: [PATCH 28/34] xfs: make AIL tail pushing independent of the grant lock Date: Tue, 21 Dec 2010 18:29:24 +1100 Message-Id: <1292916570-25015-29-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1292916640 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The xlog_grant_push_ail() currently takes the grant lock internally to sample the tail lsn, last sync lsn and the reserve grant head. Most of the callers already hold the grant lock but have to drop it before calling xlog_grant_push_ail(). This is a left over from when the AIL tail pushing was done in line and hence xlog_grant_push_ail had to drop the grant lock. AIL push is now done in another thread and hence we can safely hold the grant lock over the entire xlog_grant_push_ail call. Push the grant lock outside of xlog_grant_push_ail() to simplify the locking and synchronisation needed for tail pushing. This will reduce traffic on the grant lock by itself, but this is only one step in preparing for the complete removal of the grant lock. While there, clean up the formatting of xlog_grant_push_ail() to match the rest of the XFS code. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_log.c | 111 ++++++++++++++++++++++++++--------------------------- 1 files changed, 54 insertions(+), 57 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index cc0504e..1e2020d 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -70,7 +70,7 @@ STATIC void xlog_state_want_sync(xlog_t *log, xlog_in_core_t *iclog); /* local functions to manipulate grant head */ STATIC int xlog_grant_log_space(xlog_t *log, xlog_ticket_t *xtic); -STATIC void xlog_grant_push_ail(xfs_mount_t *mp, +STATIC void xlog_grant_push_ail(struct log *log, int need_bytes); STATIC void xlog_regrant_reserve_log_space(xlog_t *log, xlog_ticket_t *ticket); @@ -318,7 +318,9 @@ xfs_log_reserve( trace_xfs_log_reserve(log, internal_ticket); - xlog_grant_push_ail(mp, internal_ticket->t_unit_res); + spin_lock(&log->l_grant_lock); + xlog_grant_push_ail(log, internal_ticket->t_unit_res); + spin_unlock(&log->l_grant_lock); retval = xlog_regrant_write_log_space(log, internal_ticket); } else { /* may sleep if need to allocate more tickets */ @@ -332,9 +334,11 @@ xfs_log_reserve( trace_xfs_log_reserve(log, internal_ticket); - xlog_grant_push_ail(mp, + spin_lock(&log->l_grant_lock); + xlog_grant_push_ail(log, (internal_ticket->t_unit_res * internal_ticket->t_cnt)); + spin_unlock(&log->l_grant_lock); retval = xlog_grant_log_space(log, internal_ticket); } @@ -1185,59 +1189,58 @@ xlog_commit_record( * water mark. In this manner, we would be creating a low water mark. */ STATIC void -xlog_grant_push_ail(xfs_mount_t *mp, - int need_bytes) +xlog_grant_push_ail( + struct log *log, + int need_bytes) { - xlog_t *log = mp->m_log; /* pointer to the log */ - xfs_lsn_t tail_lsn; /* lsn of the log tail */ - xfs_lsn_t threshold_lsn = 0; /* lsn we'd like to be at */ - int free_blocks; /* free blocks left to write to */ - int free_bytes; /* free bytes left to write to */ - int threshold_block; /* block in lsn we'd like to be at */ - int threshold_cycle; /* lsn cycle we'd like to be at */ - int free_threshold; - - ASSERT(BTOBB(need_bytes) < log->l_logBBsize); - - spin_lock(&log->l_grant_lock); - free_bytes = xlog_space_left(log, &log->l_grant_reserve_head); - tail_lsn = log->l_tail_lsn; - free_blocks = BTOBBT(free_bytes); - - /* - * Set the threshold for the minimum number of free blocks in the - * log to the maximum of what the caller needs, one quarter of the - * log, and 256 blocks. - */ - free_threshold = BTOBB(need_bytes); - free_threshold = MAX(free_threshold, (log->l_logBBsize >> 2)); - free_threshold = MAX(free_threshold, 256); - if (free_blocks < free_threshold) { + xfs_lsn_t threshold_lsn = 0; + xfs_lsn_t tail_lsn; + int free_blocks; + int free_bytes; + int threshold_block; + int threshold_cycle; + int free_threshold; + + ASSERT(BTOBB(need_bytes) < log->l_logBBsize); + + tail_lsn = log->l_tail_lsn; + free_bytes = xlog_space_left(log, &log->l_grant_reserve_head); + free_blocks = BTOBBT(free_bytes); + + /* + * Set the threshold for the minimum number of free blocks in the + * log to the maximum of what the caller needs, one quarter of the + * log, and 256 blocks. + */ + free_threshold = BTOBB(need_bytes); + free_threshold = MAX(free_threshold, (log->l_logBBsize >> 2)); + free_threshold = MAX(free_threshold, 256); + if (free_blocks >= free_threshold) + return; + threshold_block = BLOCK_LSN(tail_lsn) + free_threshold; threshold_cycle = CYCLE_LSN(tail_lsn); if (threshold_block >= log->l_logBBsize) { - threshold_block -= log->l_logBBsize; - threshold_cycle += 1; + threshold_block -= log->l_logBBsize; + threshold_cycle += 1; } - threshold_lsn = xlog_assign_lsn(threshold_cycle, threshold_block); - - /* Don't pass in an lsn greater than the lsn of the last + threshold_lsn = xlog_assign_lsn(threshold_cycle, + threshold_block); + /* + * Don't pass in an lsn greater than the lsn of the last * log record known to be on disk. */ if (XFS_LSN_CMP(threshold_lsn, log->l_last_sync_lsn) > 0) - threshold_lsn = log->l_last_sync_lsn; - } - spin_unlock(&log->l_grant_lock); - - /* - * Get the transaction layer to kick the dirty buffers out to - * disk asynchronously. No point in trying to do this if - * the filesystem is shutting down. - */ - if (threshold_lsn && - !XLOG_FORCED_SHUTDOWN(log)) - xfs_trans_ail_push(log->l_ailp, threshold_lsn); -} /* xlog_grant_push_ail */ + threshold_lsn = log->l_last_sync_lsn; + + /* + * Get the transaction layer to kick the dirty buffers out to + * disk asynchronously. No point in trying to do this if + * the filesystem is shutting down. + */ + if (!XLOG_FORCED_SHUTDOWN(log)) + xfs_trans_ail_push(log->l_ailp, threshold_lsn); +} /* * The bdstrat callback function for log bufs. This gives us a central @@ -2543,9 +2546,7 @@ redo: trace_xfs_log_grant_sleep2(log, tic); - spin_unlock(&log->l_grant_lock); - xlog_grant_push_ail(log->l_mp, need_bytes); - spin_lock(&log->l_grant_lock); + xlog_grant_push_ail(log, need_bytes); XFS_STATS_INC(xs_sleep_logspace); xlog_wait(&tic->t_wait, &log->l_grant_lock); @@ -2641,9 +2642,7 @@ xlog_regrant_write_log_space(xlog_t *log, trace_xfs_log_regrant_write_sleep1(log, tic); - spin_unlock(&log->l_grant_lock); - xlog_grant_push_ail(log->l_mp, need_bytes); - spin_lock(&log->l_grant_lock); + xlog_grant_push_ail(log, need_bytes); XFS_STATS_INC(xs_sleep_logspace); xlog_wait(&tic->t_wait, &log->l_grant_lock); @@ -2666,9 +2665,7 @@ redo: if (free_bytes < need_bytes) { if (list_empty(&tic->t_queue)) list_add_tail(&tic->t_queue, &log->l_writeq); - spin_unlock(&log->l_grant_lock); - xlog_grant_push_ail(log->l_mp, need_bytes); - spin_lock(&log->l_grant_lock); + xlog_grant_push_ail(log, need_bytes); XFS_STATS_INC(xs_sleep_logspace); trace_xfs_log_regrant_write_sleep2(log, tic); -- 1.7.2.3 From SRS0+CBlE+24+fromorbit.com=dave@internode.on.net Tue Dec 21 03:00:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_66,J_CHICKENPOX_92 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL90Ki4254476 for ; Tue, 21 Dec 2010 03:00:20 -0600 X-ASG-Debug-ID: 1292922135-741e015b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 589191470507 for ; Tue, 21 Dec 2010 01:02:16 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id hY844XXHfzt32D3n for ; Tue, 21 Dec 2010 01:02:16 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50441909-1927428 for ; Tue, 21 Dec 2010 19:32:14 +1030 (CDT) Received: from chute ([192.168.1.1] helo=disappointment) by dastard with esmtp (Exim 4.72) (envelope-from ) id 1PUy6m-0001NB-Fq for xfs@oss.sgi.com; Tue, 21 Dec 2010 20:02:12 +1100 Received: from dave by disappointment with local (Exim 4.72) (envelope-from ) id 1PUy6a-0007Nx-Hu for xfs@oss.sgi.com; Tue, 21 Dec 2010 20:02:00 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfsqa: make hole tests independent of speculative allocation patterns Subject: [PATCH] xfsqa: make hole tests independent of speculative allocation patterns Date: Tue, 21 Dec 2010 20:02:00 +1100 Message-Id: <1292922120-28360-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.2.3 X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1292922137 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50058 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Many of the "count-the-holes" tests (008, 012, etc) do writes that extend the file and hence allocation patterns are dependent on speculative allocation beyond EOF behaviour. Hence if we change that behaviour, these tests all fail because there is a different pattern of holes. Make the tests independent of EOF preallocation behaviour by first truncating the file to the size the test is defined to use. This prevents speculative prealocation from occurring, and hence changes in such behaviour will not cause the tests to fail. Signed-off-by: Dave Chinner --- 203 | 4 ++++ src/holes.c | 11 +++++++++++ src/randholes.c | 10 ++++++++++ 3 files changed, 25 insertions(+), 0 deletions(-) diff --git a/203 b/203 index 6fae361..be69dfa 100755 --- a/203 +++ b/203 @@ -36,6 +36,10 @@ _write_holes() file=$1 holes=$2 let writes=$holes+1 + let fsize=$(($writes * 0x100000)) + + # prevent EOF preallocation from affecting results + xfs_io -f $file -c "truncate $fsize" offset=0 for i in `seq 0 $writes`; do diff --git a/src/holes.c b/src/holes.c index 1ad5093..3be8a66 100644 --- a/src/holes.c +++ b/src/holes.c @@ -79,6 +79,17 @@ main(int argc, char *argv[]) perror("open"); return 1; } + + /* + * Avoid allocation patterns being perturbed by different speculative + * preallocation beyond EOF configurations by first truncating the file + * to the expected maximum file size. + */ + if (ftruncate(fd, filesize) < 0) { + perror("ftruncate"); + exit(EXIT_FAILURE); + } + for (i = 0; i < count; i++) { writeblks(fd, filesize, blocksize, interleave, i, rev); } diff --git a/src/randholes.c b/src/randholes.c index b7c89b3..b43da81 100644 --- a/src/randholes.c +++ b/src/randholes.c @@ -208,6 +208,16 @@ writeblks(char *fname, int fd, size_t alignment) memset(buffer, 0, blocksize); } + /* + * Avoid allocation patterns being perturbed by different speculative + * preallocation beyond EOF configurations by first truncating the file + * to the expected maximum file size. + */ + if (ftruncate(fd, filesize) < 0) { + perror("ftruncate"); + exit(EXIT_FAILURE); + } + do { if (verbose && ((count % 100) == 0)) { printf("."); -- 1.7.2.3 From melvin@healthyfirst.com Tue Dec 21 03:31:47 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.0 required=5.0 tests=BAYES_99 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBL9VlNn258521 for ; Tue, 21 Dec 2010 03:31:47 -0600 X-ASG-Debug-ID: 1292924022-415b00570000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from webserver.webnicc.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B97021CE351F for ; Tue, 21 Dec 2010 01:33:42 -0800 (PST) Received: from webserver.webnicc.com ([202.190.70.202]) by cuda.sgi.com with ESMTP id evQKpdUNJ5BRFGAt for ; Tue, 21 Dec 2010 01:33:42 -0800 (PST) Received: from cm132.zeta204.maxonline.com.sg ([116.87.204.132] helo=[192.168.0.100]) by webserver.webnicc.com with esmtpa (Exim 4.67) (envelope-from ) id 1PUybE-00049U-Bz for linux-xfs@oss.sgi.com; Tue, 21 Dec 2010 17:33:40 +0800 Message-Id: Mime-Version: 1.0 From: "Melvin" To: "Brian Tan" X-ASG-Orig-Subj: Magnum 4D Jackpot 1 Winning Formula! Subject: Magnum 4D Jackpot 1 Winning Formula! Date: Tue, 21 Dec 2010 17:33:39 +0800 X-Bounce-Tracking-Info: Content-type: text/plain; charset=iso-8859-1; format=flowed Content-transfer-encoding: quoted-printable X-Antivirus-Scanner: Clean mail though you should still use an Antivirus X-Barracuda-Connect: UNKNOWN[202.190.70.202] X-Barracuda-Start-Time: 1292924023 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4755 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50061 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi 4D Friend, STOP DREAMING OF WINNING THE 4D TOP 3 PRIZE! Start winning it NOW!=2E=2E=2E and win it DIRECTLY=2E No System, Box or wha= tsoever=2E With this amazing 4D Top 3 winning online services, winning the Direct Top = 3 becomes reality=2E If you are serious about winning the Top 3, then do yourself a favour and c= heck it out for yourself=2E http://www=2Esmart4d123=2Ecom/index=2Ephp?afid=3D2 You must see it to believe it=2E=2E=2E it will definately change the way you play the game=2E=2E=2EFOREVER! http://www=2Esmart4d123=2Ecom/index=2Ephp?afid=3D2 I will see you there! Melvin From lczerner@redhat.com Tue Dec 21 04:39:55 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBLAdt3n007006 for ; Tue, 21 Dec 2010 04:39:55 -0600 X-ASG-Debug-ID: 1292928112-417003290000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3F9601CE3B30 for ; Tue, 21 Dec 2010 02:41:52 -0800 (PST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id vHTl7bDpcwQSlBVC for ; Tue, 21 Dec 2010 02:41:52 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation 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.13.8/8.13.8) with ESMTP id oBLAfjBJ006492 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 21 Dec 2010 05:41:46 -0500 Received: from dhcp-lab-213.englab.brq.redhat.com (dhcp-27-109.brq.redhat.com [10.34.27.109]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id oBLAfgC6009228 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 21 Dec 2010 05:41:44 -0500 Date: Tue, 21 Dec 2010 11:41:42 +0100 (CET) From: Lukas Czerner X-X-Sender: lukas@dhcp-lab-213.englab.brq.redhat.com To: Christoph Hellwig cc: Lukas Czerner , xfs@oss.sgi.com, esandeen@redhat.com X-ASG-Orig-Subj: Re: [PATCH] Add test 248: Check filesystem FITRIM implementation Subject: Re: [PATCH] Add test 248: Check filesystem FITRIM implementation In-Reply-To: <20101220174146.GA32680@infradead.org> Message-ID: References: <1291996407-26251-1-git-send-email-lczerner@redhat.com> <20101220174146.GA32680@infradead.org> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1292928113 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, 20 Dec 2010, Christoph Hellwig wrote: > Hi Lukas, > > I've looked over it a bit again, and I can't really comment on the code > too much, as my bash fu is nowhere near a level to actually make sense > of most of the testcase. I have however ran it in a few setups and > can comment based on that. > > First your current first discard to check if we actually support it is > not handled correctly. Running the test on a filesystem that doesn't > support it currently fails the test for me with: > > @@ -1,3 +1,2 @@ > QA output created by 249 > -Checking FITRIM support: done. > -Running the test: done. > +Checking FITRIM support: fstrim: FSTRIM: Inappropriate ioctl for device > > This should be easily fixable by redirecting the output of the test > command to /dev/null and do a _notrun if it exited with an error value, > just like other tests that require non-standard behaviour. > > Second using data from /usr/share/doc seems a bit non-deterministic to > me, as the content will be different on every system. Any chance you > could just use the xfstests source code instead? > > Third the testcase runs forever, e.g. 93 minutes in my KVM setup, even > using a no-op discard implementation. While this is useful for burn in > testing having a shorter run time version that can be run automatically > would be really useful. I tried to figure out what paramters control > the runtime, but as mentioned above my bash skill really aren't enough > to do that. You can lower the "nproc" variable, optionally you can also lower "repeat" variable in run_process(). Hi Christoph, thanks a lot for review. I certainly can use xfstests source code, so I'll change that. Regarding the duration of the test, it is kind of hard to determine the right amount of load, because the devices and machines differs a lot. It also involves a LOT of copying files so I guess it might be a little slow. However I need to be careful with reducing number of concurrent processes, because with less stress it might be harder to hit potential problem. (you can always But I'll try to test it an find just the right balance. Thanks again. -Lukas From karn@philkarn.net Tue Dec 21 05:01:27 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=3.0 required=5.0 tests=BAYES_20,HTML_MESSAGE autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBLB1R2I010443 for ; Tue, 21 Dec 2010 05:01:27 -0600 X-ASG-Debug-ID: 1292929403-140400b70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-fx0-f50.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9AC991CDD7DE for ; Tue, 21 Dec 2010 03:03:24 -0800 (PST) Received: from mail-fx0-f50.google.com (mail-fx0-f50.google.com [209.85.161.50]) by cuda.sgi.com with ESMTP id IWMDzCgXIcALq7t8 for ; Tue, 21 Dec 2010 03:03:24 -0800 (PST) Received: by fxm14 with SMTP id 14so3848638fxm.37 for ; Tue, 21 Dec 2010 03:03:23 -0800 (PST) Received: by 10.223.106.134 with SMTP id x6mr1763283fao.73.1292929403306; Tue, 21 Dec 2010 03:03:23 -0800 (PST) MIME-Version: 1.0 Received: by 10.223.122.78 with HTTP; Tue, 21 Dec 2010 03:03:03 -0800 (PST) Reply-To: karn@ka9q.net In-Reply-To: References: <1291996407-26251-1-git-send-email-lczerner@redhat.com> <20101220174146.GA32680@infradead.org> From: Phil Karn Date: Tue, 21 Dec 2010 03:03:03 -0800 Message-ID: X-ASG-Orig-Subj: Re: [PATCH] Add test 248: Check filesystem FITRIM implementation Subject: Re: [PATCH] Add test 248: Check filesystem FITRIM implementation To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001636c5b4d8cdc4460497e995db X-Barracuda-Connect: mail-fx0-f50.google.com[209.85.161.50] X-Barracuda-Start-Time: 1292929404 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0209 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50067 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --001636c5b4d8cdc4460497e995db Content-Type: text/plain; charset=UTF-8 What is the plan for TRIM support in XFS? I don't see any mention in the 2.6.36.2 sources, so I guess the code you guys have been discussing must not be considered stable yet. How will it eventually work? Will the filesystem automatically issue the commands to the drive whenever a file is deleted, or will it always require some sort of prodding from a userspace program? And what kind of experiences are people having with XFS on current SSDs? I just put an Intel drive in my newly upgraded box and I'm wondering if this blazing performance will screech to a halt when my cumulative writes exceed its 120 GB capacity. Does anyone have a standalone "drive optimizer" that understands XFS, i.e, that can examine an unmounted file system and issue the appropriate TRIM commands for every block on the free list? Or is the Intel drive somehow really good at avoiding write amplification even without TRIM help from the file system? I've heard that may be the case, but I don't understand how that can be. Phil --001636c5b4d8cdc4460497e995db Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable What is the plan for TRIM support in XFS? I don't see any mention in th= e 2.6.36.2 sources, so I guess the code you guys have been discussing must = not be considered stable yet.

How will it eventually work? Will the = filesystem automatically issue the commands to the drive whenever a file is= deleted, or will it always require some sort of prodding from a userspace = program?

And what kind of experiences are people having with XFS on current SSDs= ? I just put an Intel drive in my newly upgraded box and I'm wondering = if this blazing performance will screech to a halt when my cumulative write= s exceed its 120 GB capacity. Does anyone have a standalone "drive opt= imizer" that understands XFS, i.e, that can examine an unmounted file = system and issue the appropriate TRIM commands for every block on the free = list?

Or is the Intel drive somehow really good at avoiding write amplificati= on even without TRIM help from the file system? I've heard that may be = the case, but I don't understand how that can be.

Phil

--001636c5b4d8cdc4460497e995db-- From BATV+4df0dc983a175be70c99+2676+infradead.org+hch@bombadil.srs.infradead.org Tue Dec 21 05:20:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBLBKROF013463 for ; Tue, 21 Dec 2010 05:20:28 -0600 X-ASG-Debug-ID: 1292930545-65ca01880000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7AD6814709FF for ; Tue, 21 Dec 2010 03:22:25 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id lhOEY0iOu6l2BCbh for ; Tue, 21 Dec 2010 03:22:25 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PV0IS-0000So-9z; Tue, 21 Dec 2010 11:22:24 +0000 Date: Tue, 21 Dec 2010 06:22:24 -0500 From: Christoph Hellwig To: karn@ka9q.net Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] Add test 248: Check filesystem FITRIM implementation Subject: Re: [PATCH] Add test 248: Check filesystem FITRIM implementation Message-ID: <20101221112224.GA30242@infradead.org> References: <1291996407-26251-1-git-send-email-lczerner@redhat.com> <20101220174146.GA32680@infradead.org> 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-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1292930545 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 21, 2010 at 03:03:03AM -0800, Phil Karn wrote: > What is the plan for TRIM support in XFS? I don't see any mention in the > 2.6.36.2 sources, so I guess the code you guys have been discussing must not > be considered stable yet. > > How will it eventually work? Will the filesystem automatically issue the > commands to the drive whenever a file is deleted, or will it always require > some sort of prodding from a userspace program? I submitted a patch to add FITRIM support, which should go into 2.6.38 if I get a positive review. That is the variant that is triggered by the fstim userspace program and what the test we're discussing here exercises. I've also prototyped various forms of online discard, but none of them is quite ready yet. I've started porting some allocator patches from Dave forward, which are a requirement for reliable online discard. After that I need to decide which of the variants we'll actually use. So far the "dumb" discard at transaction commit time shows the best results. > And what kind of experiences are people having with XFS on current SSDs? I > just put an Intel drive in my newly upgraded box and I'm wondering if this > blazing performance will screech to a halt when my cumulative writes exceed > its 120 GB capacity. Does anyone have a standalone "drive optimizer" that > understands XFS, i.e, that can examine an unmounted file system and issue > the appropriate TRIM commands for every block on the free list? The intel SSDs do quite fine without constant trimming, as do most current SSDs. I only know of one sample that areally needs periodic trims, but AFAIK it's not generally available yet (sorry, can't name the vendor due to NDAs). But even with the current ones a TRIM once in a while is useful, but about once every couple of weeks is enough. For a system not constantly loaded you can use Mark Lord's wiper.sh script, but be aware it only works on disks / partitions and not on LVM volumes. Once the FITRIM support is in you can use that for the same purpose, with the benefit of also working over LVM, and also working nicely on a system under heavy use, as it doesn't have to allocate all free space as the userspace hack done by wiper.sh does. > Or is the Intel drive somehow really good at avoiding write amplification > even without TRIM help from the file system? I've heard that may be the > case, but I don't understand how that can be. No, the Intel disks actually degrade a lot after heavy use. Unfortunately even regular trims don't always seem to solve this. From bharrosh@panasas.com Tue Dec 21 05:30:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBLBUYcw014126 for ; Tue, 21 Dec 2010 05:30:35 -0600 X-ASG-Debug-ID: 1292931151-657102910000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from daytona.panasas.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8DA092126F4 for ; Tue, 21 Dec 2010 03:32:31 -0800 (PST) Received: from daytona.panasas.com (daytona.panasas.com [67.152.220.89]) by cuda.sgi.com with ESMTP id orYCTGI49DG58tGA for ; Tue, 21 Dec 2010 03:32:31 -0800 (PST) Received: from fs2.bhalevy.com ([172.17.33.36]) by daytona.panasas.com with Microsoft SMTPSVC(6.0.3790.4675); Tue, 21 Dec 2010 06:32:25 -0500 Message-ID: <4D109047.8050300@panasas.com> Date: Tue, 21 Dec 2010 13:32:23 +0200 From: Boaz Harrosh User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.15) Gecko/20101027 Fedora/3.0.10-1.fc12 Thunderbird/3.0.10 MIME-Version: 1.0 To: Christoph Hellwig CC: xfs@oss.sgi.com, linux-kernel@vger.kernel.org X-ASG-Orig-Subj: Re: XFS status update for November 2010 Subject: Re: XFS status update for November 2010 References: <20101220180013.GA16283@infradead.org> In-Reply-To: <20101220180013.GA16283@infradead.org> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 21 Dec 2010 11:32:25.0246 (UTC) FILETIME=[BD8EF3E0:01CBA102] X-Barracuda-Connect: daytona.panasas.com[67.152.220.89] X-Barracuda-Start-Time: 1292931152 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50069 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 12/20/2010 08:00 PM, Christoph Hellwig wrote: >>From looking at the kernel git commits November looked like a pretty > slow month with just two hand full fixes going into the release candidates > for Linux 2.6.37, and none at all going into the development tree. > But in this case git statistics didn't tell the whole story - there > was a lot of activity on patches for the next merge window on the list. > The focus in November was still at metadata scalability, with various > patchsets that improves parallel creates and unlinks again, and also > improves 8-way dbench throughput by 30%. In addition to that there > were patches to improve preallocation for NFS servers, to simplify > the writeback code, and to remove the XFS-internal percpu counters > for free space for the generic kernel percpu counters, which just needed > a small improvement. > > On the user space side we saw the release of xfsprogs 3.1.4, which > contains various accumulated bug fixes and Debian packaging updates. > The xfsdump tree saw a large update to speed up restore by using > mmap for an internal database and remove the limitation of ~ 214 > million directory entries per dump file. The xfstests test suite > saw three new testcases and various fixes, including support for the > hfsplus filesystem. Hi Christoph, happy holidays I love these reports you do, thank you I have one small request, could you please post them to linux-fsdevel as well. linux-kernel@vger.kernel.org is so crowded I keep missing them. Thanks Boaz From yad.naveen@gmail.com Tue Dec 21 08:09:56 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBLE9tQO036700 for ; Tue, 21 Dec 2010 08:09:55 -0600 X-ASG-Debug-ID: 1292940711-493d039f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-qw0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0C44A1611FF3 for ; Tue, 21 Dec 2010 06:11:51 -0800 (PST) Received: from mail-qw0-f53.google.com (mail-qw0-f53.google.com [209.85.216.53]) by cuda.sgi.com with ESMTP id tXb50OfuUmdGKnzG for ; Tue, 21 Dec 2010 06:11:51 -0800 (PST) Received: by qwe5 with SMTP id 5so4346703qwe.26 for ; Tue, 21 Dec 2010 06:11:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:content-type; bh=K6wTkgBtODBSYSLl/Acncznelt0x3HZ++VBlz1YBAPw=; b=U1HukO7Zi0S4jbyqmkFrndCkGufjgSOu/Q0Z3EuOBIAMgVPAH/+fxbTdY80qBJgSd3 aSEKI90Cv+87UY9ylSEZThC3ki+pXLTU9jzrNo7g96pKArhb5OVqluIKk07DtyH/JeBA 01A3xjCdKJVE6CM79mRE7vTjnVy8px41cVjHM= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; b=dWj6f4t/FEX1D1W/EyDQOWg8WVbEg9HltfWfuQnhwUrt9ZYEyvjB08RZVS8z0N3rAw rCxV0nZND4Fjc++9Opi3MTEMmpuNJ1ZSukfLEVF+Ti3OuUset7kPYxfdztZ9GC2SyvNl eV2wI72YaVccpswVV3E159atw2w/yLPHmsgxw= MIME-Version: 1.0 Received: by 10.229.184.13 with SMTP id ci13mr4858193qcb.134.1292940711293; Tue, 21 Dec 2010 06:11:51 -0800 (PST) Received: by 10.229.75.13 with HTTP; Tue, 21 Dec 2010 06:11:51 -0800 (PST) In-Reply-To: References: Date: Tue, 21 Dec 2010 19:41:51 +0530 Message-ID: X-ASG-Orig-Subj: Issue on kernel 2.6.35.9 vanilla Subject: Issue on kernel 2.6.35.9 vanilla From: naveen yadav To: xfs@oss.sgi.com Content-Type: multipart/mixed; boundary=0016363b9292cff2dd0497ec37b8 X-Barracuda-Connect: mail-qw0-f53.google.com[209.85.216.53] X-Barracuda-Start-Time: 1292940713 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50080 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_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --0016363b9292cff2dd0497ec37b8 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Hi all, We have one disk that got corrupted, when I connect to my PC, haveing kernel version(2.6.35.9). The Disk mount well, but when i do 'ls; command it hangs. Please find the dmesg. /0x22 [xfs] =A0[] xfs_da_do_buf+0x582/0x628 [xfs] =A0[] ? xfs_da_read_buf+0x1d/0x22 [xfs] =A0[] ? xfs_da_node_lookup_int+0x52/0x207 [xfs] =A0[] ? xfs_da_read_buf+0x1d/0x22 [xfs] =A0[] xfs_da_read_buf+0x1d/0x22 [xfs] =A0[] ? xfs_da_node_lookup_int+0x52/0x207 [xfs] =A0[] xfs_da_node_lookup_int+0x52/0x207 [xfs] =A0[] xfs_dir2_node_lookup+0x5f/0xee [xfs] =A0[] xfs_dir_lookup+0xde/0x110 [xfs] =A0[] xfs_lookup+0x50/0x9f [xfs] =A0[] xfs_vn_lookup+0x3e/0x76 [xfs] =A0[] do_lookup+0xc9/0x139 =A0[] link_path_walk+0x326/0x44d =A0[] ? default_wake_function+0x10/0x12 =A0[] path_walk+0x3f/0x89 =A0[] ? path_init+0x9e/0x10c =A0[] do_path_lookup+0x26/0x74 =A0[] user_path_at+0x46/0x6c =A0[] ? remove_wait_queue+0x27/0x2c =A0[] ? spin_unlock_irqrestore+0xd/0xf =A0[] ? __wake_up+0x37/0x40 =A0[] vfs_fstatat+0x32/0x59 =A0[] ? fsnotify_modify+0x54/0x5f =A0[] vfs_lstat+0x1b/0x1d =A0[] sys_lstat64+0x19/0x2d =A0[] ? vfs_write+0xb5/0xf4 =A0[] ? audit_syscall_entry+0x12a/0x14c =A0[] ? trace_hardirqs_on_thunk+0xc/0x10 =A0[] sysenter_do_call+0x12/0x2d c2d9d000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff =A0..............= .. Filesystem "sdb2": XFS internal error xfs_da_do_buf(2) at line 2113 of file fs/xfs/xfs_da_btree.c. =A0Caller 0xe0dfd3ce Pid: 2199, comm: ls Not tainted 2.6.35.9 #1 Call Trace: =A0[] xfs_error_report+0x31/0x33 [xfs] =A0[] xfs_corruption_error+0x3e/0x48 [xfs] =A0[] ? xfs_da_read_buf+0x1d/0x22 [xfs] =A0[] xfs_da_do_buf+0x582/0x628 [xfs] =A0[] ? xfs_da_read_buf+0x1d/0x22 [xfs] =A0[] ? xfs_da_node_lookup_int+0x52/0x207 [xfs] =A0[] ? xfs_da_read_buf+0x1d/0x22 [xfs] =A0[] xfs_da_read_buf+0x1d/0x22 [xfs] =A0[] ? xfs_da_node_lookup_int+0x52/0x207 [xfs] =A0[] xfs_da_node_lookup_int+0x52/0x207 [xfs] =A0[] xfs_dir2_node_lookup+0x5f/0xee [xfs] =A0[] xfs_dir_lookup+0xde/0x110 [xfs] =A0[] xfs_lookup+0x50/0x9f [xfs] =A0[] xfs_vn_lookup+0x3e/0x76 [xfs] =A0[] do_lookup+0xc9/0x139 =A0[] link_path_walk+0x326/0x44d --0016363b9292cff2dd0497ec37b8 Content-Type: application/octet-stream; name="log-2.6.35.9-ls-hang" Content-Disposition: attachment; filename="log-2.6.35.9-ls-hang" Content-Transfer-Encoding: base64 X-Attachment-Id: f_ghyv9zqs1 U0VMaW51eDogaW5pdGlhbGl6ZWQgKGRldiBzZGIxLCB0eXBlIHZmYXQpLCB1c2VzIGdlbmZzX2Nv bnRleHRzClhGUyBtb3VudGluZyBmaWxlc3lzdGVtIHNkYjIKU3RhcnRpbmcgWEZTIHJlY292ZXJ5 IG9uIGZpbGVzeXN0ZW06IHNkYjIgKGxvZ2RldjogaW50ZXJuYWwpCkVuZGluZyBYRlMgcmVjb3Zl cnkgb24gZmlsZXN5c3RlbTogc2RiMiAobG9nZGV2OiBpbnRlcm5hbCkKU0VMaW51eDogaW5pdGlh bGl6ZWQgKGRldiBzZGIyLCB0eXBlIHhmcyksIHVzZXMgeGF0dHIKdXNiIDEtMjogVVNCIGRpc2Nv bm5lY3QsIGFkZHJlc3MgOAp1c2IgMS0yOiBuZXcgaGlnaCBzcGVlZCBVU0IgZGV2aWNlIHVzaW5n IGVoY2lfaGNkIGFuZCBhZGRyZXNzIDkKdXNiIDEtMjogTmV3IFVTQiBkZXZpY2UgZm91bmQsIGlk VmVuZG9yPTA3ODEsIGlkUHJvZHVjdD01NTY3CnVzYiAxLTI6IE5ldyBVU0IgZGV2aWNlIHN0cmlu Z3M6IE1mcj0xLCBQcm9kdWN0PTIsIFNlcmlhbE51bWJlcj0zCnVzYiAxLTI6IFByb2R1Y3Q6IENy dXplciBCbGFkZQp1c2IgMS0yOiBNYW51ZmFjdHVyZXI6IFNhbkRpc2sKdXNiIDEtMjogU2VyaWFs TnVtYmVyOiAyMDA1MzE0NjMwMTYwQzYwMTRDNgpzY3NpMTAgOiB1c2Itc3RvcmFnZSAxLTI6MS4w CnNjc2kgMTA6MDowOjA6IERpcmVjdC1BY2Nlc3MgICAgIFNhbkRpc2sgIENydXplciBCbGFkZSAg ICAgMS4wMCBQUTogMCBBTlNJOiAyCnNkIDEwOjA6MDowOiBBdHRhY2hlZCBzY3NpIGdlbmVyaWMg c2cxIHR5cGUgMApzZCAxMDowOjA6MDogW3NkYl0gMTU2MjUyMTYgNTEyLWJ5dGUgbG9naWNhbCBi bG9ja3M6ICg4LjAwIEdCLzcuNDUgR2lCKQpzZCAxMDowOjA6MDogW3NkYl0gV3JpdGUgUHJvdGVj dCBpcyBvZmYKc2QgMTA6MDowOjA6IFtzZGJdIE1vZGUgU2Vuc2U6IDAzIDAwIDAwIDAwCnNkIDEw OjA6MDowOiBbc2RiXSBBc3N1bWluZyBkcml2ZSBjYWNoZTogd3JpdGUgdGhyb3VnaApzZCAxMDow OjA6MDogW3NkYl0gQXNzdW1pbmcgZHJpdmUgY2FjaGU6IHdyaXRlIHRocm91Z2gKIHNkYjogc2Ri MSBzZGIyCnNkIDEwOjA6MDowOiBbc2RiXSBBc3N1bWluZyBkcml2ZSBjYWNoZTogd3JpdGUgdGhy b3VnaApzZCAxMDowOjA6MDogW3NkYl0gQXR0YWNoZWQgU0NTSSByZW1vdmFibGUgZGlzawpYRlMg bW91bnRpbmcgZmlsZXN5c3RlbSBzZGIyClNFTGludXg6IGluaXRpYWxpemVkIChkZXYgc2RiMSwg dHlwZSB2ZmF0KSwgdXNlcyBnZW5mc19jb250ZXh0cwpTdGFydGluZyBYRlMgcmVjb3Zlcnkgb24g ZmlsZXN5c3RlbTogc2RiMiAobG9nZGV2OiBpbnRlcm5hbCkKRW5kaW5nIFhGUyByZWNvdmVyeSBv biBmaWxlc3lzdGVtOiBzZGIyIChsb2dkZXY6IGludGVybmFsKQpTRUxpbnV4OiBpbml0aWFsaXpl ZCAoZGV2IHNkYjIsIHR5cGUgeGZzKSwgdXNlcyB4YXR0cgpJTkZPOiB0YXNrIGd2ZnMtZ2R1LXZv bHVtZTo3NTE0IGJsb2NrZWQgZm9yIG1vcmUgdGhhbiAxMjAgc2Vjb25kcy4KImVjaG8gMCA+IC9w cm9jL3N5cy9rZXJuZWwvaHVuZ190YXNrX3RpbWVvdXRfc2VjcyIgZGlzYWJsZXMgdGhpcyBtZXNz YWdlLgpndmZzLWdkdS12b2x1IEQgMDAwMDQ0NjUgICAgIDAgIDc1MTQgICAgICAxIDB4MDAwMDAw ODAKIGQ5NmM1YjJjIDAwMDAwMDg2IGQ1ZTgxZmNmIDAwMDA0NDY1IGMwYTI1ZTAwIGMwYTI1ZTAw IGMwYTI1ZTAwIGMwYTI1ZTAwCiBkZTU1ZGMzNCBjMGEyNWUwMCBjMGEyNWUwMCAwMDAwZDI4NSAw MDAwMDAwMCBjZDYzOTIwMCAwMDAwNDQ2NSBkZTU1ZDliMAogMDIwMDAwMDAgZGQ0MjMyMDggZGQ0 MjMyMDAgN2ZmZmZmZmYgN2ZmZmZmZmYgZDk2YzViNzAgYzA3ODFjNDMgMDAwMDAwMDAKQ2FsbCBU cmFjZToKIFs8YzA3ODFjNDM+XSBzY2hlZHVsZV90aW1lb3V0KzB4MWIvMHg5NQogWzxjMDc4MjRk MT5dIF9fZG93bl9jb21tb24rMHg4Mi8weGI5CiBbPGUwZTI4YWU4Pl0gPyBfeGZzX2J1Zl9maW5k KzB4MTIyLzB4MWI4IFt4ZnNdCiBbPGMwNzgyNTY3Pl0gX19kb3duKzB4MTcvMHgxOQogWzxjMDQ1 ODI3Yz5dIGRvd24rMHgyNy8weDM3CiBbPGUwZTI3OGRhPl0geGZzX2J1Zl9sb2NrKzB4NjcvMHg5 MyBbeGZzXQogWzxlMGUyOGFlOD5dIF94ZnNfYnVmX2ZpbmQrMHgxMjIvMHgxYjggW3hmc10KIFs8 ZTBlMjhiZGU+XSB4ZnNfYnVmX2dldCsweDYwLzB4MTQ5IFt4ZnNdCiBbPGUwZTI4Y2U5Pl0geGZz X2J1Zl9yZWFkKzB4MjIvMHhiMCBbeGZzXQogWzxlMGUxZmZhOT5dIHhmc190cmFuc19yZWFkX2J1 ZisweDUzLzB4MmU5IFt4ZnNdCiBbPGUwZGZkMTUxPl0geGZzX2RhX2RvX2J1ZisweDQxMS8weDYy OCBbeGZzXQogWzxlMGRmZTBkMz5dID8geGZzX2RhX25vZGVfbG9va3VwX2ludCsweDUyLzB4MjA3 IFt4ZnNdCiBbPGUwZGZkM2NlPl0geGZzX2RhX3JlYWRfYnVmKzB4MWQvMHgyMiBbeGZzXQogWzxl MGRmZTBkMz5dID8geGZzX2RhX25vZGVfbG9va3VwX2ludCsweDUyLzB4MjA3IFt4ZnNdCiBbPGUw ZGZlMGQzPl0geGZzX2RhX25vZGVfbG9va3VwX2ludCsweDUyLzB4MjA3IFt4ZnNdCiBbPGUwZTAz ODg4Pl0geGZzX2RpcjJfbm9kZV9sb29rdXArMHg1Zi8weGVlIFt4ZnNdCiBbPGUwZGZmMjZhPl0g eGZzX2Rpcl9sb29rdXArMHhkZS8weDExMCBbeGZzXQogWzxlMGUyMmMwYT5dIHhmc19sb29rdXAr MHg1MC8weDlmIFt4ZnNdCiBbPGUwZTJjNWE2Pl0geGZzX3ZuX2xvb2t1cCsweDNlLzB4NzYgW3hm c10KIFs8YzA0ZGEzYjI+XSBkb19sb29rdXArMHhjOS8weDEzOQogWzxjMDRkYmQ1OT5dIGRvX2xh c3QrMHgxODYvMHg0OWYKIFs8YzA0ZGM0MTU+XSBkb19maWxwX29wZW4rMHgxYmQvMHg0NTkKIFs8 YzA0NWIxOTE+XSA/IHRpbWVrZWVwaW5nX2dldF9ucysweDE2LzB4NTQKIFs8YzA1YTkxNzA+XSA/ IG1pZ2h0X2ZhdWx0KzB4MWUvMHgyMAogWzxjMDRlNDc5YT5dID8gYWxsb2NfZmQrMHg1OC8weGJl CiBbPGMwNGQxOTQxPl0gZG9fc3lzX29wZW4rMHg0ZC8weGU0CiBbPGMwNDdkMGY0Pl0gPyBhdWRp dF9zeXNjYWxsX2VudHJ5KzB4MTJhLzB4MTRjCiBbPGMwNGQxYTI0Pl0gc3lzX29wZW4rMHgyMy8w eDJiCiBbPGMwNDA3ZmQ4Pl0gc3lzZW50ZXJfZG9fY2FsbCsweDEyLzB4MmQKSU5GTzogdGFzayBn dmZzLWdkdS12b2x1bWU6NzUyMCBibG9ja2VkIGZvciBtb3JlIHRoYW4gMTIwIHNlY29uZHMuCiJl Y2hvIDAgPiAvcHJvYy9zeXMva2VybmVsL2h1bmdfdGFza190aW1lb3V0X3NlY3MiIGRpc2FibGVz IHRoaXMgbWVzc2FnZS4KZ3Zmcy1nZHUtdm9sdSBEIDAwMDA0NDY1ICAgICAwICA3NTIwICAgICAg MSAweDAwMDAwMDg4CiBjNzg0N2RjMCAwMDAwMDA4NiBkNWVlZGI5ZSAwMDAwNDQ2NSBjMGEyNWUw MCBjMGEyNWUwMCBjMGEyNWUwMCBjMGEyNWUwMAogY2Q3ODljMjQgYzBhMjVlMDAgYzBhMjVlMDAg MDAwMDExNjggMDAwMDAwMDAgZGU3YTFlMDAgMDAwMDQ0NjUgY2Q3ODk5YTAKIDAwMDAwMDAxIGMz NjhiMWE0IGMzNjhiMTljIGNkNzg5OWEwIGMzNjhiMWEwIGM3ODQ3ZGY0IGMwNzgyMDkzIGMzNjhi MWFjCkNhbGwgVHJhY2U6CiBbPGMwNzgyMDkzPl0gX19tdXRleF9sb2NrX2NvbW1vbisweGU4LzB4 MTM3CiBbPGMwNzgyMGY5Pl0gX19tdXRleF9sb2NrX3Nsb3dwYXRoKzB4MTcvMHgxYQogWzxjMDc4 MjFlOD5dID8gbXV0ZXhfbG9jaysweDMwLzB4M2UKIFs8YzA3ODIxZTg+XSBtdXRleF9sb2NrKzB4 MzAvMHgzZQogWzxjMDRkYTM3MD5dIGRvX2xvb2t1cCsweDg3LzB4MTM5CiBbPGMwNGRhYWJkPl0g bGlua19wYXRoX3dhbGsrMHgzMjYvMHg0NGQKIFs8YzA0ZGFjYTI+XSBwYXRoX3dhbGsrMHgzZi8w eDg5CiBbPGMwNGRjMGY3Pl0gPyBwYXRoX2luaXQrMHg3MC8weDEwYwogWzxjMDRkYzFiOT5dIGRv X3BhdGhfbG9va3VwKzB4MjYvMHg3NAogWzxjMDRkY2Y5NT5dIHVzZXJfcGF0aF9hdCsweDQ2LzB4 NmMKIFs8YzA0ZDY0NWE+XSB2ZnNfZnN0YXRhdCsweDMyLzB4NTkKIFs8YzA0ZDY0Y2Y+XSB2ZnNf bHN0YXQrMHgxYi8weDFkCiBbPGMwNGQ2NGVhPl0gc3lzX2xzdGF0NjQrMHgxOS8weDJkCiBbPGMw NDdkMGY0Pl0gPyBhdWRpdF9zeXNjYWxsX2VudHJ5KzB4MTJhLzB4MTRjCiBbPGMwNWE4Y2I4Pl0g PyB0cmFjZV9oYXJkaXJxc19vbl90aHVuaysweGMvMHgxMAogWzxjMDQwN2ZkOD5dIHN5c2VudGVy X2RvX2NhbGwrMHgxMi8weDJkCklORk86IHRhc2sgZ3Zmc2QtdHJhc2g6MTkwNSBibG9ja2VkIGZv ciBtb3JlIHRoYW4gMTIwIHNlY29uZHMuCiJlY2hvIDAgPiAvcHJvYy9zeXMva2VybmVsL2h1bmdf dGFza190aW1lb3V0X3NlY3MiIGRpc2FibGVzIHRoaXMgbWVzc2FnZS4KZ3Zmc2QtdHJhc2ggICBE IDAwMDA0NDY2ICAgICAwICAxOTA1ICAgICAgMSAweDAwMDAwMDgwCiBjZDZlOWRjMCAwMDAwMDA4 NiAxMTdjMTFiMSAwMDAwNDQ2NiBjMGEyNWUwMCBjMGEyNWUwMCBjMGEyNWUwMCBjMGEyNWUwMAog Y2Q2YmI1YzQgYzBhMjVlMDAgYzBhMjVlMDAgMDA2NWEzOGQgMDAwMDAwMDAgY2Q0MThjMDAgMDAw MDQ0NjYgY2Q2YmIzNDAKIDAwMDAwMDAwIGMzNjhiMWE0IGMzNjhiMTljIGNkNmJiMzQwIGMzNjhi MWEwIGNkNmU5ZGY0IGMwNzgyMDkzIGMzNjhiMWFjCkNhbGwgVHJhY2U6CiBbPGMwNzgyMDkzPl0g X19tdXRleF9sb2NrX2NvbW1vbisweGU4LzB4MTM3CiBbPGMwNzgyMGY5Pl0gX19tdXRleF9sb2Nr X3Nsb3dwYXRoKzB4MTcvMHgxYQogWzxjMDc4MjFlOD5dID8gbXV0ZXhfbG9jaysweDMwLzB4M2UK IFs8YzA3ODIxZTg+XSBtdXRleF9sb2NrKzB4MzAvMHgzZQogWzxjMDRkYTM3MD5dIGRvX2xvb2t1 cCsweDg3LzB4MTM5CiBbPGMwNGRhYWJkPl0gbGlua19wYXRoX3dhbGsrMHgzMjYvMHg0NGQKIFs8 YzA0ZGFjYTI+XSBwYXRoX3dhbGsrMHgzZi8weDg5CiBbPGMwNGRjMGY3Pl0gPyBwYXRoX2luaXQr MHg3MC8weDEwYwogWzxjMDRkYzFiOT5dIGRvX3BhdGhfbG9va3VwKzB4MjYvMHg3NAogWzxjMDRk Y2Y5NT5dIHVzZXJfcGF0aF9hdCsweDQ2LzB4NmMKIFs8YzA1YTIwZDg+XSA/IGlkcl9nZXRfZW1w dHlfc2xvdCsweDE0NC8weDIxNgogWzxjMDRkNjQ1YT5dIHZmc19mc3RhdGF0KzB4MzIvMHg1OQog WzxjMDRkNjRjZj5dIHZmc19sc3RhdCsweDFiLzB4MWQKIFs8YzA0ZDY0ZWE+XSBzeXNfbHN0YXQ2 NCsweDE5LzB4MmQKIFs8YzA0ZGEyNjg+XSA/IHBhdGhfcHV0KzB4MWEvMHgxZAogWzxjMDRmYTMy Zj5dID8gc3lzX2lub3RpZnlfYWRkX3dhdGNoKzB4MjI2LzB4MjgxCiBbPGMwNDdkMGY0Pl0gPyBh dWRpdF9zeXNjYWxsX2VudHJ5KzB4MTJhLzB4MTRjCiBbPGMwNWE4Y2I4Pl0gPyB0cmFjZV9oYXJk aXJxc19vbl90aHVuaysweGMvMHgxMAogWzxjMDQwN2ZkOD5dIHN5c2VudGVyX2RvX2NhbGwrMHgx Mi8weDJkCiBbPGMwNzgwMDAwPl0gPyBwcm9maWxlX2NwdV9jYWxsYmFjaysweGUwLzB4MTk3CklO Rk86IHRhc2sgZ3Zmcy1nZHUtdm9sdW1lOjc1MTQgYmxvY2tlZCBmb3IgbW9yZSB0aGFuIDEyMCBz ZWNvbmRzLgoiZWNobyAwID4gL3Byb2Mvc3lzL2tlcm5lbC9odW5nX3Rhc2tfdGltZW91dF9zZWNz IiBkaXNhYmxlcyB0aGlzIG1lc3NhZ2UuCmd2ZnMtZ2R1LXZvbHUgRCAwMDAwNDQ2NSAgICAgMCAg NzUxNCAgICAgIDEgMHgwMDAwMDA4MAogZDk2YzViMmMgMDAwMDAwODYgZDVlODFmY2YgMDAwMDQ0 NjUgYzBhMjVlMDAgYzBhMjVlMDAgYzBhMjVlMDAgYzBhMjVlMDAKIGRlNTVkYzM0IGMwYTI1ZTAw IGMwYTI1ZTAwIDAwMDBkMjg1IDAwMDAwMDAwIGNkNjM5MjAwIDAwMDA0NDY1IGRlNTVkOWIwCiAw MjAwMDAwMCBkZDQyMzIwOCBkZDQyMzIwMCA3ZmZmZmZmZiA3ZmZmZmZmZiBkOTZjNWI3MCBjMDc4 MWM0MyAwMDAwMDAwMApDYWxsIFRyYWNlOgogWzxjMDc4MWM0Mz5dIHNjaGVkdWxlX3RpbWVvdXQr MHgxYi8weDk1CiBbPGMwNzgyNGQxPl0gX19kb3duX2NvbW1vbisweDgyLzB4YjkKIFs8ZTBlMjhh ZTg+XSA/IF94ZnNfYnVmX2ZpbmQrMHgxMjIvMHgxYjggW3hmc10KIFs8YzA3ODI1Njc+XSBfX2Rv d24rMHgxNy8weDE5CiBbPGMwNDU4MjdjPl0gZG93bisweDI3LzB4MzcKIFs8ZTBlMjc4ZGE+XSB4 ZnNfYnVmX2xvY2srMHg2Ny8weDkzIFt4ZnNdCiBbPGUwZTI4YWU4Pl0gX3hmc19idWZfZmluZCsw eDEyMi8weDFiOCBbeGZzXQogWzxlMGUyOGJkZT5dIHhmc19idWZfZ2V0KzB4NjAvMHgxNDkgW3hm c10KIFs8ZTBlMjhjZTk+XSB4ZnNfYnVmX3JlYWQrMHgyMi8weGIwIFt4ZnNdCiBbPGUwZTFmZmE5 Pl0geGZzX3RyYW5zX3JlYWRfYnVmKzB4NTMvMHgyZTkgW3hmc10KIFs8ZTBkZmQxNTE+XSB4ZnNf ZGFfZG9fYnVmKzB4NDExLzB4NjI4IFt4ZnNdCiBbPGUwZGZlMGQzPl0gPyB4ZnNfZGFfbm9kZV9s b29rdXBfaW50KzB4NTIvMHgyMDcgW3hmc10KIFs8ZTBkZmQzY2U+XSB4ZnNfZGFfcmVhZF9idWYr MHgxZC8weDIyIFt4ZnNdCiBbPGUwZGZlMGQzPl0gPyB4ZnNfZGFfbm9kZV9sb29rdXBfaW50KzB4 NTIvMHgyMDcgW3hmc10KIFs8ZTBkZmUwZDM+XSB4ZnNfZGFfbm9kZV9sb29rdXBfaW50KzB4NTIv MHgyMDcgW3hmc10KIFs8ZTBlMDM4ODg+XSB4ZnNfZGlyMl9ub2RlX2xvb2t1cCsweDVmLzB4ZWUg W3hmc10KIFs8ZTBkZmYyNmE+XSB4ZnNfZGlyX2xvb2t1cCsweGRlLzB4MTEwIFt4ZnNdCiBbPGUw ZTIyYzBhPl0geGZzX2xvb2t1cCsweDUwLzB4OWYgW3hmc10KIFs8ZTBlMmM1YTY+XSB4ZnNfdm5f bG9va3VwKzB4M2UvMHg3NiBbeGZzXQogWzxjMDRkYTNiMj5dIGRvX2xvb2t1cCsweGM5LzB4MTM5 CiBbPGMwNGRiZDU5Pl0gZG9fbGFzdCsweDE4Ni8weDQ5ZgogWzxjMDRkYzQxNT5dIGRvX2ZpbHBf b3BlbisweDFiZC8weDQ1OQogWzxjMDQ1YjE5MT5dID8gdGltZWtlZXBpbmdfZ2V0X25zKzB4MTYv MHg1NAogWzxjMDVhOTE3MD5dID8gbWlnaHRfZmF1bHQrMHgxZS8weDIwCiBbPGMwNGU0NzlhPl0g PyBhbGxvY19mZCsweDU4LzB4YmUKIFs8YzA0ZDE5NDE+XSBkb19zeXNfb3BlbisweDRkLzB4ZTQK IFs8YzA0N2QwZjQ+XSA/IGF1ZGl0X3N5c2NhbGxfZW50cnkrMHgxMmEvMHgxNGMKIFs8YzA0ZDFh MjQ+XSBzeXNfb3BlbisweDIzLzB4MmIKIFs8YzA0MDdmZDg+XSBzeXNlbnRlcl9kb19jYWxsKzB4 MTIvMHgyZApJTkZPOiB0YXNrIGd2ZnMtZ2R1LXZvbHVtZTo3NTIwIGJsb2NrZWQgZm9yIG1vcmUg dGhhbiAxMjAgc2Vjb25kcy4KImVjaG8gMCA+IC9wcm9jL3N5cy9rZXJuZWwvaHVuZ190YXNrX3Rp bWVvdXRfc2VjcyIgZGlzYWJsZXMgdGhpcyBtZXNzYWdlLgpndmZzLWdkdS12b2x1IEQgMDAwMDQ0 NjUgICAgIDAgIDc1MjAgICAgICAxIDB4MDAwMDAwODgKIGM3ODQ3ZGMwIDAwMDAwMDg2IGQ1ZWVk YjllIDAwMDA0NDY1IGMwYTI1ZTAwIGMwYTI1ZTAwIGMwYTI1ZTAwIGMwYTI1ZTAwCiBjZDc4OWMy NCBjMGEyNWUwMCBjMGEyNWUwMCAwMDAwMTE2OCAwMDAwMDAwMCBkZTdhMWUwMCAwMDAwNDQ2NSBj ZDc4OTlhMAogMDAwMDAwMDEgYzM2OGIxYTQgYzM2OGIxOWMgY2Q3ODk5YTAgYzM2OGIxYTAgYzc4 NDdkZjQgYzA3ODIwOTMgYzM2OGIxYWMKQ2FsbCBUcmFjZToKIFs8YzA3ODIwOTM+XSBfX211dGV4 X2xvY2tfY29tbW9uKzB4ZTgvMHgxMzcKIFs8YzA3ODIwZjk+XSBfX211dGV4X2xvY2tfc2xvd3Bh dGgrMHgxNy8weDFhCiBbPGMwNzgyMWU4Pl0gPyBtdXRleF9sb2NrKzB4MzAvMHgzZQogWzxjMDc4 MjFlOD5dIG11dGV4X2xvY2srMHgzMC8weDNlCiBbPGMwNGRhMzcwPl0gZG9fbG9va3VwKzB4ODcv MHgxMzkKIFs8YzA0ZGFhYmQ+XSBsaW5rX3BhdGhfd2FsaysweDMyNi8weDQ0ZAogWzxjMDRkYWNh Mj5dIHBhdGhfd2FsaysweDNmLzB4ODkKIFs8YzA0ZGMwZjc+XSA/IHBhdGhfaW5pdCsweDcwLzB4 MTBjCiBbPGMwNGRjMWI5Pl0gZG9fcGF0aF9sb29rdXArMHgyNi8weDc0CiBbPGMwNGRjZjk1Pl0g dXNlcl9wYXRoX2F0KzB4NDYvMHg2YwogWzxjMDRkNjQ1YT5dIHZmc19mc3RhdGF0KzB4MzIvMHg1 OQogWzxjMDRkNjRjZj5dIHZmc19sc3RhdCsweDFiLzB4MWQKIFs8YzA0ZDY0ZWE+XSBzeXNfbHN0 YXQ2NCsweDE5LzB4MmQKIFs8YzA0N2QwZjQ+XSA/IGF1ZGl0X3N5c2NhbGxfZW50cnkrMHgxMmEv MHgxNGMKIFs8YzA1YThjYjg+XSA/IHRyYWNlX2hhcmRpcnFzX29uX3RodW5rKzB4Yy8weDEwCiBb PGMwNDA3ZmQ4Pl0gc3lzZW50ZXJfZG9fY2FsbCsweDEyLzB4MmQKSU5GTzogdGFzayBndmZzZC10 cmFzaDoxOTA1IGJsb2NrZWQgZm9yIG1vcmUgdGhhbiAxMjAgc2Vjb25kcy4KImVjaG8gMCA+IC9w cm9jL3N5cy9rZXJuZWwvaHVuZ190YXNrX3RpbWVvdXRfc2VjcyIgZGlzYWJsZXMgdGhpcyBtZXNz YWdlLgpndmZzZC10cmFzaCAgIEQgMDAwMDQ0NjYgICAgIDAgIDE5MDUgICAgICAxIDB4MDAwMDAw ODAKIGNkNmU5ZGMwIDAwMDAwMDg2IDExN2MxMWIxIDAwMDA0NDY2IGMwYTI1ZTAwIGMwYTI1ZTAw IGMwYTI1ZTAwIGMwYTI1ZTAwCiBjZDZiYjVjNCBjMGEyNWUwMCBjMGEyNWUwMCAwMDY1YTM4ZCAw MDAwMDAwMCBjZDQxOGMwMCAwMDAwNDQ2NiBjZDZiYjM0MAogMDAwMDAwMDAgYzM2OGIxYTQgYzM2 OGIxOWMgY2Q2YmIzNDAgYzM2OGIxYTAgY2Q2ZTlkZjQgYzA3ODIwOTMgYzM2OGIxYWMKQ2FsbCBU cmFjZToKIFs8YzA3ODIwOTM+XSBfX211dGV4X2xvY2tfY29tbW9uKzB4ZTgvMHgxMzcKIFs8YzA3 ODIwZjk+XSBfX211dGV4X2xvY2tfc2xvd3BhdGgrMHgxNy8weDFhCiBbPGMwNzgyMWU4Pl0gPyBt dXRleF9sb2NrKzB4MzAvMHgzZQogWzxjMDc4MjFlOD5dIG11dGV4X2xvY2srMHgzMC8weDNlCiBb PGMwNGRhMzcwPl0gZG9fbG9va3VwKzB4ODcvMHgxMzkKIFs8YzA0ZGFhYmQ+XSBsaW5rX3BhdGhf d2FsaysweDMyNi8weDQ0ZAogWzxjMDRkYWNhMj5dIHBhdGhfd2FsaysweDNmLzB4ODkKIFs8YzA0 ZGMwZjc+XSA/IHBhdGhfaW5pdCsweDcwLzB4MTBjCiBbPGMwNGRjMWI5Pl0gZG9fcGF0aF9sb29r dXArMHgyNi8weDc0CiBbPGMwNGRjZjk1Pl0gdXNlcl9wYXRoX2F0KzB4NDYvMHg2YwogWzxjMDVh MjBkOD5dID8gaWRyX2dldF9lbXB0eV9zbG90KzB4MTQ0LzB4MjE2CiBbPGMwNGQ2NDVhPl0gdmZz X2ZzdGF0YXQrMHgzMi8weDU5CiBbPGMwNGQ2NGNmPl0gdmZzX2xzdGF0KzB4MWIvMHgxZAogWzxj MDRkNjRlYT5dIHN5c19sc3RhdDY0KzB4MTkvMHgyZAogWzxjMDRkYTI2OD5dID8gcGF0aF9wdXQr MHgxYS8weDFkCiBbPGMwNGZhMzJmPl0gPyBzeXNfaW5vdGlmeV9hZGRfd2F0Y2grMHgyMjYvMHgy ODEKIFs8YzA0N2QwZjQ+XSA/IGF1ZGl0X3N5c2NhbGxfZW50cnkrMHgxMmEvMHgxNGMKIFs8YzA1 YThjYjg+XSA/IHRyYWNlX2hhcmRpcnFzX29uX3RodW5rKzB4Yy8weDEwCiBbPGMwNDA3ZmQ4Pl0g c3lzZW50ZXJfZG9fY2FsbCsweDEyLzB4MmQKIFs8YzA3ODAwMDA+XSA/IHByb2ZpbGVfY3B1X2Nh bGxiYWNrKzB4ZTAvMHgxOTcKSU5GTzogdGFzayBndmZzLWdkdS12b2x1bWU6NzUxNCBibG9ja2Vk IGZvciBtb3JlIHRoYW4gMTIwIHNlY29uZHMuCiJlY2hvIDAgPiAvcHJvYy9zeXMva2VybmVsL2h1 bmdfdGFza190aW1lb3V0X3NlY3MiIGRpc2FibGVzIHRoaXMgbWVzc2FnZS4KZ3Zmcy1nZHUtdm9s dSBEIDAwMDA0NDY1ICAgICAwICA3NTE0ICAgICAgMSAweDAwMDAwMDgwCiBkOTZjNWIyYyAwMDAw MDA4NiBkNWU4MWZjZiAwMDAwNDQ2NSBjMGEyNWUwMCBjMGEyNWUwMCBjMGEyNWUwMCBjMGEyNWUw MAogZGU1NWRjMzQgYzBhMjVlMDAgYzBhMjVlMDAgMDAwMGQyODUgMDAwMDAwMDAgY2Q2MzkyMDAg MDAwMDQ0NjUgZGU1NWQ5YjAKIDAyMDAwMDAwIGRkNDIzMjA4IGRkNDIzMjAwIDdmZmZmZmZmIDdm ZmZmZmZmIGQ5NmM1YjcwIGMwNzgxYzQzIDAwMDAwMDAwCkNhbGwgVHJhY2U6CiBbPGMwNzgxYzQz Pl0gc2NoZWR1bGVfdGltZW91dCsweDFiLzB4OTUKIFs8YzA3ODI0ZDE+XSBfX2Rvd25fY29tbW9u KzB4ODIvMHhiOQogWzxlMGUyOGFlOD5dID8gX3hmc19idWZfZmluZCsweDEyMi8weDFiOCBbeGZz XQogWzxjMDc4MjU2Nz5dIF9fZG93bisweDE3LzB4MTkKIFs8YzA0NTgyN2M+XSBkb3duKzB4Mjcv MHgzNwogWzxlMGUyNzhkYT5dIHhmc19idWZfbG9jaysweDY3LzB4OTMgW3hmc10KIFs8ZTBlMjhh ZTg+XSBfeGZzX2J1Zl9maW5kKzB4MTIyLzB4MWI4IFt4ZnNdCiBbPGUwZTI4YmRlPl0geGZzX2J1 Zl9nZXQrMHg2MC8weDE0OSBbeGZzXQogWzxlMGUyOGNlOT5dIHhmc19idWZfcmVhZCsweDIyLzB4 YjAgW3hmc10KIFs8ZTBlMWZmYTk+XSB4ZnNfdHJhbnNfcmVhZF9idWYrMHg1My8weDJlOSBbeGZz XQogWzxlMGRmZDE1MT5dIHhmc19kYV9kb19idWYrMHg0MTEvMHg2MjggW3hmc10KIFs8ZTBkZmUw ZDM+XSA/IHhmc19kYV9ub2RlX2xvb2t1cF9pbnQrMHg1Mi8weDIwNyBbeGZzXQogWzxlMGRmZDNj ZT5dIHhmc19kYV9yZWFkX2J1ZisweDFkLzB4MjIgW3hmc10KIFs8ZTBkZmUwZDM+XSA/IHhmc19k YV9ub2RlX2xvb2t1cF9pbnQrMHg1Mi8weDIwNyBbeGZzXQogWzxlMGRmZTBkMz5dIHhmc19kYV9u b2RlX2xvb2t1cF9pbnQrMHg1Mi8weDIwNyBbeGZzXQogWzxlMGUwMzg4OD5dIHhmc19kaXIyX25v ZGVfbG9va3VwKzB4NWYvMHhlZSBbeGZzXQogWzxlMGRmZjI2YT5dIHhmc19kaXJfbG9va3VwKzB4 ZGUvMHgxMTAgW3hmc10KIFs8ZTBlMjJjMGE+XSB4ZnNfbG9va3VwKzB4NTAvMHg5ZiBbeGZzXQog WzxlMGUyYzVhNj5dIHhmc192bl9sb29rdXArMHgzZS8weDc2IFt4ZnNdCiBbPGMwNGRhM2IyPl0g ZG9fbG9va3VwKzB4YzkvMHgxMzkKIFs8YzA0ZGJkNTk+XSBkb19sYXN0KzB4MTg2LzB4NDlmCiBb PGMwNGRjNDE1Pl0gZG9fZmlscF9vcGVuKzB4MWJkLzB4NDU5CiBbPGMwNDViMTkxPl0gPyB0aW1l a2VlcGluZ19nZXRfbnMrMHgxNi8weDU0CiBbPGMwNWE5MTcwPl0gPyBtaWdodF9mYXVsdCsweDFl LzB4MjAKIFs8YzA0ZTQ3OWE+XSA/IGFsbG9jX2ZkKzB4NTgvMHhiZQogWzxjMDRkMTk0MT5dIGRv X3N5c19vcGVuKzB4NGQvMHhlNAogWzxjMDQ3ZDBmND5dID8gYXVkaXRfc3lzY2FsbF9lbnRyeSsw eDEyYS8weDE0YwogWzxjMDRkMWEyND5dIHN5c19vcGVuKzB4MjMvMHgyYgogWzxjMDQwN2ZkOD5d IHN5c2VudGVyX2RvX2NhbGwrMHgxMi8weDJkCklORk86IHRhc2sgZ3Zmcy1nZHUtdm9sdW1lOjc1 MjAgYmxvY2tlZCBmb3IgbW9yZSB0aGFuIDEyMCBzZWNvbmRzLgoiZWNobyAwID4gL3Byb2Mvc3lz L2tlcm5lbC9odW5nX3Rhc2tfdGltZW91dF9zZWNzIiBkaXNhYmxlcyB0aGlzIG1lc3NhZ2UuCmd2 ZnMtZ2R1LXZvbHUgRCAwMDAwNDQ2NSAgICAgMCAgNzUyMCAgICAgIDEgMHgwMDAwMDA4OAogYzc4 NDdkYzAgMDAwMDAwODYgZDVlZWRiOWUgMDAwMDQ0NjUgYzBhMjVlMDAgYzBhMjVlMDAgYzBhMjVl MDAgYzBhMjVlMDAKIGNkNzg5YzI0IGMwYTI1ZTAwIGMwYTI1ZTAwIDAwMDAxMTY4IDAwMDAwMDAw IGRlN2ExZTAwIDAwMDA0NDY1IGNkNzg5OWEwCiAwMDAwMDAwMSBjMzY4YjFhNCBjMzY4YjE5YyBj ZDc4OTlhMCBjMzY4YjFhMCBjNzg0N2RmNCBjMDc4MjA5MyBjMzY4YjFhYwpDYWxsIFRyYWNlOgog WzxjMDc4MjA5Mz5dIF9fbXV0ZXhfbG9ja19jb21tb24rMHhlOC8weDEzNwogWzxjMDc4MjBmOT5d IF9fbXV0ZXhfbG9ja19zbG93cGF0aCsweDE3LzB4MWEKIFs8YzA3ODIxZTg+XSA/IG11dGV4X2xv Y2srMHgzMC8weDNlCiBbPGMwNzgyMWU4Pl0gbXV0ZXhfbG9jaysweDMwLzB4M2UKIFs8YzA0ZGEz NzA+XSBkb19sb29rdXArMHg4Ny8weDEzOQogWzxjMDRkYWFiZD5dIGxpbmtfcGF0aF93YWxrKzB4 MzI2LzB4NDRkCiBbPGMwNGRhY2EyPl0gcGF0aF93YWxrKzB4M2YvMHg4OQogWzxjMDRkYzBmNz5d ID8gcGF0aF9pbml0KzB4NzAvMHgxMGMKIFs8YzA0ZGMxYjk+XSBkb19wYXRoX2xvb2t1cCsweDI2 LzB4NzQKIFs8YzA0ZGNmOTU+XSB1c2VyX3BhdGhfYXQrMHg0Ni8weDZjCiBbPGMwNGQ2NDVhPl0g dmZzX2ZzdGF0YXQrMHgzMi8weDU5CiBbPGMwNGQ2NGNmPl0gdmZzX2xzdGF0KzB4MWIvMHgxZAog WzxjMDRkNjRlYT5dIHN5c19sc3RhdDY0KzB4MTkvMHgyZAogWzxjMDQ3ZDBmND5dID8gYXVkaXRf c3lzY2FsbF9lbnRyeSsweDEyYS8weDE0YwogWzxjMDVhOGNiOD5dID8gdHJhY2VfaGFyZGlycXNf b25fdGh1bmsrMHhjLzB4MTAKIFs8YzA0MDdmZDg+XSBzeXNlbnRlcl9kb19jYWxsKzB4MTIvMHgy ZApJTkZPOiB0YXNrIGd2ZnNkLXRyYXNoOjE5MDUgYmxvY2tlZCBmb3IgbW9yZSB0aGFuIDEyMCBz ZWNvbmRzLgoiZWNobyAwID4gL3Byb2Mvc3lzL2tlcm5lbC9odW5nX3Rhc2tfdGltZW91dF9zZWNz IiBkaXNhYmxlcyB0aGlzIG1lc3NhZ2UuCmd2ZnNkLXRyYXNoICAgRCAwMDAwNDQ2NiAgICAgMCAg MTkwNSAgICAgIDEgMHgwMDAwMDA4MAogY2Q2ZTlkYzAgMDAwMDAwODYgMTE3YzExYjEgMDAwMDQ0 NjYgYzBhMjVlMDAgYzBhMjVlMDAgYzBhMjVlMDAgYzBhMjVlMDAKIGNkNmJiNWM0IGMwYTI1ZTAw IGMwYTI1ZTAwIDAwNjVhMzhkIDAwMDAwMDAwIGNkNDE4YzAwIDAwMDA0NDY2IGNkNmJiMzQwCiAw MDAwMDAwMCBjMzY4YjFhNCBjMzY4YjE5YyBjZDZiYjM0MCBjMzY4YjFhMCBjZDZlOWRmNCBjMDc4 MjA5MyBjMzY4YjFhYwpDYWxsIFRyYWNlOgogWzxjMDc4MjA5Mz5dIF9fbXV0ZXhfbG9ja19jb21t b24rMHhlOC8weDEzNwogWzxjMDc4MjBmOT5dIF9fbXV0ZXhfbG9ja19zbG93cGF0aCsweDE3LzB4 MWEKIFs8YzA3ODIxZTg+XSA/IG11dGV4X2xvY2srMHgzMC8weDNlCiBbPGMwNzgyMWU4Pl0gbXV0 ZXhfbG9jaysweDMwLzB4M2UKIFs8YzA0ZGEzNzA+XSBkb19sb29rdXArMHg4Ny8weDEzOQogWzxj MDRkYWFiZD5dIGxpbmtfcGF0aF93YWxrKzB4MzI2LzB4NDRkCiBbPGMwNGRhY2EyPl0gcGF0aF93 YWxrKzB4M2YvMHg4OQogWzxjMDRkYzBmNz5dID8gcGF0aF9pbml0KzB4NzAvMHgxMGMKIFs8YzA0 ZGMxYjk+XSBkb19wYXRoX2xvb2t1cCsweDI2LzB4NzQKIFs8YzA0ZGNmOTU+XSB1c2VyX3BhdGhf YXQrMHg0Ni8weDZjCiBbPGMwNWEyMGQ4Pl0gPyBpZHJfZ2V0X2VtcHR5X3Nsb3QrMHgxNDQvMHgy MTYKIFs8YzA0ZDY0NWE+XSB2ZnNfZnN0YXRhdCsweDMyLzB4NTkKIFs8YzA0ZDY0Y2Y+XSB2ZnNf bHN0YXQrMHgxYi8weDFkCiBbPGMwNGQ2NGVhPl0gc3lzX2xzdGF0NjQrMHgxOS8weDJkCiBbPGMw NGRhMjY4Pl0gPyBwYXRoX3B1dCsweDFhLzB4MWQKIFs8YzA0ZmEzMmY+XSA/IHN5c19pbm90aWZ5 X2FkZF93YXRjaCsweDIyNi8weDI4MQogWzxjMDQ3ZDBmND5dID8gYXVkaXRfc3lzY2FsbF9lbnRy eSsweDEyYS8weDE0YwogWzxjMDVhOGNiOD5dID8gdHJhY2VfaGFyZGlycXNfb25fdGh1bmsrMHhj LzB4MTAKIFs8YzA0MDdmZDg+XSBzeXNlbnRlcl9kb19jYWxsKzB4MTIvMHgyZAogWzxjMDc4MDAw MD5dID8gcHJvZmlsZV9jcHVfY2FsbGJhY2srMHhlMC8weDE5NwpJTkZPOiB0YXNrIGd2ZnMtZ2R1 LXZvbHVtZTo3NTE0IGJsb2NrZWQgZm9yIG1vcmUgdGhhbiAxMjAgc2Vjb25kcy4KImVjaG8gMCA+ IC9wcm9jL3N5cy9rZXJuZWwvaHVuZ190YXNrX3RpbWVvdXRfc2VjcyIgZGlzYWJsZXMgdGhpcyBt ZXNzYWdlLgpndmZzLWdkdS12b2x1IEQgMDAwMDQ0NjUgICAgIDAgIDc1MTQgICAgICAxIDB4MDAw MDAwODAKIGQ5NmM1YjJjIDAwMDAwMDg2IGQ1ZTgxZmNmIDAwMDA0NDY1IGMwYTI1ZTAwIGMwYTI1 ZTAwIGMwYTI1ZTAwIGMwYTI1ZTAwCiBkZTU1ZGMzNCBjMGEyNWUwMCBjMGEyNWUwMCAwMDAwZDI4 NSAwMDAwMDAwMCBjZDYzOTIwMCAwMDAwNDQ2NSBkZTU1ZDliMAogMDIwMDAwMDAgZGQ0MjMyMDgg ZGQ0MjMyMDAgN2ZmZmZmZmYgN2ZmZmZmZmYgZDk2YzViNzAgYzA3ODFjNDMgMDAwMDAwMDAKQ2Fs bCBUcmFjZToKIFs8YzA3ODFjNDM+XSBzY2hlZHVsZV90aW1lb3V0KzB4MWIvMHg5NQogWzxjMDc4 MjRkMT5dIF9fZG93bl9jb21tb24rMHg4Mi8weGI5CiBbPGUwZTI4YWU4Pl0gPyBfeGZzX2J1Zl9m aW5kKzB4MTIyLzB4MWI4IFt4ZnNdCiBbPGMwNzgyNTY3Pl0gX19kb3duKzB4MTcvMHgxOQogWzxj MDQ1ODI3Yz5dIGRvd24rMHgyNy8weDM3CiBbPGUwZTI3OGRhPl0geGZzX2J1Zl9sb2NrKzB4Njcv MHg5MyBbeGZzXQogWzxlMGUyOGFlOD5dIF94ZnNfYnVmX2ZpbmQrMHgxMjIvMHgxYjggW3hmc10K IFs8ZTBlMjhiZGU+XSB4ZnNfYnVmX2dldCsweDYwLzB4MTQ5IFt4ZnNdCiBbPGUwZTI4Y2U5Pl0g eGZzX2J1Zl9yZWFkKzB4MjIvMHhiMCBbeGZzXQogWzxlMGUxZmZhOT5dIHhmc190cmFuc19yZWFk X2J1ZisweDUzLzB4MmU5IFt4ZnNdCiBbPGUwZGZkMTUxPl0geGZzX2RhX2RvX2J1ZisweDQxMS8w eDYyOCBbeGZzXQogWzxlMGRmZTBkMz5dID8geGZzX2RhX25vZGVfbG9va3VwX2ludCsweDUyLzB4 MjA3IFt4ZnNdCiBbPGUwZGZkM2NlPl0geGZzX2RhX3JlYWRfYnVmKzB4MWQvMHgyMiBbeGZzXQog WzxlMGRmZTBkMz5dID8geGZzX2RhX25vZGVfbG9va3VwX2ludCsweDUyLzB4MjA3IFt4ZnNdCiBb PGUwZGZlMGQzPl0geGZzX2RhX25vZGVfbG9va3VwX2ludCsweDUyLzB4MjA3IFt4ZnNdCiBbPGUw ZTAzODg4Pl0geGZzX2RpcjJfbm9kZV9sb29rdXArMHg1Zi8weGVlIFt4ZnNdCiBbPGUwZGZmMjZh Pl0geGZzX2Rpcl9sb29rdXArMHhkZS8weDExMCBbeGZzXQogWzxlMGUyMmMwYT5dIHhmc19sb29r dXArMHg1MC8weDlmIFt4ZnNdCiBbPGUwZTJjNWE2Pl0geGZzX3ZuX2xvb2t1cCsweDNlLzB4NzYg W3hmc10KIFs8YzA0ZGEzYjI+XSBkb19sb29rdXArMHhjOS8weDEzOQogWzxjMDRkYmQ1OT5dIGRv X2xhc3QrMHgxODYvMHg0OWYKIFs8YzA0ZGM0MTU+XSBkb19maWxwX29wZW4rMHgxYmQvMHg0NTkK IFs8YzA0NWIxOTE+XSA/IHRpbWVrZWVwaW5nX2dldF9ucysweDE2LzB4NTQKIFs8YzA1YTkxNzA+ XSA/IG1pZ2h0X2ZhdWx0KzB4MWUvMHgyMAogWzxjMDRlNDc5YT5dID8gYWxsb2NfZmQrMHg1OC8w eGJlCiBbPGMwNGQxOTQxPl0gZG9fc3lzX29wZW4rMHg0ZC8weGU0CiBbPGMwNDdkMGY0Pl0gPyBh dWRpdF9zeXNjYWxsX2VudHJ5KzB4MTJhLzB4MTRjCiBbPGMwNGQxYTI0Pl0gc3lzX29wZW4rMHgy My8weDJiCiBbPGMwNDA3ZmQ4Pl0gc3lzZW50ZXJfZG9fY2FsbCsweDEyLzB4MmQKdXNiIDEtMjog VVNCIGRpc2Nvbm5lY3QsIGFkZHJlc3MgOQo= --0016363b9292cff2dd0497ec37b8-- From BATV+4df0dc983a175be70c99+2676+infradead.org+hch@bombadil.srs.infradead.org Tue Dec 21 09:02:16 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBLF2G7x043162 for ; Tue, 21 Dec 2010 09:02:16 -0600 X-ASG-Debug-ID: 1292943853-20e1030f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2472F4F3B0C for ; Tue, 21 Dec 2010 07:04:14 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id gZNTIjV6kg7AILSz for ; Tue, 21 Dec 2010 07:04:14 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PV3l7-0004QI-6c; Tue, 21 Dec 2010 15:04:13 +0000 Date: Tue, 21 Dec 2010 10:04:13 -0500 From: Christoph Hellwig To: Lukas Czerner Cc: xfs@oss.sgi.com, hch@infradead.org, esandeen@redhat.com X-ASG-Orig-Subj: Re: [PATCH] Add test 248: Check filesystem FITRIM implementation Subject: Re: [PATCH] Add test 248: Check filesystem FITRIM implementation Message-ID: <20101221150413.GA15542@infradead.org> References: <1291996407-26251-1-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1291996407-26251-1-git-send-email-lczerner@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1292943854 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Another one I only noticed now: fstrim.c: In function 'main': fstrim.c:245: warning: format '%lu' expects type 'long unsigned int', but argument 3 has type 'uint64_t' From BATV+4df0dc983a175be70c99+2676+infradead.org+hch@bombadil.srs.infradead.org Tue Dec 21 09:13:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBLFDFYl044236 for ; Tue, 21 Dec 2010 09:13:15 -0600 X-ASG-Debug-ID: 1292944513-3bf401100000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 99C962014CD for ; Tue, 21 Dec 2010 07:15:13 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id dhpiRo8hY3ihTjUp for ; Tue, 21 Dec 2010 07:15:13 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PV3vj-0007YM-OQ; Tue, 21 Dec 2010 15:15:11 +0000 Date: Tue, 21 Dec 2010 10:15:11 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 06/34] xfs: dynamic speculative EOF preallocation Subject: Re: [PATCH 06/34] xfs: dynamic speculative EOF preallocation Message-ID: <20101221151511.GA26127@infradead.org> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> <1292916570-25015-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292916570-25015-7-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1292944513 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This patch causes tesr 014 to take ~ 870 seconds instead of 6, thus beeing almost 150 times slower on mt 32-bit test VM, so I'll have to NAK it for now. From BATV+4df0dc983a175be70c99+2676+infradead.org+hch@bombadil.srs.infradead.org Tue Dec 21 09:13:55 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBLFDtFt044315 for ; Tue, 21 Dec 2010 09:13:55 -0600 X-ASG-Debug-ID: 1292944553-3c1500fe0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5AC902136A9 for ; Tue, 21 Dec 2010 07:15:53 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id JYI4WW43SFLb3Afi for ; Tue, 21 Dec 2010 07:15:53 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PV3wO-0007ct-Ub; Tue, 21 Dec 2010 15:15:52 +0000 Date: Tue, 21 Dec 2010 10:15:52 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 01/34] xfs: provide a inode iolock lockdep class Subject: Re: [PATCH 01/34] xfs: provide a inode iolock lockdep class Message-ID: <20101221151552.GB26127@infradead.org> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> <1292916570-25015-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292916570-25015-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[18.85.46.34] X-Barracuda-Start-Time: 1292944553 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 21, 2010 at 06:28:57PM +1100, Dave Chinner wrote: > From: Dave Chinner > > The XFS iolock needs to be re-initialised to a new lock class before > it enters reclaim to prevent lockdep false positives. Unfortunately, > this is not sufficient protection as inodes in the XFS_IRECLAIMABLE > state can be recycled and not re-initialised before being reused. > > We need to re-initialise the lock state when transfering out of > XFS_IRECLAIMABLE state to XFS_INEW, but we need to keep the same > class as if the inode was just allocated. Hence we need a specific > lockdep class variable for the iolock so that both initialisations > use the same class. > > While there, add a specific class for inodes in the reclaim state so > that it is easy to tell from lockdep reports what state the inode > was in that generated the report. > > Signed-off-by: Dave Chinner I think I already reviewed this one, but in case it got lost: Reviewed-by: Christoph Hellwig From BATV+4df0dc983a175be70c99+2676+infradead.org+hch@bombadil.srs.infradead.org Tue Dec 21 09:14:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBLFEHJt044411 for ; Tue, 21 Dec 2010 09:14:18 -0600 X-ASG-Debug-ID: 1292944575-334800f20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 989921465B27 for ; Tue, 21 Dec 2010 07:16:15 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id rpRQXZl6rODbE3VJ for ; Tue, 21 Dec 2010 07:16:15 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PV3wk-0007ft-Us; Tue, 21 Dec 2010 15:16:15 +0000 Date: Tue, 21 Dec 2010 10:16:14 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 02/34] xfs: use KM_NOFS for allocations during attribute list operations Subject: Re: [PATCH 02/34] xfs: use KM_NOFS for allocations during attribute list operations Message-ID: <20101221151614.GC26127@infradead.org> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> <1292916570-25015-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292916570-25015-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[18.85.46.34] X-Barracuda-Start-Time: 1292944575 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 21, 2010 at 06:28:58PM +1100, Dave Chinner wrote: > From: Dave Chinner > > When listing attributes, we are doiing memory allocations under the > inode ilock using only KM_SLEEP. This allows memory allocation to > recurse back into the filesystem and do writeback, which may the > ilock we already hold on the current inode. THis will deadlock. > Hence use KM_NOFS for such allocations outside of transaction > context to ensure that reclaim recursion does not occur. Looks good, Reviewed-by: Christoph Hellwig From BATV+4df0dc983a175be70c99+2676+infradead.org+hch@bombadil.srs.infradead.org Tue Dec 21 10:43:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBLGhjji057238 for ; Tue, 21 Dec 2010 10:43:45 -0600 X-ASG-Debug-ID: 1292949942-1d2400180000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 22C04212375 for ; Tue, 21 Dec 2010 08:45:42 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id D8exaVpFcTx078zI for ; Tue, 21 Dec 2010 08:45:42 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PV5LJ-000397-9w; Tue, 21 Dec 2010 16:45:41 +0000 Date: Tue, 21 Dec 2010 11:45:41 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 07/34] xfs: don't truncate prealloc from frequently accessed inodes Subject: Re: [PATCH 07/34] xfs: don't truncate prealloc from frequently accessed inodes Message-ID: <20101221164541.GA9093@infradead.org> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> <1292916570-25015-8-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292916570-25015-8-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1292949943 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 21, 2010 at 06:29:03PM +1100, Dave Chinner wrote: > From: Dave Chinner > > A long standing problem for streaming write?? through the NFS server > has been that the NFS server opens and closes file descriptors on an > inode for every write. The result of this behaviour is that the > ->release() function is called on every close and that results in > XFS truncating speculative preallocation beyond the EOF. This has > an adverse effect on file layout when multiple files are being > written at the same time - they interleave their extents and can > result in severe fragmentation. > > To avoid this problem, keep a count of the number of ->release calls > made on an inode. For most cases, an inode is only going to be opened > once for writing and then closed again during it's lifetime in > cache. Hence if there are multiple ->release calls, there is a good > chance that the inode is being accessed by the NFS server. Hence > count up every time ->release is called while there are delalloc > blocks still outstanding on the inode. > > If this count is non-zero when ->release is next called, then do no > truncate away the speculative preallocation - leave it there so that > subsequent writes do not need to reallocate the delalloc space. This > will prevent interleaving of extents of different inodes written > concurrently to the same AG. > > If we get this wrong, it is not a big deal as we truncate > speculative allocation beyond EOF anyway in xfs_inactive() when the > inode is thrown out of the cache. Looks good. > The new counter in the struct xfs_inode fits into a hole in the > structure on 64 bit machines, so does not grow the size of the inode > at all. There's no counter any more. (the text further above could also use some minor updates for that) Reviewed-by: Christoph Hellwig From BATV+4df0dc983a175be70c99+2676+infradead.org+hch@bombadil.srs.infradead.org Tue Dec 21 10:44:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBLGiaOR057416 for ; Tue, 21 Dec 2010 10:44:36 -0600 X-ASG-Debug-ID: 1292949993-78b3026b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0DEF614712CC for ; Tue, 21 Dec 2010 08:46:33 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id ERIkL1GV6MgfGoJl for ; Tue, 21 Dec 2010 08:46:33 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PV5M8-0003Ce-PZ; Tue, 21 Dec 2010 16:46:32 +0000 Date: Tue, 21 Dec 2010 11:46:32 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfsqa: make hole tests independent of speculative allocation patterns Subject: Re: [PATCH] xfsqa: make hole tests independent of speculative allocation patterns Message-ID: <20101221164632.GB9093@infradead.org> References: <1292922120-28360-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292922120-28360-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[18.85.46.34] X-Barracuda-Start-Time: 1292949994 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 21, 2010 at 08:02:00PM +1100, Dave Chinner wrote: > From: Dave Chinner > > Many of the "count-the-holes" tests (008, 012, etc) do writes that extend the > file and hence allocation patterns are dependent on speculative allocation > beyond EOF behaviour. Hence if we change that behaviour, these tests all fail > because there is a different pattern of holes. > > Make the tests independent of EOF preallocation behaviour by first truncating > the file to the size the test is defined to use. This prevents speculative > prealocation from occurring, and hence changes in such behaviour will not cause > the tests to fail. > > Signed-off-by: Dave Chinner Looks good and fixes the test failure I saw with the dirty release counter patch. Reviewed-by: Christoph Hellwig From SRS0+w/qT+24+fromorbit.com=david@internode.on.net Tue Dec 21 15:29:25 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBLLTOBC095442 for ; Tue, 21 Dec 2010 15:29:25 -0600 X-ASG-Debug-ID: 1292967080-6e9201770000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 05359214AC9 for ; Tue, 21 Dec 2010 13:31:20 -0800 (PST) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id GpZFq9aHbOTwmES9 for ; Tue, 21 Dec 2010 13:31:20 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50900821-1927428 for multiple; Wed, 22 Dec 2010 08:01:18 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PV9nR-0002Qn-64; Wed, 22 Dec 2010 08:31:01 +1100 Date: Wed, 22 Dec 2010 08:31:01 +1100 From: Dave Chinner To: naveen yadav Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Issue on kernel 2.6.35.9 vanilla Subject: Re: Issue on kernel 2.6.35.9 vanilla Message-ID: <20101221213101.GA4907@dastard> References: MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1292967082 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50109 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 21, 2010 at 07:41:51PM +0530, naveen yadav wrote: > Hi all, > > We have one disk that got corrupted, when I connect to my PC, haveing > kernel version(2.6.35.9). > The Disk mount well, but when i do 'ls; command it hangs. ls shouldn't hang. This should return: > Please find the dmesg. > /0x22 [xfs] >  [] xfs_da_do_buf+0x582/0x628 [xfs] >  [] ? xfs_da_read_buf+0x1d/0x22 [xfs] >  [] ? xfs_da_node_lookup_int+0x52/0x207 [xfs] >  [] ? xfs_da_read_buf+0x1d/0x22 [xfs] >  [] xfs_da_read_buf+0x1d/0x22 [xfs] >  [] ? xfs_da_node_lookup_int+0x52/0x207 [xfs] >  [] xfs_da_node_lookup_int+0x52/0x207 [xfs] >  [] xfs_dir2_node_lookup+0x5f/0xee [xfs] >  [] xfs_dir_lookup+0xde/0x110 [xfs] >  [] xfs_lookup+0x50/0x9f [xfs] >  [] xfs_vn_lookup+0x3e/0x76 [xfs] >  [] do_lookup+0xc9/0x139 >  [] link_path_walk+0x326/0x44d >  [] ? default_wake_function+0x10/0x12 >  [] path_walk+0x3f/0x89 >  [] ? path_init+0x9e/0x10c >  [] do_path_lookup+0x26/0x74 >  [] user_path_at+0x46/0x6c >  [] ? remove_wait_queue+0x27/0x2c >  [] ? spin_unlock_irqrestore+0xd/0xf >  [] ? __wake_up+0x37/0x40 >  [] vfs_fstatat+0x32/0x59 >  [] ? fsnotify_modify+0x54/0x5f >  [] vfs_lstat+0x1b/0x1d >  [] sys_lstat64+0x19/0x2d >  [] ? vfs_write+0xb5/0xf4 >  [] ? audit_syscall_entry+0x12a/0x14c >  [] ? trace_hardirqs_on_thunk+0xc/0x10 >  [] sysenter_do_call+0x12/0x2d > c2d9d000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  ................ > Filesystem "sdb2": XFS internal error xfs_da_do_buf(2) at line 2113 of > file fs/xfs/xfs_da_btree.c.  Caller 0xe0dfd3ce an EIO or EUCLEAN error to ls as it encountered a corrupted directory block. Can you post the output of: # echo w > /proc/sysrq-trigger to show us where it has hung? Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+r6Os+24+fromorbit.com=david@internode.on.net Tue Dec 21 15:40:49 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBLLemnh096907 for ; Tue, 21 Dec 2010 15:40:48 -0600 X-ASG-Debug-ID: 1292967762-0f1602520000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3DF6F1472734 for ; Tue, 21 Dec 2010 13:42:43 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id SHdJ1Fk1nSzMKGQz for ; Tue, 21 Dec 2010 13:42:43 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50637785-1927428 for multiple; Wed, 22 Dec 2010 08:12:42 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PV9yi-0002SY-OB; Wed, 22 Dec 2010 08:42:40 +1100 Date: Wed, 22 Dec 2010 08:42:40 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 06/34] xfs: dynamic speculative EOF preallocation Subject: Re: [PATCH 06/34] xfs: dynamic speculative EOF preallocation Message-ID: <20101221214240.GB4907@dastard> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> <1292916570-25015-7-git-send-email-david@fromorbit.com> <20101221151511.GA26127@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101221151511.GA26127@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1292967766 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0001 1.0000 -2.0204 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50110 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 21, 2010 at 10:15:11AM -0500, Christoph Hellwig wrote: > This patch causes tesr 014 to take ~ 870 seconds instead of 6, thus > beeing almost 150 times slower on mt 32-bit test VM, so I'll have to NAK > it for now. It's not the speculative preallocation changes - ithey are just exposing some other regression. That is, using MOUNT_OPTIONS="-o allocsize=4k" gives the previous behaviour, while allocsize=512m gives the same behaviour as the dynamic preallocation. The dynamic behaviour is resulting in megabyte sized IOs being issued for random 512 byte writes (which is wrong), so I'm tending towards it being a regression caused by the reecent writeback path changes. I'll dig deeper today. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+r6Os+24+fromorbit.com=david@internode.on.net Tue Dec 21 17:42:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBLNgJpO116663 for ; Tue, 21 Dec 2010 17:42:19 -0600 X-ASG-Debug-ID: 1292975054-73a203310000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4F5AE1CE9852 for ; Tue, 21 Dec 2010 15:44:14 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id WZWxVLcOj1Vc2xCj for ; Tue, 21 Dec 2010 15:44:14 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51163311-1927428 for multiple; Wed, 22 Dec 2010 10:14:13 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PVBsK-0002cd-3J; Wed, 22 Dec 2010 10:44:12 +1100 Date: Wed, 22 Dec 2010 10:44:12 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 06/34] xfs: dynamic speculative EOF preallocation Subject: Re: [PATCH 06/34] xfs: dynamic speculative EOF preallocation Message-ID: <20101221234412.GC4907@dastard> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> <1292916570-25015-7-git-send-email-david@fromorbit.com> <20101221151511.GA26127@infradead.org> <20101221214240.GB4907@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101221214240.GB4907@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1292975056 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50117 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 22, 2010 at 08:42:40AM +1100, Dave Chinner wrote: > On Tue, Dec 21, 2010 at 10:15:11AM -0500, Christoph Hellwig wrote: > > This patch causes tesr 014 to take ~ 870 seconds instead of 6, thus > > beeing almost 150 times slower on mt 32-bit test VM, so I'll have to NAK > > it for now. > > It's not the speculative preallocation changes - ithey are just > exposing some other regression. That is, using MOUNT_OPTIONS="-o > allocsize=4k" gives the previous behaviour, while allocsize=512m > gives the same behaviour as the dynamic preallocation. > > The dynamic behaviour is resulting in megabyte sized IOs being > issued for random 512 byte writes (which is wrong), so I'm tending > towards it being a regression caused by the reecent writeback path > changes. I'll dig deeper today. Ok, it's not a recent regression - it's the fact that the test is writing and truncating to random offsets so the file size is constantly changing resulting in xfs_zero_eof() writing huge amounts of zeros into preallocated extents beyond EOF. The patch below explains the situation and the change to the test to avoid the extended runtime. Ultimately, we probably need to change xfs_zero_eof() to allocate unwritten extents rather than write megabytes of zero for speculative allocation beyond EOF. However, I'm going to worry about that when (if) we come across applications that trigger this issue. -- xfstests: 014 takes forever with large preallocation sizes From: Dave Chinner Christoph reported that test 014 went from 7s to 870s runtime with the dynamic speculative delayed allocation changes. Analysis of test 014 shows that it does this loop 10,000 times: pwrite(random offset, 512 bytes); truncate(random offset); Where the random offset is anywhere in a 256MB file. Hence on average every second write or truncate extends the file. If large preallocatione beyond EOF sizes are used each extending write or truncate will zero large numbers of blocks - tens of megabytes at a time. The result is that instead of only writing ~10,000 blocks, we write hundreds to thousands of megabytes of zeros to the file and that is where the difference in runtime is coming from. The IO pattern that this test is using does not reflect a common (or sane!) real-world application IO pattern, so it is really just exercising the allocation and truncation paths in XFS. To do this, we don't need large amounts of preallocation beyond EOF that just slows down the operation, so execute the test with a fixed, small preallocation size that reflects the previous default. By specifying the preallocation size via the allocsize mount option, this also overrides any custom allocsize option provided for the test, so the test will not revert to extremely long runtimes when allocsize is provided on the command line. However, to ensure that we do actually get some coverage of the zeroing paths, set the allocsize mount option to 64k - this exercises the EOF zeroing paths, but does not affect the runtime of the test. Signed-off-by: Dave Chinner --- 014 | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/014 b/014 index a0c0403..e6e0a6f 100755 --- a/014 +++ b/014 @@ -50,6 +50,12 @@ _supported_os IRIX Linux _require_sparse_files _setup_testdir +# ensure EOF preallocation doesn't massively extend the runtime of this test +# by limiting the amount of preallocation and therefore the amount of blocks +# zeroed during the truncfile test run. +umount $TEST_DIR +_test_mount -o allocsize=64k + echo "brevity is wit..." echo "------" From SRS0+45mW+24+fromorbit.com=david@internode.on.net Tue Dec 21 17:51:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBLNpNs8118493 for ; Tue, 21 Dec 2010 17:51:23 -0600 X-ASG-Debug-ID: 1292975598-4a0c02b70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 07BB721533D for ; Tue, 21 Dec 2010 15:53:19 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id NyxwrBI9wsuRD0Yy for ; Tue, 21 Dec 2010 15:53:19 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50158013-1927428 for multiple; Wed, 22 Dec 2010 10:23:12 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PVC0r-0002e8-6O; Wed, 22 Dec 2010 10:53:01 +1100 Date: Wed, 22 Dec 2010 10:53:01 +1100 From: Dave Chinner To: Boaz Harrosh Cc: Christoph Hellwig , xfs@oss.sgi.com, linux-kernel@vger.kernel.org X-ASG-Orig-Subj: Re: XFS status update for November 2010 Subject: Re: XFS status update for November 2010 Message-ID: <20101221235301.GD4907@dastard> References: <20101220180013.GA16283@infradead.org> <4D109047.8050300@panasas.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4D109047.8050300@panasas.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1292975601 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50119 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 21, 2010 at 01:32:23PM +0200, Boaz Harrosh wrote: > On 12/20/2010 08:00 PM, Christoph Hellwig wrote: > >>From looking at the kernel git commits November looked like a pretty > > slow month with just two hand full fixes going into the release candidates > > for Linux 2.6.37, and none at all going into the development tree. > > But in this case git statistics didn't tell the whole story - there > > was a lot of activity on patches for the next merge window on the list. > > The focus in November was still at metadata scalability, with various > > patchsets that improves parallel creates and unlinks again, and also > > improves 8-way dbench throughput by 30%. In addition to that there > > were patches to improve preallocation for NFS servers, to simplify > > the writeback code, and to remove the XFS-internal percpu counters > > for free space for the generic kernel percpu counters, which just needed > > a small improvement. > > > > On the user space side we saw the release of xfsprogs 3.1.4, which > > contains various accumulated bug fixes and Debian packaging updates. > > The xfsdump tree saw a large update to speed up restore by using > > mmap for an internal database and remove the limitation of ~ 214 > > million directory entries per dump file. The xfstests test suite > > saw three new testcases and various fixes, including support for the > > hfsplus filesystem. > > Hi Christoph, happy holidays > > I love these reports you do, thank you > > I have one small request, could you please post them to > linux-fsdevel as well. linux-kernel@vger.kernel.org is so crowded > I keep missing them. Boaz, you can set up a modification watch on this page: http://xfs.org/index.php/XFS_Status_Updates as Christoph posts the updates there as well. Cheers, Dave. -- Dave Chinner david@fromorbit.com From aelder@sgi.com Tue Dec 21 20:20:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBM2K6pT145530 for ; Tue, 21 Dec 2010 20:20:06 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay1.corp.sgi.com (Postfix) with ESMTP id C08E08F8084; Tue, 21 Dec 2010 18:22:01 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Tue, 21 Dec 2010 20:20:15 -0600 Subject: Re: [PATCH 03/34] lib: percpu counter add unless less than functionality From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1292916570-25015-4-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> <1292916570-25015-4-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Tue, 21 Dec 2010 20:20:14 -0600 Message-ID: <1292984414.2408.357.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 22 Dec 2010 02:20:15.0251 (UTC) FILETIME=[C4F4A630:01CBA17E] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2010-12-21 at 18:28 +1100, Dave Chinner wrote: > From: Dave Chinner > > To use the generic percpu counter infrastructure for counters that > require conditional addition based on a threshold value we need > special handling of the counter. Further, the caller needs to know > the status of the conditional addition to determine what action to > take depending on whether the addition occurred or not. Examples of > this sort of usage are resource counters that cannot go below zero > (e.g. filesystem free blocks). > > To allow XFS to replace it's complex roll-your-own per-cpu > superblock counters, a single generic conditional function is > required: percpu_counter_add_unless_lt(). This will add the amount > to the counter unless the result would be less than the given > threshold. A caller supplied threshold is required because XFS does > not necessarily use the same threshold for every counter. > > percpu_counter_add_unless_lt() attempts to minimise counter lock > traversals by only taking the counter lock when the threshold is > within the error range of the current counter value. Hence when the > threshold is not within the counter error range, the counter will > still have the same scalability characteristics as the normal > percpu_counter_add() function. > > Adding this functionality to the generic percpu counters allows us > to remove the much more complex and less efficient XFS percpu > counter code (~700 lines of code) and replace it with generic > percpu counters. > > Signed-off-by: Dave Chinner I want to look at this one more closely again in the morning, but for now I'll just mention one nit, and one easily fixed problem. -Alex . . . > + * Add @amount to @fdc if and only if result of addition is greater than or ^^^ should be fbc > +EXPORT_SYMBOL(percpu_counter_add_unless_lt); > + This has to be: EXPORT_SYMBOL(__percpu_counter_add_unless_lt); (with leading underscores). From aelder@sgi.com Tue Dec 21 20:20:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBM2K6m2145538 for ; Tue, 21 Dec 2010 20:20:06 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4820C8F80A3; Tue, 21 Dec 2010 18:22:04 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Tue, 21 Dec 2010 20:20:47 -0600 Subject: Re: [PATCH 20/34] xfs: remove all the inodes on a buffer from the AIL in bulk From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1292916570-25015-21-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> <1292916570-25015-21-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Tue, 21 Dec 2010 20:20:46 -0600 Message-ID: <1292984446.2408.358.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 22 Dec 2010 02:20:47.0298 (UTC) FILETIME=[D80EA220:01CBA17E] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2010-12-21 at 18:29 +1100, Dave Chinner wrote: > From: Dave Chinner > > When inode buffer IO completes, usually all of the inodes are removed from the > AIL. This involves processing them one at a time and taking the AIL lock once > for every inode. When all CPUs are processing inode IO completions, this causes > excessive amount sof contention on the AIL lock. > > Instead, change the way we process inode IO completion in the buffer > IO done callback. Allow the inode IO done callback to walk the list > of IO done callbacks and pull all the inodes off the buffer in one > go and then process them as a batch. > > Once all the inodes for removal are collected, take the AIL lock > once and do a bulk removal operation to minimise traffic on the AIL > lock. > > Signed-off-by: Dave Chinner > Reviewed-by: Christoph Hellwig One question, below. -Alex . . . > @@ -861,28 +910,37 @@ xfs_iflush_done( > * the lock since it's cheaper, and then we recheck while > * holding the lock before removing the inode from the AIL. > */ > - if (iip->ili_logged && lip->li_lsn == iip->ili_flush_lsn) { > + if (need_ail) { > + struct xfs_log_item *log_items[need_ail]; What's the worst-case value of need_ail we might see here? From aelder@sgi.com Tue Dec 21 20:34:54 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBM2Ysk1148332 for ; Tue, 21 Dec 2010 20:34:54 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay2.corp.sgi.com (Postfix) with ESMTP id F04A53040D2; Tue, 21 Dec 2010 18:36:49 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Tue, 21 Dec 2010 20:29:38 -0600 Subject: Re: [PATCH 06/34] xfs: dynamic speculative EOF preallocation From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com In-Reply-To: <20101221234412.GC4907@dastard> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> <1292916570-25015-7-git-send-email-david@fromorbit.com> <20101221151511.GA26127@infradead.org> <20101221214240.GB4907@dastard> <20101221234412.GC4907@dastard> Content-Type: text/plain; charset="UTF-8" Date: Tue, 21 Dec 2010 20:29:37 -0600 Message-ID: <1292984977.2408.359.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 22 Dec 2010 02:29:38.0161 (UTC) FILETIME=[1479E610:01CBA180] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 2010-12-22 at 10:44 +1100, Dave Chinner wrote: > On Wed, Dec 22, 2010 at 08:42:40AM +1100, Dave Chinner wrote: > > On Tue, Dec 21, 2010 at 10:15:11AM -0500, Christoph Hellwig wrote: > > > This patch causes tesr 014 to take ~ 870 seconds instead of 6, thus > > > beeing almost 150 times slower on mt 32-bit test VM, so I'll have to NAK > > > it for now. > > > > It's not the speculative preallocation changes - ithey are just > > exposing some other regression. That is, using MOUNT_OPTIONS="-o > > allocsize=4k" gives the previous behaviour, while allocsize=512m > > gives the same behaviour as the dynamic preallocation. > > > > The dynamic behaviour is resulting in megabyte sized IOs being > > issued for random 512 byte writes (which is wrong), so I'm tending > > towards it being a regression caused by the reecent writeback path > > changes. I'll dig deeper today. > > Ok, it's not a recent regression - it's the fact that the test is > writing and truncating to random offsets so the file size is > constantly changing resulting in xfs_zero_eof() writing huge amounts > of zeros into preallocated extents beyond EOF. The patch below > explains the situation and the change to the test to avoid > the extended runtime. > > Ultimately, we probably need to change xfs_zero_eof() to allocate > unwritten extents rather than write megabytes of zero for > speculative allocation beyond EOF. However, I'm going to worry about > that when (if) we come across applications that trigger this issue. Your change to test 014 looks good to me, and makes the test take about the same time it did previously. Reviewed-by: Alex Elder > -- > > xfstests: 014 takes forever with large preallocation sizes > > From: Dave Chinner > . . . From SRS0+8jG0+25+fromorbit.com=david@internode.on.net Tue Dec 21 21:45:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBM3j5Vq158428 for ; Tue, 21 Dec 2010 21:45:06 -0600 X-ASG-Debug-ID: 1292989620-51fd00910000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 536DE27A0A5 for ; Tue, 21 Dec 2010 19:47:01 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id n8jB10sAZxjQjDVu for ; Tue, 21 Dec 2010 19:47:01 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50189701-1927428 for multiple; Wed, 22 Dec 2010 14:16:59 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PVFfG-0002wm-2P; Wed, 22 Dec 2010 14:46:58 +1100 Date: Wed, 22 Dec 2010 14:46:58 +1100 From: Dave Chinner To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 03/34] lib: percpu counter add unless less than functionality Subject: Re: [PATCH 03/34] lib: percpu counter add unless less than functionality Message-ID: <20101222034657.GE4907@dastard> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> <1292916570-25015-4-git-send-email-david@fromorbit.com> <1292984414.2408.357.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292984414.2408.357.camel@doink> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1292989623 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0001 1.0000 -2.0205 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50134 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 21, 2010 at 08:20:14PM -0600, Alex Elder wrote: > On Tue, 2010-12-21 at 18:28 +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > To use the generic percpu counter infrastructure for counters that > > require conditional addition based on a threshold value we need > > special handling of the counter. Further, the caller needs to know > > the status of the conditional addition to determine what action to > > take depending on whether the addition occurred or not. Examples of > > this sort of usage are resource counters that cannot go below zero > > (e.g. filesystem free blocks). > > > > To allow XFS to replace it's complex roll-your-own per-cpu > > superblock counters, a single generic conditional function is > > required: percpu_counter_add_unless_lt(). This will add the amount > > to the counter unless the result would be less than the given > > threshold. A caller supplied threshold is required because XFS does > > not necessarily use the same threshold for every counter. > > > > percpu_counter_add_unless_lt() attempts to minimise counter lock > > traversals by only taking the counter lock when the threshold is > > within the error range of the current counter value. Hence when the > > threshold is not within the counter error range, the counter will > > still have the same scalability characteristics as the normal > > percpu_counter_add() function. > > > > Adding this functionality to the generic percpu counters allows us > > to remove the much more complex and less efficient XFS percpu > > counter code (~700 lines of code) and replace it with generic > > percpu counters. > > > > Signed-off-by: Dave Chinner > > I want to look at this one more closely again in the > morning, but for now I'll just mention one nit, and > one easily fixed problem. > > -Alex > > . . . > > > + * Add @amount to @fdc if and only if result of addition is greater than or > ^^^ should be fbc > > > +EXPORT_SYMBOL(percpu_counter_add_unless_lt); > > + > > This has to be: > EXPORT_SYMBOL(__percpu_counter_add_unless_lt); > (with leading underscores). Yup, saw you comment about that on IRC overnight. Already fixed. ;) Cheers,, Dave. -- Dave Chinner david@fromorbit.com From SRS0+rKX3+25+fromorbit.com=david@internode.on.net Tue Dec 21 21:47:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBM3l8JN158833 for ; Tue, 21 Dec 2010 21:47:08 -0600 X-ASG-Debug-ID: 1292989744-1f00038a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DE7DF1CE9967 for ; Tue, 21 Dec 2010 19:49:04 -0800 (PST) Received: from mail.internode.on.net (bld-mail20.adl6.internode.on.net [150.101.137.105]) by cuda.sgi.com with ESMTP id RXYMSwLpw2Rnm1h7 for ; Tue, 21 Dec 2010 19:49:04 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 5498294-1927428 for multiple; Wed, 22 Dec 2010 14:19:03 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PVFhG-0002ww-Ck; Wed, 22 Dec 2010 14:49:02 +1100 Date: Wed, 22 Dec 2010 14:49:02 +1100 From: Dave Chinner To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 20/34] xfs: remove all the inodes on a buffer from the AIL in bulk Subject: Re: [PATCH 20/34] xfs: remove all the inodes on a buffer from the AIL in bulk Message-ID: <20101222034902.GF4907@dastard> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> <1292916570-25015-21-git-send-email-david@fromorbit.com> <1292984446.2408.358.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292984446.2408.358.camel@doink> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail20.adl6.internode.on.net[150.101.137.105] X-Barracuda-Start-Time: 1292989745 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50133 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 21, 2010 at 08:20:46PM -0600, Alex Elder wrote: > On Tue, 2010-12-21 at 18:29 +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > When inode buffer IO completes, usually all of the inodes are removed from the > > AIL. This involves processing them one at a time and taking the AIL lock once > > for every inode. When all CPUs are processing inode IO completions, this causes > > excessive amount sof contention on the AIL lock. > > > > Instead, change the way we process inode IO completion in the buffer > > IO done callback. Allow the inode IO done callback to walk the list > > of IO done callbacks and pull all the inodes off the buffer in one > > go and then process them as a batch. > > > > Once all the inodes for removal are collected, take the AIL lock > > once and do a bulk removal operation to minimise traffic on the AIL > > lock. > > > > Signed-off-by: Dave Chinner > > Reviewed-by: Christoph Hellwig > > One question, below. -Alex > > . . . > > > @@ -861,28 +910,37 @@ xfs_iflush_done( > > * the lock since it's cheaper, and then we recheck while > > * holding the lock before removing the inode from the AIL. > > */ > > - if (iip->ili_logged && lip->li_lsn == iip->ili_flush_lsn) { > > + if (need_ail) { > > + struct xfs_log_item *log_items[need_ail]; > > What's the worst-case value of need_ail we might see here? The number of inodes in a cluster. That's 32 for 256 byte inodes with the current 8k cluster size. Cheers, Dave -- Dave Chinner david@fromorbit.com From yad.naveen@gmail.com Tue Dec 21 22:55:47 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBM4tkee170008 for ; Tue, 21 Dec 2010 22:55:47 -0600 X-ASG-Debug-ID: 1292993864-7995010f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-qy0-f174.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B8DDD14721F8 for ; Tue, 21 Dec 2010 20:57:44 -0800 (PST) Received: from mail-qy0-f174.google.com (mail-qy0-f174.google.com [209.85.216.174]) by cuda.sgi.com with ESMTP id xbt6urthUQ1VRuGt for ; Tue, 21 Dec 2010 20:57:44 -0800 (PST) Received: by qyj19 with SMTP id 19so5965194qyj.5 for ; Tue, 21 Dec 2010 20:57:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:content-type :content-transfer-encoding; bh=48XaDHqB8c+Try5p6di8dx8a15qDxdiQcOEyjE3Z7z4=; b=xjXRPUp/iAfYHqj108UBd3LO7690rAYdLUMTM9rR3SwA3IY31sMx5upBlF4k2Uufa0 q9AJFAzKcB+4Mpdb1lWcN1rxe1noPutCqULXEP1CxaGicl0RxP+gQ4cgC/StJE2VX4oN AthD5VSLDYx7d6mtvKfwlplcTshMOGWb05Rko= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type:content-transfer-encoding; b=M8fJkYYIPrTd0xCdM8xrCqhvUEBgkq0R4zO71xb3uro/OTa8j5WPxyWcfBlpG1AfrQ SmqiT9R+TJg+ih3JeqvGxQtcVbl7dZ24r3DL2AZuNNauUwcaBkT3YA70us6GLPFETYqR amNmNNg1eGcQWw/AOtQbmV/TRnEXt9AIGAI0I= MIME-Version: 1.0 Received: by 10.229.246.82 with SMTP id lx18mr5474458qcb.248.1292993863432; Tue, 21 Dec 2010 20:57:43 -0800 (PST) Received: by 10.229.75.13 with HTTP; Tue, 21 Dec 2010 20:57:43 -0800 (PST) In-Reply-To: References: <20101221213101.GA4907@dastard> Date: Wed, 22 Dec 2010 10:27:43 +0530 Message-ID: X-ASG-Orig-Subj: Re: Issue on kernel 2.6.35.9 vanilla Subject: Re: Issue on kernel 2.6.35.9 vanilla From: naveen yadav To: Dave Chinner , xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-qy0-f174.google.com[209.85.216.174] X-Barracuda-Start-Time: 1292993864 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50138 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_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 22, 2010 at 10:27 AM, naveen yadav wrote= : > Hi Dave, > > Please find attached log as suggested by you. > > Kind regards > Naveen > > On Wed, Dec 22, 2010 at 3:01 AM, Dave Chinner wrote= : >> On Tue, Dec 21, 2010 at 07:41:51PM +0530, naveen yadav wrote: >>> Hi all, >>> >>> We have one disk that got corrupted, when I connect to my PC, haveing >>> kernel version(2.6.35.9). >>> The Disk mount well, but when i do 'ls; command it hangs. >> >> ls shouldn't hang. This should return: >> >>> Please find the dmesg. >>> /0x22 [xfs] >>> =A0[] xfs_da_do_buf+0x582/0x628 [xfs] >>> =A0[] ? xfs_da_read_buf+0x1d/0x22 [xfs] >>> =A0[] ? xfs_da_node_lookup_int+0x52/0x207 [xfs] >>> =A0[] ? xfs_da_read_buf+0x1d/0x22 [xfs] >>> =A0[] xfs_da_read_buf+0x1d/0x22 [xfs] >>> =A0[] ? xfs_da_node_lookup_int+0x52/0x207 [xfs] >>> =A0[] xfs_da_node_lookup_int+0x52/0x207 [xfs] >>> =A0[] xfs_dir2_node_lookup+0x5f/0xee [xfs] >>> =A0[] xfs_dir_lookup+0xde/0x110 [xfs] >>> =A0[] xfs_lookup+0x50/0x9f [xfs] >>> =A0[] xfs_vn_lookup+0x3e/0x76 [xfs] >>> =A0[] do_lookup+0xc9/0x139 >>> =A0[] link_path_walk+0x326/0x44d >>> =A0[] ? default_wake_function+0x10/0x12 >>> =A0[] path_walk+0x3f/0x89 >>> =A0[] ? path_init+0x9e/0x10c >>> =A0[] do_path_lookup+0x26/0x74 >>> =A0[] user_path_at+0x46/0x6c >>> =A0[] ? remove_wait_queue+0x27/0x2c >>> =A0[] ? spin_unlock_irqrestore+0xd/0xf >>> =A0[] ? __wake_up+0x37/0x40 >>> =A0[] vfs_fstatat+0x32/0x59 >>> =A0[] ? fsnotify_modify+0x54/0x5f >>> =A0[] vfs_lstat+0x1b/0x1d >>> =A0[] sys_lstat64+0x19/0x2d >>> =A0[] ? vfs_write+0xb5/0xf4 >>> =A0[] ? audit_syscall_entry+0x12a/0x14c >>> =A0[] ? trace_hardirqs_on_thunk+0xc/0x10 >>> =A0[] sysenter_do_call+0x12/0x2d >>> c2d9d000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff =A0..........= ...... >>> Filesystem "sdb2": XFS internal error xfs_da_do_buf(2) at line 2113 of >>> file fs/xfs/xfs_da_btree.c. =A0Caller 0xe0dfd3ce >> >> an EIO or EUCLEAN error to ls as it encountered a corrupted >> directory block. Can you post the output of: >> >> # echo w > /proc/sysrq-trigger >> >> to show us where it has hung? >> >> Cheers, >> >> Dave. >> >> >> -- >> Dave Chinner >> david@fromorbit.com >> > From amit.sahrawat83@gmail.com Tue Dec 21 23:33:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.5 required=5.0 tests=BAYES_05,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBM5XWHD176480 for ; Tue, 21 Dec 2010 23:33:32 -0600 X-ASG-Debug-ID: 1292996127-247f00390000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-qy0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CFC3614732AE for ; Tue, 21 Dec 2010 21:35:27 -0800 (PST) Received: from mail-qy0-f181.google.com (mail-qy0-f181.google.com [209.85.216.181]) by cuda.sgi.com with ESMTP id hQ3mjc6iX6UK4Dnn for ; Tue, 21 Dec 2010 21:35:27 -0800 (PST) Received: by qyk12 with SMTP id 12so5146530qyk.5 for ; Tue, 21 Dec 2010 21:35:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:date:message-id :subject:from:to:content-type; bh=50sQudGbktr3hUfEiHCogJMITzAZ4fCBS0ZJpm13RMw=; b=qv0SGIsReRx20fciD3zF9v/mKOIJzNEod5fL7unX7KuF7qe8Csp46BfxyQpcPQ/F88 8DCk0gUbsdHldk2mnrs2NIgXvPrang375L7OR+bLRv0OkitghGGfdr0I9m3BIhBoWgw2 EN9kVdYyYQsrq1lXgzste0uU8rWa3VibSnE5g= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=WSPuo6QsLNTCAMUJ13ysBuFKFAp2t23e67U407oahQ3oGqPqG0xsd2v6LYFqsix/7F ndf7UV+71iClhCTSiW1UZ078VO0X8C3Tz2rOwPEUhAEb1Fyzc55xopYRChjquw1adXwq 1KMXGytnjp2CjrQwJeWr1cUZby/NVeknsxE/Y= MIME-Version: 1.0 Received: by 10.229.192.144 with SMTP id dq16mr5621225qcb.100.1292996126928; Tue, 21 Dec 2010 21:35:26 -0800 (PST) Received: by 10.220.96.65 with HTTP; Tue, 21 Dec 2010 21:35:26 -0800 (PST) Date: Wed, 22 Dec 2010 11:05:26 +0530 Message-ID: X-ASG-Orig-Subj: XFS hangs Subject: XFS hangs From: Amit Sahrawat To: xfs@oss.sgi.com, Eric Sandeen , Dave Chinner Content-Type: multipart/alternative; boundary=0016363b8030d7758e0497f91e2f X-Barracuda-Connect: mail-qy0-f181.google.com[209.85.216.181] X-Barracuda-Start-Time: 1292996127 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50142 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --0016363b8030d7758e0497f91e2f Content-Type: text/plain; charset=ISO-8859-1 Hi, I am encountering hang of XFS filesystem, please find the logs as given below: INFO: task usb_mount:1858 blocked for more than 120 seconds. "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. usb_mount D [84a42440] 8032d62c 0 1858 1816 (user thread) Stack : 00000107 00000000 85e7be80 00030002 84a425c8 8032d62c 7fffffff 84a42440 00000002 8496e200 00000001 00000000 85e7bf00 85e7bef8 7fa2f2e0 8032d62c 00000001 801d69a8 85e7bd40 801d6b34 85e7bd4c 8032dc6c 00000000 801dbc80 85e7be80 864315a8 8662c980 00000001 00000742 00000000 00000000 84b85800 85e7bd90 801d6cc0 7fffffff 84a42440 00000002 8032ee74 00000081 804158a0 ... Call Trace: [<8032d574>] __schedule+0x618/0x6b8 from[<8032d62c>] schedule+0x18/0x3c [<8032d62c>] schedule+0x18/0x3c from[<8032dc6c>] schedule_timeout+0x2c/0x1c0 [<8032dc6c>] schedule_timeout+0x2c/0x1c0 from[<8032ee74>] __down+0x8c/0xdc [<8032ee74>] __down+0x8c/0xdc from[<8004500c>] down+0x40/0x88 [<8004500c>] down+0x40/0x88 from[<801ca838>] xfs_buf_lock+0xcc/0x15c [<801ca838>] xfs_buf_lock+0xcc/0x15c from[<801b71a0>] xfs_getsb+0x38/0x54 [<801b71a0>] xfs_getsb+0x38/0x54 from[<801d64a8>] xfs_sync_fsdata+0x7c/0x154 [<801d64a8>] xfs_sync_fsdata+0x7c/0x154 from[<801d7284>] xfs_quiesce_data+0x34/0x60 [<801d7284>] xfs_quiesce_data+0x34/0x60 from[<801d3514>] xfs_fs_sync_fs+0x30/0xec [<801d3514>] xfs_fs_sync_fs+0x30/0xec from[<800ba09c>] __fsync_super+0xa4/0xc8 [<800ba09c>] __fsync_super+0xa4/0xc8 from[<800ba0d4>] fsync_super+0x14/0x28 [<800ba0d4>] fsync_super+0x14/0x28 from[<800ba4a0>] generic_shutdown_super+0x34/0x190 [<800ba4a0>] generic_shutdown_super+0x34/0x190 from[<800ba654>] kill_block_super+0x58/0x80 [<800ba654>] kill_block_super+0x58/0x80 from[<800bac6c>] deactivate_super+0x7c/0x110 [<800bac6c>] deactivate_super+0x7c/0x110 from[<800d2bbc>] sys_umount+0x310/0x358 [<800d2bbc>] sys_umount+0x310/0x358 from[<8000ff44>] stack_done+0x20/0x3c After reboot it works fine, but during this state XFS does not works no operation. Thanks, Amit Sahrawat --0016363b8030d7758e0497f91e2f Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Hi,
I am encountering hang of XFS filesystem, please find the logs as give= n below:
INFO: task usb_mount:1858 blocked for more than 120 seconds.
"= echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this mes= sage.
usb_mount=A0=A0=A0=A0=A0=A0=A0 D [84a42440] 8032d62c=A0=A0=A0=A0 0= =A0 1858=A0=A0 1816=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 (user thread)
Stack : 00000107 00000000 85e7be80 00030002 84a425c8 8032d62c 7fffffff 84a4= 2440
=A0=A0=A0=A0=A0=A0=A0 00000002 8496e200 00000001 00000000 85e7bf00 = 85e7bef8 7fa2f2e0 8032d62c
=A0=A0=A0=A0=A0=A0=A0 00000001 801d69a8 85e7b= d40 801d6b34 85e7bd4c 8032dc6c 00000000 801dbc80
=A0=A0=A0=A0=A0=A0=A0 85e7be80 864315a8 8662c980 00000001 00000742 00000000= 00000000 84b85800
=A0=A0=A0=A0=A0=A0=A0 85e7bd90 801d6cc0 7fffffff 84a4= 2440 00000002 8032ee74 00000081 804158a0
=A0=A0=A0=A0=A0=A0=A0 ...
Ca= ll Trace:
[<8032d574>] __schedule+0x618/0x6b8 from[<8032d62c>= ;] schedule+0x18/0x3c
[<8032d62c>] schedule+0x18/0x3c from[<8032dc6c>] schedule_timeo= ut+0x2c/0x1c0
[<8032dc6c>] schedule_timeout+0x2c/0x1c0 from[<80= 32ee74>] __down+0x8c/0xdc
[<8032ee74>] __down+0x8c/0xdc from[&l= t;8004500c>] down+0x40/0x88
[<8004500c>] down+0x40/0x88 from[<801ca838>] xfs_buf_lock+0xcc/= 0x15c
[<801ca838>] xfs_buf_lock+0xcc/0x15c from[<801b71a0>] = xfs_getsb+0x38/0x54
[<801b71a0>] xfs_getsb+0x38/0x54 from[<801d= 64a8>] xfs_sync_fsdata+0x7c/0x154
[<801d64a8>] xfs_sync_fsdata+0x7c/0x154 from[<801d7284>] xfs_qu= iesce_data+0x34/0x60
[<801d7284>] xfs_quiesce_data+0x34/0x60 from[= <801d3514>] xfs_fs_sync_fs+0x30/0xec
[<801d3514>] xfs_fs_syn= c_fs+0x30/0xec from[<800ba09c>] __fsync_super+0xa4/0xc8
[<800ba09c>] __fsync_super+0xa4/0xc8 from[<800ba0d4>] fsync_sup= er+0x14/0x28
[<800ba0d4>] fsync_super+0x14/0x28 from[<800ba4a0&= gt;] generic_shutdown_super+0x34/0x190
[<800ba4a0>] generic_shutdo= wn_super+0x34/0x190 from[<800ba654>] kill_block_super+0x58/0x80
[<800ba654>] kill_block_super+0x58/0x80 from[<800bac6c>] deacti= vate_super+0x7c/0x110
[<800bac6c>] deactivate_super+0x7c/0x110 fro= m[<800d2bbc>] sys_umount+0x310/0x358
[<800d2bbc>] sys_umount= +0x310/0x358 from[<8000ff44>] stack_done+0x20/0x3c
After reboot it works fine, but during this state XFS does not works n= o operation.
=A0
Thanks,
Amit Sahrawat
=A0
--0016363b8030d7758e0497f91e2f-- From SRS0+rKX3+25+fromorbit.com=david@internode.on.net Wed Dec 22 00:01:21 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBM61Kh3183606 for ; Wed, 22 Dec 2010 00:01:21 -0600 X-ASG-Debug-ID: 1292997796-799703780000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8610F147382D for ; Tue, 21 Dec 2010 22:03:16 -0800 (PST) Received: from mail.internode.on.net (bld-mail20.adl6.internode.on.net [150.101.137.105]) by cuda.sgi.com with ESMTP id QJGv7ZGrSUyUUaSL for ; Tue, 21 Dec 2010 22:03:16 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 5514184-1927428 for multiple; Wed, 22 Dec 2010 16:33:06 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PVHmy-00036g-N3; Wed, 22 Dec 2010 17:03:04 +1100 Date: Wed, 22 Dec 2010 17:02:54 +1100 From: Dave Chinner To: Amit Sahrawat Cc: xfs@oss.sgi.com, Eric Sandeen X-ASG-Orig-Subj: Re: XFS hangs Subject: Re: XFS hangs Message-ID: <20101222060254.GH4907@dastard> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail20.adl6.internode.on.net[150.101.137.105] X-Barracuda-Start-Time: 1292997798 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50142 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 22, 2010 at 11:05:26AM +0530, Amit Sahrawat wrote: > Hi, > I am encountering hang of XFS filesystem, please find the logs as given > below: > INFO: task usb_mount:1858 blocked for more than 120 seconds. > "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > usb_mount D [84a42440] 8032d62c 0 1858 > 1816 (user thread) > Stack : 00000107 00000000 85e7be80 00030002 84a425c8 8032d62c 7fffffff > 84a42440 > 00000002 8496e200 00000001 00000000 85e7bf00 85e7bef8 7fa2f2e0 > 8032d62c > 00000001 801d69a8 85e7bd40 801d6b34 85e7bd4c 8032dc6c 00000000 > 801dbc80 > 85e7be80 864315a8 8662c980 00000001 00000742 00000000 00000000 > 84b85800 > 85e7bd90 801d6cc0 7fffffff 84a42440 00000002 8032ee74 00000081 > 804158a0 > ... > Call Trace: > [<8032d574>] __schedule+0x618/0x6b8 from[<8032d62c>] schedule+0x18/0x3c > [<8032d62c>] schedule+0x18/0x3c from[<8032dc6c>] schedule_timeout+0x2c/0x1c0 > [<8032dc6c>] schedule_timeout+0x2c/0x1c0 from[<8032ee74>] __down+0x8c/0xdc > [<8032ee74>] __down+0x8c/0xdc from[<8004500c>] down+0x40/0x88 > [<8004500c>] down+0x40/0x88 from[<801ca838>] xfs_buf_lock+0xcc/0x15c > [<801ca838>] xfs_buf_lock+0xcc/0x15c from[<801b71a0>] xfs_getsb+0x38/0x54 > [<801b71a0>] xfs_getsb+0x38/0x54 from[<801d64a8>] xfs_sync_fsdata+0x7c/0x154 > [<801d64a8>] xfs_sync_fsdata+0x7c/0x154 from[<801d7284>] > xfs_quiesce_data+0x34/0x60 > [<801d7284>] xfs_quiesce_data+0x34/0x60 from[<801d3514>] > xfs_fs_sync_fs+0x30/0xec > [<801d3514>] xfs_fs_sync_fs+0x30/0xec from[<800ba09c>] > __fsync_super+0xa4/0xc8 > [<800ba09c>] __fsync_super+0xa4/0xc8 from[<800ba0d4>] fsync_super+0x14/0x28 > [<800ba0d4>] fsync_super+0x14/0x28 from[<800ba4a0>] > generic_shutdown_super+0x34/0x190 > [<800ba4a0>] generic_shutdown_super+0x34/0x190 from[<800ba654>] > kill_block_super+0x58/0x80 > [<800ba654>] kill_block_super+0x58/0x80 from[<800bac6c>] > deactivate_super+0x7c/0x110 > [<800bac6c>] deactivate_super+0x7c/0x110 from[<800d2bbc>] > sys_umount+0x310/0x358 > [<800d2bbc>] sys_umount+0x310/0x358 from[<8000ff44>] stack_done+0x20/0x3c Please make sure you paste stack traces cleanly in your emails so we can read them easily. > After reboot it works fine, but during this state XFS does not works no > operation. What kernel? What did you do to produce the error? What is the output of "echo w > /proc/sysrq-trigger"? Do you have a repeatable test case? What sort of storage are you using? Were there any IO errors before the hang? etc, etc, etc.... -- For future reference, when you are reporting a problem you need to be specific about what you were doing to cause the problem you are reporting. Describe your kernel, your storage, your test case, any errors that occurred before the problem you are reporting, etc. We need this information to make any sense of your bug report, but I'm getting tired of having to ask for it every time you report a problem. The more information you put in your bug report, the more likely we are to be able to help you. We don't have unlimited amounts of time (or patience) to drag all the basic details of your problem out of you over 3 or 4 emails, so including it up front will help a lot.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From amit.sahrawat83@gmail.com Wed Dec 22 00:55:54 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBM6tsD5192917 for ; Wed, 22 Dec 2010 00:55:54 -0600 X-ASG-Debug-ID: 1293001071-12d401500000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-qw0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4093A216010 for ; Tue, 21 Dec 2010 22:57:51 -0800 (PST) Received: from mail-qw0-f53.google.com (mail-qw0-f53.google.com [209.85.216.53]) by cuda.sgi.com with ESMTP id OyMrXI5LDFgJSgzp for ; Tue, 21 Dec 2010 22:57:51 -0800 (PST) Received: by qwe5 with SMTP id 5so5222812qwe.26 for ; Tue, 21 Dec 2010 22:57:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:cc:content-type; bh=V73D87RNRSZNVTT8L/MpfsqVgYhBGXReqN7ClFhEB60=; b=HPL8YDkM1eVNrtFidxHQC38XJcCIETUCtVm3L6Txd/mNSQQkdfN3NCs+kpkgBmufLw 1+tUbHac4DnFteNCFNY3Gspf+YCvKrevfaq1Y/n7cp1kUQ40mRGq8nrxuw+FaCHUBZb4 rI4BcX3mYndvC8DiQu+PKx1c45EbfXQOXOcrc= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; b=opSWrnqpUkS3dSawcdODWX7X4zvPViYUqTfVfUC9Nj8DWAkXFZ/EvxUyTZBa1Ej2ht TQnb3js2ZKnAuSjcbMCgp3gNaMNL1fFwDC8POfI5AcVWMP03nJrm/Sd2m3sG/lnZdg0K iaEXDFDRGzQtVwsswB7GcWMbi+bBaA06tZfXE= MIME-Version: 1.0 Received: by 10.224.69.200 with SMTP id a8mr6067946qaj.190.1293001071117; Tue, 21 Dec 2010 22:57:51 -0800 (PST) Received: by 10.220.96.65 with HTTP; Tue, 21 Dec 2010 22:57:51 -0800 (PST) In-Reply-To: References: <20101222060254.GH4907@dastard> Date: Wed, 22 Dec 2010 12:27:51 +0530 Message-ID: X-ASG-Orig-Subj: Re: XFS hangs Subject: Re: XFS hangs From: Amit Sahrawat To: Dave Chinner Cc: xfs@oss.sgi.com, Eric Sandeen Content-Type: multipart/alternative; boundary=0016e64c0c4e89c6b70497fa4523 X-Barracuda-Connect: mail-qw0-f53.google.com[209.85.216.53] X-Barracuda-Start-Time: 1293001072 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50147 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --0016e64c0c4e89c6b70497fa4523 Content-Type: text/plain; charset=ISO-8859-1 I tried changing the locking in *File :* xfs_sync.c *Function :* int xfs_quiesce_data(struct xfs_mount *mp) /* write superblock and hoover up shutdown errors */ - error = xfs_sync_fsdata(mp, SYNC_WAIT); + error = xfs_sync_fsdata(mp,SYNC_TRYLOCK); This change was just out of curiousity, I am trying to reproduce the hang with this, but didn't observe one in last many iterations. Also, I am looking at possible side effects for the same change. Please let me know about this. To add to this, the code area in doubt according to me: fs/xfs/xfs_buf_item.c Function: void xfs_buf_iodone_callbacks( xfs_buf_t *bp), in this function, XFS_BUF_SET_BRELSE_FUNC(bp,xfs_buf_error_relse); xfs_buf_error_relse is registered as callback, which will unlock the lock held, but I really doubt if the callback is getting called. Still analyzing this code area. Please update me if this is the right direction. Thanks & Regards, Amit Sahrawat On Wed, Dec 22, 2010 at 12:11 PM, Amit Sahrawat wrote: > Extremely sorry for inconvenience, will take care about posting complete > details in future. > > *Test Case : * > cp Complex directory structure(large no of files and directories) to my XFS > formatted partition: > cp -ar /LibExe /usb/sda2 > Unplug the USB while the COPY is in progress. > > *Storage: *USB Flash, USB HDD (Both) > > *Kernel: *2.6.34 > *Target: *MIPS > *LOGS:* > usb 2-1: USB disconnect, address 7 > Device sda2, XFS metadata write error block 0x0 in sda2 > xfs_force_shutdown(sda2,0x1) called from line 1004 of file > fs/xfs/linux-2.6/xfs_buf.c. Return address = 0x801cc294 > Filesystem "sda2": I/O Error Detected. Shutting down filesystem: sda2 > Please umount the filesystem, and rectify the problem(s) > > Plug in USB Port1 > sd 7:0:0:0: [sdb] Attached SCSI disk > Filesystem "sda2": xfs_log_force: error 5 returned. > Filesystem "sda2": xfs_log_force: error 5 returned. > Filesystem "sda2": xfs_log_force: error 5 returned. > Filesystem "sda2": xfs_log_force: error 5 returned. > INFO: task usb_mount:1858 blocked for more than 120 seconds. > "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > usb_mount D [84a42440] 8032d62c 0 1858 > 1816 (user thread) > Stack : 00000107 00000000 85e7be80 00030002 84a425c8 8032d62c 7fffffff > 84a42440 > 00000002 8496e200 00000001 00000000 85e7bf00 85e7bef8 7fa2f2e0 > 8032d62c > 00000001 801d69a8 85e7bd40 801d6b34 85e7bd4c 8032dc6c 00000000 > 801dbc80 > 85e7be80 864315a8 8662c980 00000001 00000742 00000000 00000000 > 84b85800 > 85e7bd90 801d6cc0 7fffffff 84a42440 00000002 8032ee74 00000081 > 804158a0 > ... > Call Trace: > [<8032d574>] __schedule+0x618/0x6b8 from[<8032d62c>] schedule+0x18/0x3c > [<8032d62c>] schedule+0x18/0x3c from[<8032dc6c>] > schedule_timeout+0x2c/0x1c0 > [<8032dc6c>] schedule_timeout+0x2c/0x1c0 from[<8032ee74>] __down+0x8c/0xdc > [<8032ee74>] __down+0x8c/0xdc from[<8004500c>] down+0x40/0x88 > [<8004500c>] down+0x40/0x88 from[<801ca838>] xfs_buf_lock+0xcc/0x15c > [<801ca838>] xfs_buf_lock+0xcc/0x15c from[<801b71a0>] xfs_getsb+0x38/0x54 > [<801b71a0>] xfs_getsb+0x38/0x54 from[<801d64a8>] > xfs_sync_fsdata+0x7c/0x154 > [<801d64a8>] xfs_sync_fsdata+0x7c/0x154 from[<801d7284>] > xfs_quiesce_data+0x34/0x60 > [<801d7284>] xfs_quiesce_data+0x34/0x60 from[<801d3514>] > xfs_fs_sync_fs+0x30/0xec > [<801d3514>] xfs_fs_sync_fs+0x30/0xec from[<800ba09c>] > __fsync_super+0xa4/0xc8 > [<800ba09c>] __fsync_super+0xa4/0xc8 from[<800ba0d4>] fsync_super+0x14/0x28 > [<800ba0d4>] fsync_super+0x14/0x28 from[<800ba4a0>] > generic_shutdown_super+0x34/0x190 > [<800ba4a0>] generic_shutdown_super+0x34/0x190 from[<800ba654>] > kill_block_super+0x58/0x80 > [<800ba654>] kill_block_super+0x58/0x80 from[<800bac6c>] > deactivate_super+0x7c/0x110 > [<800bac6c>] deactivate_super+0x7c/0x110 from[<800d2bbc>] > sys_umount+0x310/0x358 > [<800d2bbc>] sys_umount+0x310/0x358 from[<8000ff44>] stack_done+0x20/0x3c > > ------------------------------------------------------------------------------------- > Filesystem "sda2": xfs_log_force: error 5 returned. > > Please let me know in case more information is needed. > > Thanks & Regards, > Amit Sahrawat > On Wed, Dec 22, 2010 at 11:32 AM, Dave Chinner wrote: > >> On Wed, Dec 22, 2010 at 11:05:26AM +0530, Amit Sahrawat wrote: >> > Hi, >> > I am encountering hang of XFS filesystem, please find the logs as given >> > below: >> > INFO: task usb_mount:1858 blocked for more than 120 seconds. >> > "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this >> message. >> > usb_mount D [84a42440] 8032d62c 0 1858 >> > 1816 (user thread) >> > Stack : 00000107 00000000 85e7be80 00030002 84a425c8 8032d62c 7fffffff >> > 84a42440 >> > 00000002 8496e200 00000001 00000000 85e7bf00 85e7bef8 7fa2f2e0 >> > 8032d62c >> > 00000001 801d69a8 85e7bd40 801d6b34 85e7bd4c 8032dc6c 00000000 >> > 801dbc80 >> > 85e7be80 864315a8 8662c980 00000001 00000742 00000000 00000000 >> > 84b85800 >> > 85e7bd90 801d6cc0 7fffffff 84a42440 00000002 8032ee74 00000081 >> > 804158a0 >> > ... >> > Call Trace: >> > [<8032d574>] __schedule+0x618/0x6b8 from[<8032d62c>] schedule+0x18/0x3c >> > [<8032d62c>] schedule+0x18/0x3c from[<8032dc6c>] >> schedule_timeout+0x2c/0x1c0 >> > [<8032dc6c>] schedule_timeout+0x2c/0x1c0 from[<8032ee74>] >> __down+0x8c/0xdc >> > [<8032ee74>] __down+0x8c/0xdc from[<8004500c>] down+0x40/0x88 >> > [<8004500c>] down+0x40/0x88 from[<801ca838>] xfs_buf_lock+0xcc/0x15c >> > [<801ca838>] xfs_buf_lock+0xcc/0x15c from[<801b71a0>] >> xfs_getsb+0x38/0x54 >> > [<801b71a0>] xfs_getsb+0x38/0x54 from[<801d64a8>] >> xfs_sync_fsdata+0x7c/0x154 >> > [<801d64a8>] xfs_sync_fsdata+0x7c/0x154 from[<801d7284>] >> > xfs_quiesce_data+0x34/0x60 >> > [<801d7284>] xfs_quiesce_data+0x34/0x60 from[<801d3514>] >> > xfs_fs_sync_fs+0x30/0xec >> > [<801d3514>] xfs_fs_sync_fs+0x30/0xec from[<800ba09c>] >> > __fsync_super+0xa4/0xc8 >> > [<800ba09c>] __fsync_super+0xa4/0xc8 from[<800ba0d4>] >> fsync_super+0x14/0x28 >> > [<800ba0d4>] fsync_super+0x14/0x28 from[<800ba4a0>] >> > generic_shutdown_super+0x34/0x190 >> > [<800ba4a0>] generic_shutdown_super+0x34/0x190 from[<800ba654>] >> > kill_block_super+0x58/0x80 >> > [<800ba654>] kill_block_super+0x58/0x80 from[<800bac6c>] >> > deactivate_super+0x7c/0x110 >> > [<800bac6c>] deactivate_super+0x7c/0x110 from[<800d2bbc>] >> > sys_umount+0x310/0x358 >> > [<800d2bbc>] sys_umount+0x310/0x358 from[<8000ff44>] >> stack_done+0x20/0x3c >> >> Please make sure you paste stack traces cleanly in your emails so we >> can read them easily. >> -- >> > After reboot it works fine, but during this state XFS does not works no >> > operation. >> >> What kernel? What did you do to produce the error? What is the output >> of "echo w > /proc/sysrq-trigger"? Do you have a repeatable test >> case? What sort of storage are you using? Were there any IO errors >> before the hang? etc, etc, etc.... >> >> -- >> >> For future reference, when you are reporting a problem you need to >> be specific about what you were doing to cause the problem you are >> reporting. Describe your kernel, your storage, your test case, any >> errors that occurred before the problem you are reporting, etc. >> >> We need this information to make any sense of your bug report, but >> I'm getting tired of having to ask for it every time you report a >> problem. The more information you put in your bug report, the more >> likely we are to be able to help you. We don't have unlimited >> amounts of time (or patience) to drag all the basic details of your >> problem out of you over 3 or 4 emails, so including it up front will >> help a lot.... >> >> Cheers, >> >> Dave. >> -- >> Dave Chinner >> david@fromorbit.com >> > > --0016e64c0c4e89c6b70497fa4523 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
I tried changing the locking in
=A0
File : xfs_sync.c
Function : int xfs_quiesce_data(struct xfs_mount=A0*m= p)
=A0/* write superblock and hoover up shutdown errors */
- =A0error = =3D xfs_sync_fsdata(mp, SYNC_WAIT);
+ error =3D xfs_sync_fsdata(mp,SYNC_= TRYLOCK);
=A0
This change was just out of curiousity, I am trying to reproduce the h= ang with this, but didn't observe one in last many iterations.
Also, I am looking at possible side effects for the same change. Pleas= e let me know about this.
=A0
To add to this, the code area in doubt according to me:
fs/xfs/xfs_buf_item.c
Function: void xfs_buf_iodone_callbacks(=A0xfs_buf_t=A0*bp), in this f= unction,
=A0XFS_BUF_SET_BRELSE_FUNC(bp,xfs_buf_error_relse); xfs_buf_error_rels= e is registered as callback, which will unlock the lock held, but I really = doubt if the callback is getting called. Still analyzing this code area.
=A0
Please update me if this is the right direction.
=A0
Thanks & Regards,
Amit Sahrawat
=A0


=A0
On Wed, Dec 22, 2010 at 12:11 PM, Amit Sahrawat = <amit.sah= rawat83@gmail.com> wrote:
Extremely sorry for inconvenience, will take care about posting comple= te details in future.
=A0
Test Case :
cp Complex directory structure(large no of files and directories)=A0to= my XFS formatted partition:
cp -ar /LibExe /usb/sda2
Unplug the USB while the COPY is in progress.
=A0
Storage: USB Flash, USB HDD (Both)
=A0
Kernel: 2.6.34
Target: MIPS
LOGS:
usb 2-1: USB disconnect, address 7
Device sda2, XFS metadata write = error block 0x0 in sda2
xfs_force_shutdown(sda2,0x1) called from line 10= 04 of file fs/xfs/linux-2.6/xfs_buf.c.=A0 Return address =3D 0x801cc294
Filesystem "sda2": I/O Error Detected.=A0 Shutting down filesyste= m: sda2
Please umount the filesystem, and rectify the problem(s)
=A0
Plug in USB Port1
sd 7:0:0:0: [sdb] Attached SCSI disk
Filesystem "sda2": xfs_log_force: error 5 returned.
Filesystem "sda2": xfs_log_force: error 5 returned.
Files= ystem "sda2": xfs_log_force: error 5 returned.
Filesystem "sda2": xfs_log_force: error 5 returned.
INFO: task usb_mount:1858 blocked for more than 120 seconds.
"= echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this mes= sage.
usb_mount=A0=A0=A0=A0=A0=A0=A0 D [84a42440] 8032d62c=A0=A0=A0=A0 0= =A0 1858=A0=A0 1816=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 (user thread)
Stack : 00000107 00000000 85e7be80 00030002 84a425c8 8032d62c 7fffffff 84a4= 2440
=A0=A0=A0=A0=A0=A0=A0 00000002 8496e200 00000001 00000000 85e7bf00 = 85e7bef8 7fa2f2e0 8032d62c
=A0=A0=A0=A0=A0=A0=A0 00000001 801d69a8 85e7b= d40 801d6b34 85e7bd4c 8032dc6c 00000000 801dbc80
=A0=A0=A0=A0=A0=A0=A0 85e7be80 864315a8 8662c980 00000001 00000742 00000000= 00000000 84b85800
=A0=A0=A0=A0=A0=A0=A0 85e7bd90 801d6cc0 7fffffff 84a4= 2440 00000002 8032ee74 00000081 804158a0
=A0=A0=A0=A0=A0=A0=A0 ...
Ca= ll Trace:
[<8032d574>] __schedule+0x618/0x6b8 from[<8032d62c>= ;] schedule+0x18/0x3c
[<8032d62c>] schedule+0x18/0x3c from[<8032dc6c>] schedule_timeo= ut+0x2c/0x1c0
[<8032dc6c>] schedule_timeout+0x2c/0x1c0 from[<80= 32ee74>] __down+0x8c/0xdc
[<8032ee74>] __down+0x8c/0xdc from[&l= t;8004500c>] down+0x40/0x88
[<8004500c>] down+0x40/0x88 from[<801ca838>] xfs_buf_lock+0xcc/= 0x15c
[<801ca838>] xfs_buf_lock+0xcc/0x15c from[<801b71a0>] = xfs_getsb+0x38/0x54
[<801b71a0>] xfs_getsb+0x38/0x54 from[<801d= 64a8>] xfs_sync_fsdata+0x7c/0x154
[<801d64a8>] xfs_sync_fsdata+0x7c/0x154 from[<801d7284>] xfs_qu= iesce_data+0x34/0x60
[<801d7284>] xfs_quiesce_data+0x34/0x60 from[= <801d3514>] xfs_fs_sync_fs+0x30/0xec
[<801d3514>] xfs_fs_syn= c_fs+0x30/0xec from[<800ba09c>] __fsync_super+0xa4/0xc8
[<800ba09c>] __fsync_super+0xa4/0xc8 from[<800ba0d4>] fsync_sup= er+0x14/0x28
[<800ba0d4>] fsync_super+0x14/0x28 from[<800ba4a0&= gt;] generic_shutdown_super+0x34/0x190
[<800ba4a0>] generic_shutdo= wn_super+0x34/0x190 from[<800ba654>] kill_block_super+0x58/0x80
[<800ba654>] kill_block_super+0x58/0x80 from[<800bac6c>] deacti= vate_super+0x7c/0x110
[<800bac6c>] deactivate_super+0x7c/0x110 fro= m[<800d2bbc>] sys_umount+0x310/0x358
[<800d2bbc>] sys_umount= +0x310/0x358 from[<8000ff44>] stack_done+0x20/0x3c
----------------------------------------------------------------------= ---------------
Filesystem "sda2": xfs_log_force: error 5 retu= rned.

Please let me know in case more information is needed.
=A0
Thanks & Regards,
Amit Sahrawat
On Wed, Dec 22, 2010 at 11:32 AM, Dave Chinner <= span dir=3D"ltr"><david@fromorbit.com> wrote:
On Wed, Dec 22, 2010 at 11:05:26AM +0530, Amit Sahrawat wrote:
>= Hi,
> I am encountering hang of XFS filesystem, please find the logs= as given
> below:
> INFO: task usb_mount:1858 blocked for more= than 120 seconds.
> "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disabl= es this message.
> usb_mount =A0 =A0 =A0 =A0D [84a42440] 8032d62c =A0= =A0 0 =A01858
> 1816 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 (user thread)
> Stack : 00000107 00000000 85e7be80 00030002 = 84a425c8 8032d62c 7fffffff
> 84a42440
> =A0 =A0 =A0 =A0 00000002 8496e200 00000001 00000000 8= 5e7bf00 85e7bef8 7fa2f2e0
> 8032d62c
> =A0 =A0 =A0 =A0 00000001= 801d69a8 85e7bd40 801d6b34 85e7bd4c 8032dc6c 00000000
> 801dbc80
= > =A0 =A0 =A0 =A0 85e7be80 864315a8 8662c980 00000001 00000742 00000000 = 00000000
> 84b85800
> =A0 =A0 =A0 =A0 85e7bd90 801d6cc0 7fffffff 84a42440 0= 0000002 8032ee74 00000081
> 804158a0
> =A0 =A0 =A0 =A0 ...
&= gt; Call Trace:
> [<8032d574>] __schedule+0x618/0x6b8 from[<= 8032d62c>] schedule+0x18/0x3c
> [<8032d62c>] schedule+0x18/0x3c from[<8032dc6c>] schedule_= timeout+0x2c/0x1c0
> [<8032dc6c>] schedule_timeout+0x2c/0x1c0 f= rom[<8032ee74>] __down+0x8c/0xdc
> [<8032ee74>] __down+0x= 8c/0xdc from[<8004500c>] down+0x40/0x88
> [<8004500c>] down+0x40/0x88 from[<801ca838>] xfs_buf_lock+= 0xcc/0x15c
> [<801ca838>] xfs_buf_lock+0xcc/0x15c from[<801b= 71a0>] xfs_getsb+0x38/0x54
> [<801b71a0>] xfs_getsb+0x38/0x5= 4 from[<801d64a8>] xfs_sync_fsdata+0x7c/0x154
> [<801d64a8>] xfs_sync_fsdata+0x7c/0x154 from[<801d7284>]> xfs_quiesce_data+0x34/0x60
> [<801d7284>] xfs_quiesce_da= ta+0x34/0x60 from[<801d3514>]
> xfs_fs_sync_fs+0x30/0xec
> [<801d3514>] xfs_fs_sync_fs+0x30/0xec from[<800ba09c>]
= > __fsync_super+0xa4/0xc8
> [<800ba09c>] __fsync_super+0xa4/= 0xc8 from[<800ba0d4>] fsync_super+0x14/0x28
> [<800ba0d4>= ] fsync_super+0x14/0x28 from[<800ba4a0>]
> generic_shutdown_super+0x34/0x190
> [<800ba4a0>] generic_s= hutdown_super+0x34/0x190 from[<800ba654>]
> kill_block_super+0x= 58/0x80
> [<800ba654>] kill_block_super+0x58/0x80 from[<800b= ac6c>]
> deactivate_super+0x7c/0x110
> [<800bac6c>] deactivate_supe= r+0x7c/0x110 from[<800d2bbc>]
> sys_umount+0x310/0x358
> = [<800d2bbc>] sys_umount+0x310/0x358 from[<8000ff44>] stack_done= +0x20/0x3c

Please make sure you paste stack traces cleanly in your ema= ils so we
can read them easily.
--
> After reboot it works fine, but during this state XFS does = not works no
> operation.

What kernel? What did you do t= o produce the error? What is the output
of "echo w > /proc/sysrq= -trigger"? Do you have a repeatable test
case? What sort of storage are you using? Were there any IO errors
befor= e the hang? etc, etc, etc....

--

For future reference, when y= ou are reporting a problem you need to
be specific about what you were d= oing to cause the problem you are
reporting. =A0Describe your kernel, your storage, your test case, any
er= rors that occurred before the problem you are reporting, etc.

We nee= d this information to make any sense of your bug report, but
I'm get= ting tired of having to ask for it every time you report a
problem. The more information you put in your bug report, the more
likel= y we are to be able to help you. We don't have unlimited
amounts of = time (or patience) to drag all the basic details of your
problem out of = you over 3 or 4 emails, so including it up front will
help a lot....

Cheers,

Dave.
--Dave Chinner
d= avid@fromorbit.com


--0016e64c0c4e89c6b70497fa4523-- From yad.naveen@gmail.com Wed Dec 22 00:58:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBM6wE5Q193349 for ; Wed, 22 Dec 2010 00:58:15 -0600 X-ASG-Debug-ID: 1293001211-3ba501780000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-qy0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 710F31473A88 for ; Tue, 21 Dec 2010 23:00:11 -0800 (PST) Received: from mail-qy0-f181.google.com (mail-qy0-f181.google.com [209.85.216.181]) by cuda.sgi.com with ESMTP id of9QGWJhHk45i3EZ for ; Tue, 21 Dec 2010 23:00:11 -0800 (PST) Received: by qyk12 with SMTP id 12so5201210qyk.5 for ; Tue, 21 Dec 2010 23:00:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:content-type; bh=3VdFA9E/Vq4LYVTqumCJuew+4OP09ASMhjBMAiv5Vw8=; b=O7o54Xtn87s6RuwvQ3VhgigVlmvJwpi+rYGqoDUAQLims5udIRtirMzA8Ujh82LchK +Lkn/hbQBwKC6wV2+Z3GfybllClYWSaJMlNgXC78GC7ZQ5t8YzfSJoRGKqRMLeAqZd39 OdOJXgC6n8iQ8/2NomCu+fb6bf/mGBsU4C3VM= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; b=MUwB+aQPB+2PWHUhTHIAW//OlfFk1Hkcl0QCSTaT9Eiq98AKEO2uaMiqFYk+lzkwFu NasKSKbq7nZMxbEp2XPs6NrdX+ZoqEukMwpOEFOaQKAG4H7elSWgaV9+jxoTejSToxHk n9r00VaXvjF8Pbi32FI6cE7BauuGV4RRD161I= MIME-Version: 1.0 Received: by 10.229.213.211 with SMTP id gx19mr5682281qcb.172.1293001211158; Tue, 21 Dec 2010 23:00:11 -0800 (PST) Received: by 10.229.75.13 with HTTP; Tue, 21 Dec 2010 23:00:11 -0800 (PST) In-Reply-To: <20101222053730.GG4907@dastard> References: <20101221213101.GA4907@dastard> <20101222053730.GG4907@dastard> Date: Wed, 22 Dec 2010 12:30:11 +0530 Message-ID: X-ASG-Orig-Subj: Re: Issue on kernel 2.6.35.9 vanilla Subject: Re: Issue on kernel 2.6.35.9 vanilla From: naveen yadav To: Dave Chinner , xfs@oss.sgi.com Content-Type: multipart/mixed; boundary=0016362842eae2a29f0497fa4d18 X-Barracuda-Connect: mail-qy0-f181.google.com[209.85.216.181] X-Barracuda-Start-Time: 1293001212 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50146 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_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --0016362842eae2a29f0497fa4d18 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Thanks a lot Dave, Please find attached log for command xfs_repair -n. Thanks a lot On Wed, Dec 22, 2010 at 11:07 AM, Dave Chinner wrote: > On Wed, Dec 22, 2010 at 10:27:16AM +0530, naveen yadav wrote: >> Hi Dave, >> >> Please find attached log as suggested by you. >> >> Kind regards >> Naveen >> >> On Wed, Dec 22, 2010 at 3:01 AM, Dave Chinner wrot= e: >> > On Tue, Dec 21, 2010 at 07:41:51PM +0530, naveen yadav wrote: >> >> Hi all, >> >> >> >> We have one disk that got corrupted, when I connect to my PC, haveing >> >> kernel version(2.6.35.9). >> >> The Disk mount well, but when i do 'ls; command it hangs. >> > >> > ls shouldn't hang. This should return: >> > >> >> Please find the dmesg. >> >> /0x22 [xfs] >> >> =A0[] xfs_da_do_buf+0x582/0x628 [xfs] >> >> =A0[] ? xfs_da_read_buf+0x1d/0x22 [xfs] >> >> =A0[] ? xfs_da_node_lookup_int+0x52/0x207 [xfs] >> >> =A0[] ? xfs_da_read_buf+0x1d/0x22 [xfs] >> >> =A0[] xfs_da_read_buf+0x1d/0x22 [xfs] >> >> =A0[] ? xfs_da_node_lookup_int+0x52/0x207 [xfs] >> >> =A0[] xfs_da_node_lookup_int+0x52/0x207 [xfs] > ..... >> >> c2d9d000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff =A0........= ........ >> >> Filesystem "sdb2": XFS internal error xfs_da_do_buf(2) at line 2113 o= f >> >> file fs/xfs/xfs_da_btree.c. =A0Caller 0xe0dfd3ce > > This is not in your dmesg log. When did it actually happen? Before > the hung task timer started to trip? From your log: > > scsi 5:0:0:0: Direct-Access =A0 =A0 SanDisk =A0Cruzer Blade =A0 =A0 1.00 = PQ: 0 ANSI: 2 > sd 5:0:0:0: Attached scsi generic sg1 type 0 > sd 5:0:0:0: [sdb] 15625216 512-byte logical blocks: (8.00 GB/7.45 GiB) > sd 5:0:0:0: [sdb] Write Protect is off > sd 5:0:0:0: [sdb] Mode Sense: 03 00 00 00 > sd 5:0:0:0: [sdb] Assuming drive cache: write through > sd 5:0:0:0: [sdb] Assuming drive cache: write through > =A0sdb: sdb1 sdb2 > sd 5:0:0:0: [sdb] Assuming drive cache: write through > sd 5:0:0:0: [sdb] Attached SCSI removable disk > SELinux: initialized (dev sdb1, type vfat), uses genfs_contexts > XFS mounting filesystem sdb2 > Starting XFS recovery on filesystem: sdb2 (logdev: internal) > Ending XFS recovery on filesystem: sdb2 (logdev: internal) > SELinux: initialized (dev sdb2, type xfs), uses xattr > INFO: task gvfs-gdu-volume:2311 blocked for more than 120 seconds. > "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > gvfs-gdu-volu D 00000026 =A0 =A0 0 =A02311 =A0 =A0 =A01 0x00000080 > =A0c6cf9b2c 00000086 a41cc623 00000026 c0a25e00 c0a25e00 c0a25e00 c0a25e0= 0 > =A0d1290f54 c0a25e00 c0a25e00 000336ad 00000000 cd871c00 00000026 d1290cd= 0 > =A000000000 cd8d2a08 cd8d2a00 7fffffff 7fffffff c6cf9b70 c0781c43 0000000= 0 > Call Trace: > =A0[] schedule_timeout+0x1b/0x95 > =A0[] __down_common+0x82/0xb9 > =A0[] ? _xfs_buf_find+0x122/0x1b8 [xfs] > =A0[] __down+0x17/0x19 > =A0[] down+0x27/0x37 > =A0[] xfs_buf_lock+0x67/0x93 [xfs] > =A0[] _xfs_buf_find+0x122/0x1b8 [xfs] > =A0[] xfs_buf_get+0x60/0x149 [xfs] > =A0[] xfs_buf_read+0x22/0xb0 [xfs] > =A0[] xfs_trans_read_buf+0x53/0x2e9 [xfs] > =A0[] xfs_da_do_buf+0x411/0x628 [xfs] > =A0[] ? xfs_da_node_lookup_int+0x52/0x207 [xfs] > =A0[] xfs_da_read_buf+0x1d/0x22 [xfs] > =A0[] ? xfs_da_node_lookup_int+0x52/0x207 [xfs] > =A0[] xfs_da_node_lookup_int+0x52/0x207 [xfs] > =A0[] xfs_dir2_node_lookup+0x5f/0xee [xfs] > =A0[] xfs_dir_lookup+0xde/0x110 [xfs] > =A0[] xfs_lookup+0x50/0x9f [xfs] > =A0[] xfs_vn_lookup+0x3e/0x76 [xfs] > =A0[] do_lookup+0xc9/0x139 > =A0[] do_last+0x186/0x49f > =A0[] do_filp_open+0x1bd/0x459 > =A0[] ? timekeeping_get_ns+0x16/0x54 > =A0[] ? might_fault+0x1e/0x20 > =A0[] ? alloc_fd+0x58/0xbe > =A0[] do_sys_open+0x4d/0xe4 > =A0[] ? audit_syscall_entry+0x12a/0x14c > =A0[] sys_open+0x23/0x2b > =A0[] sysenter_do_call+0x12/0x2d > > You've got a gvfs (gnome-vfs?) process stuck waiting on a buffer > lock. The onyl way I can see it getting stuck here is if it the > buffer has not been unlocked somewhere. It's possible that it is > stuck on the same buffer that the corruption error came from, > but the corrupted buffer is unlocked in the error handling path. > what does `xfs_repair -n` tell about the filesytsem? > > FWIW, later on: > > ...... > INFO: task gvfsd-trash:1891 blocked for more than 120 seconds. > "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > gvfsd-trash =A0 D 00000026 =A0 =A0 0 =A01891 =A0 =A0 =A01 0x00000080 > > gvfs-trashd gets stuck on a mutex during a path walk which is > probably held by the above directory read. > > .... > INFO: task gvfs-gdu-volume:2321 blocked for more than 120 seconds. > "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > gvfs-gdu-volu D 00000026 =A0 =A0 0 =A02321 =A0 =A0 =A01 0x00000088 > > As does this one. > > .... > > gvfs-gdu-volu D 00000026 =A0 =A0 0 =A01889 =A0 =A0 =A01 0x00000080 > =A0cda3df10 00000086 a422923c 00000026 c0a25e00 c0a25e00 c0a25e00 c0a25e0= 0 > =A0cd936904 c0a25e00 c0a25e00 000b9ea1 00000000 cda24400 00000026 cd93668= 0 > =A000ae3000 c34c01a4 c34c019c cd936680 c34c01a0 cda3df44 c0782093 c34c01a= c > Call Trace: > =A0[] __mutex_lock_common+0xe8/0x137 > =A0[] __mutex_lock_killable_slowpath+0x17/0x19 > =A0[] ? mutex_lock_killable+0x32/0x45 > =A0[] mutex_lock_killable+0x32/0x45 > =A0[] vfs_readdir+0x46/0x94 > =A0[] ? filldir64+0x0/0xf5 > =A0[] sys_getdents64+0x72/0xb2 > =A0[] sysenter_do_call+0x12/0x2d > > And this one, too. > > ..... > ls =A0 =A0 =A0 =A0 =A0 =A0D 00000000 =A0 =A0 0 =A02325 =A0 2044 0x0000008= 0 > =A0c6d03f10 00200086 00000000 00000000 c0a25e00 c0a25e00 c0a25e00 c0a25e0= 0 > =A0cdacb5c4 c0a25e00 c0a25e00 d6779fa1 00000029 00000000 00000029 cdacb34= 0 > =A000000001 c34c01a4 c34c019c cdacb340 c34c01a0 c6d03f44 c0782093 c34c01a= c > Call Trace: > =A0[] __mutex_lock_common+0xe8/0x137 > =A0[] __mutex_lock_killable_slowpath+0x17/0x19 > =A0[] ? mutex_lock_killable+0x32/0x45 > =A0[] mutex_lock_killable+0x32/0x45 > =A0[] vfs_readdir+0x46/0x94 > =A0[] ? filldir64+0x0/0xf5 > =A0[] sys_getdents64+0x72/0xb2 > =A0[] sysenter_do_call+0x12/0x2d > > And finally, there is an ls process that is hung, stuck on a > directory mutex. Is this the one you were seeing hang rather than > whatever generated the corrupion report? > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --0016362842eae2a29f0497fa4d18 Content-Type: application/octet-stream; name=xfs_repair_log Content-Disposition: attachment; filename=xfs_repair_log Content-Transfer-Encoding: base64 X-Attachment-Id: f_ghzvhpxz0 UGhhc2UgMSAtIGZpbmQgYW5kIHZlcmlmeSBzdXBlcmJsb2NrLi4uClBoYXNlIDIgLSB1c2luZyBp bnRlcm5hbCBsb2cKICAgICAgICAtIHNjYW4gZmlsZXN5c3RlbSBmcmVlc3BhY2UgYW5kIGlub2Rl IG1hcHMuLi4Kc2JfaWNvdW50IDY0LCBjb3VudGVkIDI1NgpzYl9pZnJlZSA1NiwgY291bnRlZCA0 OQpzYl9mZGJsb2NrcyAxNDE4OTg3LCBjb3VudGVkIDE0MjUyNDEKICAgICAgICAtIGZvdW5kIHJv b3QgaW5vZGUgY2h1bmsKUGhhc2UgMyAtIGZvciBlYWNoIEFHLi4uCiAgICAgICAgLSBzY2FuIChi dXQgZG9uJ3QgY2xlYXIpIGFnaSB1bmxpbmtlZCBsaXN0cy4uLgogICAgICAgIC0gcHJvY2VzcyBr bm93biBpbm9kZXMgYW5kIHBlcmZvcm0gaW5vZGUgZGlzY292ZXJ5Li4uCiAgICAgICAgLSBhZ25v ID0gMApiYWQgZGlyIG1hZ2ljIG51bWJlciAweGQyZjEgaW4gaW5vZGUgMTI4IGJubyA9IDgzODg2 MDgKZGF0YSBmb3JrIGluIGlubyAyMzE5IGNsYWltcyBmcmVlIGJsb2NrIDE2MwppbWFwIGNsYWlt cyBpbi11c2UgaW5vZGUgMjMxOSBpcyBmcmVlLCB3b3VsZCBjb3JyZWN0IGltYXAKZGF0YSBmb3Jr IGluIGlubyAyMzIwIGNsYWltcyBmcmVlIGJsb2NrIDE2NAppbWFwIGNsYWltcyBpbi11c2UgaW5v ZGUgMjMyMCBpcyBmcmVlLCB3b3VsZCBjb3JyZWN0IGltYXAKaW1hcCBjbGFpbXMgaW4tdXNlIGlu b2RlIDIzMjEgaXMgZnJlZSwgd291bGQgY29ycmVjdCBpbWFwCmltYXAgY2xhaW1zIGluLXVzZSBp bm9kZSAyMzIyIGlzIGZyZWUsIHdvdWxkIGNvcnJlY3QgaW1hcAppbWFwIGNsYWltcyBpbi11c2Ug aW5vZGUgMjMyMyBpcyBmcmVlLCB3b3VsZCBjb3JyZWN0IGltYXAKaW1hcCBjbGFpbXMgaW4tdXNl IGlub2RlIDIzMjQgaXMgZnJlZSwgd291bGQgY29ycmVjdCBpbWFwCmltYXAgY2xhaW1zIGluLXVz ZSBpbm9kZSAyMzI1IGlzIGZyZWUsIHdvdWxkIGNvcnJlY3QgaW1hcAppbWFwIGNsYWltcyBpbi11 c2UgaW5vZGUgMjMyNiBpcyBmcmVlLCB3b3VsZCBjb3JyZWN0IGltYXAKaW1hcCBjbGFpbXMgaW4t dXNlIGlub2RlIDIzMjcgaXMgZnJlZSwgd291bGQgY29ycmVjdCBpbWFwCmltYXAgY2xhaW1zIGlu LXVzZSBpbm9kZSAyMzI4IGlzIGZyZWUsIHdvdWxkIGNvcnJlY3QgaW1hcAppbWFwIGNsYWltcyBp bi11c2UgaW5vZGUgMjMyOSBpcyBmcmVlLCB3b3VsZCBjb3JyZWN0IGltYXAKaW1hcCBjbGFpbXMg aW4tdXNlIGlub2RlIDIzMzAgaXMgZnJlZSwgd291bGQgY29ycmVjdCBpbWFwCmltYXAgY2xhaW1z IGluLXVzZSBpbm9kZSAyMzMxIGlzIGZyZWUsIHdvdWxkIGNvcnJlY3QgaW1hcAppbWFwIGNsYWlt cyBpbi11c2UgaW5vZGUgMjMzMiBpcyBmcmVlLCB3b3VsZCBjb3JyZWN0IGltYXAKaW1hcCBjbGFp bXMgaW4tdXNlIGlub2RlIDIzMzMgaXMgZnJlZSwgd291bGQgY29ycmVjdCBpbWFwCmltYXAgY2xh aW1zIGluLXVzZSBpbm9kZSAyMzM0IGlzIGZyZWUsIHdvdWxkIGNvcnJlY3QgaW1hcAppbWFwIGNs YWltcyBpbi11c2UgaW5vZGUgMjMzNSBpcyBmcmVlLCB3b3VsZCBjb3JyZWN0IGltYXAKaW1hcCBj bGFpbXMgaW4tdXNlIGlub2RlIDIzMzYgaXMgZnJlZSwgd291bGQgY29ycmVjdCBpbWFwCmltYXAg Y2xhaW1zIGluLXVzZSBpbm9kZSAyMzM3IGlzIGZyZWUsIHdvdWxkIGNvcnJlY3QgaW1hcAppbWFw IGNsYWltcyBpbi11c2UgaW5vZGUgMjMzOCBpcyBmcmVlLCB3b3VsZCBjb3JyZWN0IGltYXAKaW1h cCBjbGFpbXMgaW4tdXNlIGlub2RlIDIzMzkgaXMgZnJlZSwgd291bGQgY29ycmVjdCBpbWFwCmlt YXAgY2xhaW1zIGluLXVzZSBpbm9kZSAyMzQwIGlzIGZyZWUsIHdvdWxkIGNvcnJlY3QgaW1hcApp bWFwIGNsYWltcyBpbi11c2UgaW5vZGUgMjM0MSBpcyBmcmVlLCB3b3VsZCBjb3JyZWN0IGltYXAK aW1hcCBjbGFpbXMgaW4tdXNlIGlub2RlIDIzNDIgaXMgZnJlZSwgd291bGQgY29ycmVjdCBpbWFw CmltYXAgY2xhaW1zIGluLXVzZSBpbm9kZSAyMzQzIGlzIGZyZWUsIHdvdWxkIGNvcnJlY3QgaW1h cAppbWFwIGNsYWltcyBpbi11c2UgaW5vZGUgMjM0NCBpcyBmcmVlLCB3b3VsZCBjb3JyZWN0IGlt YXAKaW1hcCBjbGFpbXMgaW4tdXNlIGlub2RlIDIzNDUgaXMgZnJlZSwgd291bGQgY29ycmVjdCBp bWFwCmltYXAgY2xhaW1zIGluLXVzZSBpbm9kZSAyMzQ2IGlzIGZyZWUsIHdvdWxkIGNvcnJlY3Qg aW1hcAppbWFwIGNsYWltcyBpbi11c2UgaW5vZGUgMjM0NyBpcyBmcmVlLCB3b3VsZCBjb3JyZWN0 IGltYXAKaW1hcCBjbGFpbXMgaW4tdXNlIGlub2RlIDIzNDggaXMgZnJlZSwgd291bGQgY29ycmVj dCBpbWFwCmltYXAgY2xhaW1zIGluLXVzZSBpbm9kZSAyMzQ5IGlzIGZyZWUsIHdvdWxkIGNvcnJl Y3QgaW1hcAppbWFwIGNsYWltcyBpbi11c2UgaW5vZGUgMjM1MCBpcyBmcmVlLCB3b3VsZCBjb3Jy ZWN0IGltYXAKaW1hcCBjbGFpbXMgaW4tdXNlIGlub2RlIDIzNTEgaXMgZnJlZSwgd291bGQgY29y cmVjdCBpbWFwCmltYXAgY2xhaW1zIGluLXVzZSBpbm9kZSAyMzUyIGlzIGZyZWUsIHdvdWxkIGNv cnJlY3QgaW1hcAppbWFwIGNsYWltcyBpbi11c2UgaW5vZGUgMjM1MyBpcyBmcmVlLCB3b3VsZCBj b3JyZWN0IGltYXAKaW1hcCBjbGFpbXMgaW4tdXNlIGlub2RlIDIzNTQgaXMgZnJlZSwgd291bGQg Y29ycmVjdCBpbWFwCmltYXAgY2xhaW1zIGluLXVzZSBpbm9kZSAyMzU1IGlzIGZyZWUsIHdvdWxk IGNvcnJlY3QgaW1hcAppbWFwIGNsYWltcyBpbi11c2UgaW5vZGUgMjM1NiBpcyBmcmVlLCB3b3Vs ZCBjb3JyZWN0IGltYXAKaW1hcCBjbGFpbXMgaW4tdXNlIGlub2RlIDIzNTcgaXMgZnJlZSwgd291 bGQgY29ycmVjdCBpbWFwCmltYXAgY2xhaW1zIGluLXVzZSBpbm9kZSAyMzU4IGlzIGZyZWUsIHdv dWxkIGNvcnJlY3QgaW1hcAppbWFwIGNsYWltcyBpbi11c2UgaW5vZGUgMjM1OSBpcyBmcmVlLCB3 b3VsZCBjb3JyZWN0IGltYXAKaW1hcCBjbGFpbXMgaW4tdXNlIGlub2RlIDIzNjAgaXMgZnJlZSwg d291bGQgY29ycmVjdCBpbWFwCmltYXAgY2xhaW1zIGluLXVzZSBpbm9kZSAyMzYxIGlzIGZyZWUs IHdvdWxkIGNvcnJlY3QgaW1hcAppbWFwIGNsYWltcyBpbi11c2UgaW5vZGUgMjM2MiBpcyBmcmVl LCB3b3VsZCBjb3JyZWN0IGltYXAKaW1hcCBjbGFpbXMgaW4tdXNlIGlub2RlIDIzNjMgaXMgZnJl ZSwgd291bGQgY29ycmVjdCBpbWFwCmltYXAgY2xhaW1zIGluLXVzZSBpbm9kZSAyMzY0IGlzIGZy ZWUsIHdvdWxkIGNvcnJlY3QgaW1hcAppbWFwIGNsYWltcyBpbi11c2UgaW5vZGUgMjM2NSBpcyBm cmVlLCB3b3VsZCBjb3JyZWN0IGltYXAKaW1hcCBjbGFpbXMgaW4tdXNlIGlub2RlIDIzNjYgaXMg ZnJlZSwgd291bGQgY29ycmVjdCBpbWFwCmltYXAgY2xhaW1zIGluLXVzZSBpbm9kZSAyMzY3IGlz IGZyZWUsIHdvdWxkIGNvcnJlY3QgaW1hcAogICAgICAgIC0gYWdubyA9IDEKICAgICAgICAtIGFn bm8gPSAyCiAgICAgICAgLSBhZ25vID0gMwogICAgICAgIC0gcHJvY2VzcyBuZXdseSBkaXNjb3Zl cmVkIGlub2Rlcy4uLgpiN2YwZjZjMDogQmFkbmVzcyBpbiBrZXkgbG9va3VwIChsZW5ndGgpCmJw PShibm8gNTA0MCwgbGVuIDgxOTIgYnl0ZXMpIGtleT0oYm5vIDUwNDAsIGxlbiA0MDk2IGJ5dGVz KQpQaGFzZSA0IC0gY2hlY2sgZm9yIGR1cGxpY2F0ZSBibG9ja3MuLi4KICAgICAgICAtIHNldHRp bmcgdXAgZHVwbGljYXRlIGV4dGVudCBsaXN0Li4uCiAgICAgICAgLSBjaGVjayBmb3IgaW5vZGVz IGNsYWltaW5nIGR1cGxpY2F0ZSBibG9ja3MuLi4KICAgICAgICAtIGFnbm8gPSAxCiAgICAgICAg LSBhZ25vID0gMwogICAgICAgIC0gYWdubyA9IDIKICAgICAgICAtIGFnbm8gPSAwCmVudHJ5ICIz MzkudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMTYgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZl cmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA0NTAxCgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIg aW4gZW50cnkgYXQgb2Zmc2V0IDE2Li4uCmVudHJ5ICIzNDAudGVzdCIgYXQgYmxvY2sgMiBvZmZz ZXQgNDAgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9k ZSA0NTAyCgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDQwLi4u CmVudHJ5ICIzNDEudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgNjQgaW4gZGlyZWN0b3J5IGlub2Rl IDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA0NTAzCgl3b3VsZCBjbGVhciBpbm9k ZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDY0Li4uCmVudHJ5ICIzNDIudGVzdCIgYXQgYmxv Y2sgMiBvZmZzZXQgODggaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlz dGVudCBpbm9kZSA0NTA0Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zm c2V0IDg4Li4uCmVudHJ5ICIzNDMudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMTEyIGluIGRpcmVj dG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNDUwNQoJd291bGQg Y2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAxMTIuLi4KZW50cnkgIjM0NC50 ZXN0IiBhdCBibG9jayAyIG9mZnNldCAxMzYgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVu Y2VzIG5vbi1leGlzdGVudCBpbm9kZSA0NTA2Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4g ZW50cnkgYXQgb2Zmc2V0IDEzNi4uLgplbnRyeSAiMzQ1LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0 IDE2MCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2Rl IDQ1MDcKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMTYwLi4u CmVudHJ5ICIzNDYudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMTg0IGluIGRpcmVjdG9yeSBpbm9k ZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNDUwOAoJd291bGQgY2xlYXIgaW5v ZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAxODQuLi4KZW50cnkgIjM0Ny50ZXN0IiBhdCBi bG9jayAyIG9mZnNldCAyMDggaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1l eGlzdGVudCBpbm9kZSA0NTA5Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQg b2Zmc2V0IDIwOC4uLgplbnRyeSAiMzQ4LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDIzMiBpbiBk aXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDQ1MTAKCXdv dWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMjMyLi4uCmVudHJ5ICIz NDkudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMjU2IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVm ZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNDUxMQoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVy IGluIGVudHJ5IGF0IG9mZnNldCAyNTYuLi4KZW50cnkgIjM1MC50ZXN0IiBhdCBibG9jayAyIG9m ZnNldCAyODAgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBp bm9kZSA0NTEyCgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDI4 MC4uLgplbnRyeSAiMzUxLnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDMwNCBpbiBkaXJlY3Rvcnkg aW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDQ1MTMKCXdvdWxkIGNsZWFy IGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMzA0Li4uCmVudHJ5ICIzNTIudGVzdCIg YXQgYmxvY2sgMiBvZmZzZXQgMzI4IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBu b24tZXhpc3RlbnQgaW5vZGUgNDUxNAoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5 IGF0IG9mZnNldCAzMjguLi4KZW50cnkgIjM1My50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAzNTIg aW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA0NTE1 Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDM1Mi4uLgplbnRy eSAiMzU0LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDM3NiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4 IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDQ1MTYKCXdvdWxkIGNsZWFyIGlub2RlIG51 bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMzc2Li4uCmVudHJ5ICIzNTUudGVzdCIgYXQgYmxvY2sg MiBvZmZzZXQgNDAwIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3Rl bnQgaW5vZGUgNDUxNwoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNl dCA0MDAuLi4KZW50cnkgIjM1Ni50ZXN0IiBhdCBibG9jayAyIG9mZnNldCA0MjQgaW4gZGlyZWN0 b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA0NTE4Cgl3b3VsZCBj bGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDQyNC4uLgplbnRyeSAiMzU3LnRl c3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDQ0OCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5j ZXMgbm9uLWV4aXN0ZW50IGlub2RlIDQ1MTkKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBl bnRyeSBhdCBvZmZzZXQgNDQ4Li4uCmVudHJ5ICIzNTgudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQg NDcyIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUg NDUyMAoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCA0NzIuLi4K ZW50cnkgIjM1OS50ZXN0IiBhdCBibG9jayAyIG9mZnNldCA0OTYgaW4gZGlyZWN0b3J5IGlub2Rl IDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA0NTIxCgl3b3VsZCBjbGVhciBpbm9k ZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDQ5Ni4uLgplbnRyeSAiMzYwLnRlc3QiIGF0IGJs b2NrIDIgb2Zmc2V0IDUyMCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4 aXN0ZW50IGlub2RlIDQ1MjIKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBv ZmZzZXQgNTIwLi4uCmVudHJ5ICIzNjEudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgNTQ0IGluIGRp cmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNDUyMwoJd291 bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCA1NDQuLi4KZW50cnkgIjM2 Mi50ZXN0IiBhdCBibG9jayAyIG9mZnNldCA1NjggaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZl cmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA0NTI0Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIg aW4gZW50cnkgYXQgb2Zmc2V0IDU2OC4uLgplbnRyeSAiMzYzLnRlc3QiIGF0IGJsb2NrIDIgb2Zm c2V0IDU5MiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlu b2RlIDQ1MjUKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgNTky Li4uCmVudHJ5ICIzNjQudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgNjE2IGluIGRpcmVjdG9yeSBp bm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNDUyNgoJd291bGQgY2xlYXIg aW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCA2MTYuLi4KZW50cnkgIjM2NS50ZXN0IiBh dCBibG9jayAyIG9mZnNldCA2NDAgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5v bi1leGlzdGVudCBpbm9kZSA0NTI3Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkg YXQgb2Zmc2V0IDY0MC4uLgplbnRyeSAiMzY2LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDY2NCBp biBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDQ1MjgK CXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgNjY0Li4uCmVudHJ5 ICIzNjcudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgNjg4IGluIGRpcmVjdG9yeSBpbm9kZSAxMjgg cmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNDUyOQoJd291bGQgY2xlYXIgaW5vZGUgbnVt YmVyIGluIGVudHJ5IGF0IG9mZnNldCA2ODguLi4KZW50cnkgIjM2OC50ZXN0IiBhdCBibG9jayAy IG9mZnNldCA3MTIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVu dCBpbm9kZSA0NTMwCgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0 IDcxMi4uLgplbnRyeSAiMzY5LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDczNiBpbiBkaXJlY3Rv cnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDQ1MzEKCXdvdWxkIGNs ZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgNzM2Li4uCmVudHJ5ICIzNzAudGVz dCIgYXQgYmxvY2sgMiBvZmZzZXQgNzYwIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNl cyBub24tZXhpc3RlbnQgaW5vZGUgNDUzMgoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVu dHJ5IGF0IG9mZnNldCA3NjAuLi4KZW50cnkgIjM3MS50ZXN0IiBhdCBibG9jayAyIG9mZnNldCA3 ODQgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA0 NTMzCgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDc4NC4uLgpl bnRyeSAiMzcyLnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDgwOCBpbiBkaXJlY3RvcnkgaW5vZGUg MTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDQ1MzQKCXdvdWxkIGNsZWFyIGlub2Rl IG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgODA4Li4uCmVudHJ5ICIzNzMudGVzdCIgYXQgYmxv Y2sgMiBvZmZzZXQgODMyIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhp c3RlbnQgaW5vZGUgNDUzNQoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9m ZnNldCA4MzIuLi4KZW50cnkgIjM3NC50ZXN0IiBhdCBibG9jayAyIG9mZnNldCA4NTYgaW4gZGly ZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA0NTM2Cgl3b3Vs ZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDg1Ni4uLgplbnRyeSAiMzc1 LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDg4MCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVy ZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDQ1MzcKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBp biBlbnRyeSBhdCBvZmZzZXQgODgwLi4uCmVudHJ5ICIzNzYudGVzdCIgYXQgYmxvY2sgMiBvZmZz ZXQgOTA0IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5v ZGUgNDUzOAoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCA5MDQu Li4KZW50cnkgIjM3Ny50ZXN0IiBhdCBibG9jayAyIG9mZnNldCA5MjggaW4gZGlyZWN0b3J5IGlu b2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA0NTM5Cgl3b3VsZCBjbGVhciBp bm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDkyOC4uLgplbnRyeSAiMzc4LnRlc3QiIGF0 IGJsb2NrIDIgb2Zmc2V0IDk1MiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9u LWV4aXN0ZW50IGlub2RlIDQ1NDAKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBh dCBvZmZzZXQgOTUyLi4uCmVudHJ5ICIzNzkudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgOTc2IGlu IGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNDU0MQoJ d291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCA5NzYuLi4KZW50cnkg IjM4MC50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAxMDAwIGluIGRpcmVjdG9yeSBpbm9kZSAxMjgg cmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNDU0MgoJd291bGQgY2xlYXIgaW5vZGUgbnVt YmVyIGluIGVudHJ5IGF0IG9mZnNldCAxMDAwLi4uCmVudHJ5ICIzODEudGVzdCIgYXQgYmxvY2sg MiBvZmZzZXQgMTAyNCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0 ZW50IGlub2RlIDQ1NDMKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZz ZXQgMTAyNC4uLgplbnRyeSAiMzgyLnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDEwNDggaW4gZGly ZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA1NjAwCgl3b3Vs ZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDEwNDguLi4KZW50cnkgIjM4 My50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAxMDcyIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVm ZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNTYwMQoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVy IGluIGVudHJ5IGF0IG9mZnNldCAxMDcyLi4uCmVudHJ5ICIzODQudGVzdCIgYXQgYmxvY2sgMiBv ZmZzZXQgMTA5NiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50 IGlub2RlIDU2MDIKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQg MTA5Ni4uLgplbnRyeSAiMzg1LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDExMjAgaW4gZGlyZWN0 b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA1NjAzCgl3b3VsZCBj bGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDExMjAuLi4KZW50cnkgIjM4Ni50 ZXN0IiBhdCBibG9jayAyIG9mZnNldCAxMTQ0IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJl bmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNTYwNAoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGlu IGVudHJ5IGF0IG9mZnNldCAxMTQ0Li4uCmVudHJ5ICIzODcudGVzdCIgYXQgYmxvY2sgMiBvZmZz ZXQgMTE2OCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlu b2RlIDU2MDUKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMTE2 OC4uLgplbnRyeSAiMzg4LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDExOTIgaW4gZGlyZWN0b3J5 IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA1NjA2Cgl3b3VsZCBjbGVh ciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDExOTIuLi4KZW50cnkgIjM4OS50ZXN0 IiBhdCBibG9jayAyIG9mZnNldCAxMjE2IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNl cyBub24tZXhpc3RlbnQgaW5vZGUgNTYwNwoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVu dHJ5IGF0IG9mZnNldCAxMjE2Li4uCmVudHJ5ICIzOTAudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQg MTI0MCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2Rl IDU2MDgKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMTI0MC4u LgplbnRyeSAiMzkxLnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDEyNjQgaW4gZGlyZWN0b3J5IGlu b2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA1NjA5Cgl3b3VsZCBjbGVhciBp bm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDEyNjQuLi4KZW50cnkgIjM5Mi50ZXN0IiBh dCBibG9jayAyIG9mZnNldCAxMjg4IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBu b24tZXhpc3RlbnQgaW5vZGUgNTYxMAoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5 IGF0IG9mZnNldCAxMjg4Li4uCmVudHJ5ICIzOTMudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMTMx MiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDU2 MTEKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMTMxMi4uLgpl bnRyeSAiMzk0LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDEzMzYgaW4gZGlyZWN0b3J5IGlub2Rl IDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA1NjEyCgl3b3VsZCBjbGVhciBpbm9k ZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDEzMzYuLi4KZW50cnkgIjM5NS50ZXN0IiBhdCBi bG9jayAyIG9mZnNldCAxMzYwIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24t ZXhpc3RlbnQgaW5vZGUgNTYxMwoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0 IG9mZnNldCAxMzYwLi4uCmVudHJ5ICIzOTYudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMTM4NCBp biBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDU2MTQK CXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMTM4NC4uLgplbnRy eSAiMzk3LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDE0MDggaW4gZGlyZWN0b3J5IGlub2RlIDEy OCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA1NjE1Cgl3b3VsZCBjbGVhciBpbm9kZSBu dW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDE0MDguLi4KZW50cnkgIjM5OC50ZXN0IiBhdCBibG9j ayAyIG9mZnNldCAxNDMyIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhp c3RlbnQgaW5vZGUgNTYxNgoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9m ZnNldCAxNDMyLi4uCmVudHJ5ICIzOTkudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMTQ1NiBpbiBk aXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDU2MTcKCXdv dWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMTQ1Ni4uLgplbnRyeSAi NDAwLnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDE0ODAgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBy ZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA1NjE4Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1i ZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDE0ODAuLi4KZW50cnkgIjQwMS50ZXN0IiBhdCBibG9jayAy IG9mZnNldCAxNTA0IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3Rl bnQgaW5vZGUgNTYxOQoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNl dCAxNTA0Li4uCmVudHJ5ICI0MDIudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMTUyOCBpbiBkaXJl Y3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDU2MjAKCXdvdWxk IGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMTUyOC4uLgplbnRyeSAiNDAz LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDE1NTIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZl cmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA1NjIxCgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIg aW4gZW50cnkgYXQgb2Zmc2V0IDE1NTIuLi4KZW50cnkgIjQwNC50ZXN0IiBhdCBibG9jayAyIG9m ZnNldCAxNTc2IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQg aW5vZGUgNTYyMgoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAx NTc2Li4uCmVudHJ5ICI0MDUudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMTYwMCBpbiBkaXJlY3Rv cnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDU2MjMKCXdvdWxkIGNs ZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMTYwMC4uLgplbnRyeSAiNDA2LnRl c3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDE2MjQgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVu Y2VzIG5vbi1leGlzdGVudCBpbm9kZSA1NjI0Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4g ZW50cnkgYXQgb2Zmc2V0IDE2MjQuLi4KZW50cnkgIjQwNy50ZXN0IiBhdCBibG9jayAyIG9mZnNl dCAxNjQ4IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5v ZGUgNTYyNQoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAxNjQ4 Li4uCmVudHJ5ICI0MDgudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMTY3MiBpbiBkaXJlY3Rvcnkg aW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDU2MjYKCXdvdWxkIGNsZWFy IGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMTY3Mi4uLgplbnRyeSAiNDA5LnRlc3Qi IGF0IGJsb2NrIDIgb2Zmc2V0IDE2OTYgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2Vz IG5vbi1leGlzdGVudCBpbm9kZSA1NjI3Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50 cnkgYXQgb2Zmc2V0IDE2OTYuLi4KZW50cnkgIjQxMC50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAx NzIwIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUg NTYyOAoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAxNzIwLi4u CmVudHJ5ICI0MTEudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMTc0NCBpbiBkaXJlY3RvcnkgaW5v ZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDU2MjkKCXdvdWxkIGNsZWFyIGlu b2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMTc0NC4uLgplbnRyeSAiNDEyLnRlc3QiIGF0 IGJsb2NrIDIgb2Zmc2V0IDE3NjggaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5v bi1leGlzdGVudCBpbm9kZSA1NjMwCgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkg YXQgb2Zmc2V0IDE3NjguLi4KZW50cnkgIjQxMy50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAxNzky IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNTYz MQoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAxNzkyLi4uCmVu dHJ5ICI0MTQudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMTgxNiBpbiBkaXJlY3RvcnkgaW5vZGUg MTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDU2MzIKCXdvdWxkIGNsZWFyIGlub2Rl IG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMTgxNi4uLgplbnRyeSAiNDE1LnRlc3QiIGF0IGJs b2NrIDIgb2Zmc2V0IDE4NDAgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1l eGlzdGVudCBpbm9kZSA1NjMzCgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQg b2Zmc2V0IDE4NDAuLi4KZW50cnkgIjQxNi50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAxODY0IGlu IGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNTYzNAoJ d291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAxODY0Li4uCmVudHJ5 ICI0MTcudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMTg4OCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4 IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDU2MzUKCXdvdWxkIGNsZWFyIGlub2RlIG51 bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMTg4OC4uLgplbnRyeSAiNDE4LnRlc3QiIGF0IGJsb2Nr IDIgb2Zmc2V0IDE5MTIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlz dGVudCBpbm9kZSA1NjM2Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zm c2V0IDE5MTIuLi4KZW50cnkgIjQxOS50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAxOTM2IGluIGRp cmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNTYzNwoJd291 bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAxOTM2Li4uCmVudHJ5ICI0 MjAudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMTk2MCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJl ZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDU2MzgKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJl ciBpbiBlbnRyeSBhdCBvZmZzZXQgMTk2MC4uLgplbnRyeSAiNDIxLnRlc3QiIGF0IGJsb2NrIDIg b2Zmc2V0IDE5ODQgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVu dCBpbm9kZSA1NjM5Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0 IDE5ODQuLi4KZW50cnkgIjQyMi50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAyMDA4IGluIGRpcmVj dG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNTY0MAoJd291bGQg Y2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAyMDA4Li4uCmVudHJ5ICI0MjMu dGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMjAzMiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVy ZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDU2NDEKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBp biBlbnRyeSBhdCBvZmZzZXQgMjAzMi4uLgplbnRyeSAiNDI0LnRlc3QiIGF0IGJsb2NrIDIgb2Zm c2V0IDIwNTYgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBp bm9kZSA1NjQyCgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDIw NTYuLi4KZW50cnkgIjQyNS50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAyMDgwIGluIGRpcmVjdG9y eSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNTY0MwoJd291bGQgY2xl YXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAyMDgwLi4uCmVudHJ5ICI0MjYudGVz dCIgYXQgYmxvY2sgMiBvZmZzZXQgMjEwNCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5j ZXMgbm9uLWV4aXN0ZW50IGlub2RlIDU2NDQKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBl bnRyeSBhdCBvZmZzZXQgMjEwNC4uLgplbnRyeSAiNDI3LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0 IDIxMjggaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9k ZSA1NjQ1Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDIxMjgu Li4KZW50cnkgIjQyOC50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAyMTUyIGluIGRpcmVjdG9yeSBp bm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNTY0NgoJd291bGQgY2xlYXIg aW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAyMTUyLi4uCmVudHJ5ICI0MjkudGVzdCIg YXQgYmxvY2sgMiBvZmZzZXQgMjE3NiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMg bm9uLWV4aXN0ZW50IGlub2RlIDU2NDcKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRy eSBhdCBvZmZzZXQgMjE3Ni4uLgplbnRyeSAiNDMwLnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDIy MDAgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA1 NjQ4Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDIyMDAuLi4K ZW50cnkgIjQzMS50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAyMjI0IGluIGRpcmVjdG9yeSBpbm9k ZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNTY0OQoJd291bGQgY2xlYXIgaW5v ZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAyMjI0Li4uCmVudHJ5ICI0MzIudGVzdCIgYXQg YmxvY2sgMiBvZmZzZXQgMjI0OCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9u LWV4aXN0ZW50IGlub2RlIDU2NTAKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBh dCBvZmZzZXQgMjI0OC4uLgplbnRyeSAiNDMzLnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDIyNzIg aW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA1NjUx Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDIyNzIuLi4KZW50 cnkgIjQzNC50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAyMjk2IGluIGRpcmVjdG9yeSBpbm9kZSAx MjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNTY1MgoJd291bGQgY2xlYXIgaW5vZGUg bnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAyMjk2Li4uCmVudHJ5ICI0MzUudGVzdCIgYXQgYmxv Y2sgMiBvZmZzZXQgMjMyMCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4 aXN0ZW50IGlub2RlIDU2NTMKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBv ZmZzZXQgMjMyMC4uLgplbnRyeSAiNDM2LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDIzNDQgaW4g ZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA1NjU0Cgl3 b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDIzNDQuLi4KZW50cnkg IjQzNy50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAyMzY4IGluIGRpcmVjdG9yeSBpbm9kZSAxMjgg cmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNTY1NQoJd291bGQgY2xlYXIgaW5vZGUgbnVt YmVyIGluIGVudHJ5IGF0IG9mZnNldCAyMzY4Li4uCmVudHJ5ICI0MzgudGVzdCIgYXQgYmxvY2sg MiBvZmZzZXQgMjM5MiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0 ZW50IGlub2RlIDU2NTYKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZz ZXQgMjM5Mi4uLgplbnRyeSAiNDM5LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDI0MTYgaW4gZGly ZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA1NjU3Cgl3b3Vs ZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDI0MTYuLi4KZW50cnkgIjQ0 MC50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAyNDQwIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVm ZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNTY1OAoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVy IGluIGVudHJ5IGF0IG9mZnNldCAyNDQwLi4uCmVudHJ5ICI0NDEudGVzdCIgYXQgYmxvY2sgMiBv ZmZzZXQgMjQ2NCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50 IGlub2RlIDU2NTkKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQg MjQ2NC4uLgplbnRyeSAiNDQyLnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDI0ODggaW4gZGlyZWN0 b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA1NjYwCgl3b3VsZCBj bGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDI0ODguLi4KZW50cnkgIjQ0My50 ZXN0IiBhdCBibG9jayAyIG9mZnNldCAyNTEyIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJl bmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNTY2MQoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGlu IGVudHJ5IGF0IG9mZnNldCAyNTEyLi4uCmVudHJ5ICI0NDQudGVzdCIgYXQgYmxvY2sgMiBvZmZz ZXQgMjUzNiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlu b2RlIDU2NjIKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMjUz Ni4uLgplbnRyeSAiNDQ1LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDI1NjAgaW4gZGlyZWN0b3J5 IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA1NjYzCgl3b3VsZCBjbGVh ciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDI1NjAuLi4KZW50cnkgIjQ0Ni50ZXN0 IiBhdCBibG9jayAyIG9mZnNldCAyNTg0IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNl cyBub24tZXhpc3RlbnQgaW5vZGUgNjY4OAoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVu dHJ5IGF0IG9mZnNldCAyNTg0Li4uCmVudHJ5ICI0NDcudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQg MjYwOCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2Rl IDY2ODkKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMjYwOC4u LgplbnRyeSAiNDQ4LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDI2MzIgaW4gZGlyZWN0b3J5IGlu b2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA2NjkwCgl3b3VsZCBjbGVhciBp bm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDI2MzIuLi4KZW50cnkgIjQ0OS50ZXN0IiBh dCBibG9jayAyIG9mZnNldCAyNjU2IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBu b24tZXhpc3RlbnQgaW5vZGUgNjY5MQoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5 IGF0IG9mZnNldCAyNjU2Li4uCmVudHJ5ICI0NTAudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMjY4 MCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDY2 OTIKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMjY4MC4uLgpl bnRyeSAiNDUxLnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDI3MDQgaW4gZGlyZWN0b3J5IGlub2Rl IDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA2NjkzCgl3b3VsZCBjbGVhciBpbm9k ZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDI3MDQuLi4KZW50cnkgIjQ1Mi50ZXN0IiBhdCBi bG9jayAyIG9mZnNldCAyNzI4IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24t ZXhpc3RlbnQgaW5vZGUgNjY5NAoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0 IG9mZnNldCAyNzI4Li4uCmVudHJ5ICI0NTMudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMjc1MiBp biBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDY2OTUK CXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMjc1Mi4uLgplbnRy eSAiNDU0LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDI3NzYgaW4gZGlyZWN0b3J5IGlub2RlIDEy OCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA2Njk2Cgl3b3VsZCBjbGVhciBpbm9kZSBu dW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDI3NzYuLi4KZW50cnkgIjQ1NS50ZXN0IiBhdCBibG9j ayAyIG9mZnNldCAyODAwIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhp c3RlbnQgaW5vZGUgNjY5NwoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9m ZnNldCAyODAwLi4uCmVudHJ5ICI0NTYudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMjgyNCBpbiBk aXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDY2OTgKCXdv dWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMjgyNC4uLgplbnRyeSAi NDU3LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDI4NDggaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBy ZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA2Njk5Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1i ZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDI4NDguLi4KZW50cnkgIjQ1OC50ZXN0IiBhdCBibG9jayAy IG9mZnNldCAyODcyIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3Rl bnQgaW5vZGUgNjcwMAoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNl dCAyODcyLi4uCmVudHJ5ICI0NTkudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMjg5NiBpbiBkaXJl Y3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDY3MDEKCXdvdWxk IGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMjg5Ni4uLgplbnRyeSAiNDYw LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDI5MjAgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZl cmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA2NzAyCgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIg aW4gZW50cnkgYXQgb2Zmc2V0IDI5MjAuLi4KZW50cnkgIjQ2MS50ZXN0IiBhdCBibG9jayAyIG9m ZnNldCAyOTQ0IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQg aW5vZGUgNjcwMwoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAy OTQ0Li4uCmVudHJ5ICI0NjIudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMjk2OCBpbiBkaXJlY3Rv cnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDY3MDQKCXdvdWxkIGNs ZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMjk2OC4uLgplbnRyeSAiNDYzLnRl c3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDI5OTIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVu Y2VzIG5vbi1leGlzdGVudCBpbm9kZSA2NzA1Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4g ZW50cnkgYXQgb2Zmc2V0IDI5OTIuLi4KZW50cnkgIjQ2NC50ZXN0IiBhdCBibG9jayAyIG9mZnNl dCAzMDE2IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5v ZGUgNjcwNgoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAzMDE2 Li4uCmVudHJ5ICI0NjUudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMzA0MCBpbiBkaXJlY3Rvcnkg aW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDY3MDcKCXdvdWxkIGNsZWFy IGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMzA0MC4uLgplbnRyeSAiNDY2LnRlc3Qi IGF0IGJsb2NrIDIgb2Zmc2V0IDMwNjQgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2Vz IG5vbi1leGlzdGVudCBpbm9kZSA2NzA4Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50 cnkgYXQgb2Zmc2V0IDMwNjQuLi4KZW50cnkgIjQ2Ny50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAz MDg4IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUg NjcwOQoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAzMDg4Li4u CmVudHJ5ICI0NjgudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMzExMiBpbiBkaXJlY3RvcnkgaW5v ZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDY3MTAKCXdvdWxkIGNsZWFyIGlu b2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMzExMi4uLgplbnRyeSAiNDY5LnRlc3QiIGF0 IGJsb2NrIDIgb2Zmc2V0IDMxMzYgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5v bi1leGlzdGVudCBpbm9kZSA2NzExCgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkg YXQgb2Zmc2V0IDMxMzYuLi4KZW50cnkgIjQ3MC50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAzMTYw IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNjcx MgoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAzMTYwLi4uCmVu dHJ5ICI0NzEudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMzE4NCBpbiBkaXJlY3RvcnkgaW5vZGUg MTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDY3MTMKCXdvdWxkIGNsZWFyIGlub2Rl IG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMzE4NC4uLgplbnRyeSAiNDcyLnRlc3QiIGF0IGJs b2NrIDIgb2Zmc2V0IDMyMDggaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1l eGlzdGVudCBpbm9kZSA2NzE0Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQg b2Zmc2V0IDMyMDguLi4KZW50cnkgIjQ3My50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAzMjMyIGlu IGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNjcxNQoJ d291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAzMjMyLi4uCmVudHJ5 ICI0NzQudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMzI1NiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4 IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDY3MTYKCXdvdWxkIGNsZWFyIGlub2RlIG51 bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMzI1Ni4uLgplbnRyeSAiNDc1LnRlc3QiIGF0IGJsb2Nr IDIgb2Zmc2V0IDMyODAgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlz dGVudCBpbm9kZSA2NzE3Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zm c2V0IDMyODAuLi4KZW50cnkgIjQ3Ni50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAzMzA0IGluIGRp cmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNjcxOAoJd291 bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAzMzA0Li4uCmVudHJ5ICI0 NzcudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMzMyOCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJl ZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDY3MTkKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJl ciBpbiBlbnRyeSBhdCBvZmZzZXQgMzMyOC4uLgplbnRyeSAiNDc4LnRlc3QiIGF0IGJsb2NrIDIg b2Zmc2V0IDMzNTIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVu dCBpbm9kZSA2NzIwCgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0 IDMzNTIuLi4KZW50cnkgIjQ3OS50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAzMzc2IGluIGRpcmVj dG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNjcyMQoJd291bGQg Y2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAzMzc2Li4uCmVudHJ5ICI0ODAu dGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgMzQwMCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVy ZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDY3MjIKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBp biBlbnRyeSBhdCBvZmZzZXQgMzQwMC4uLgplbnRyeSAiNDgxLnRlc3QiIGF0IGJsb2NrIDIgb2Zm c2V0IDM0MjQgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBp bm9kZSA2NzIzCgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDM0 MjQuLi4KZW50cnkgIjQ4Mi50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAzNDQ4IGluIGRpcmVjdG9y eSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNjcyNAoJd291bGQgY2xl YXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAzNDQ4Li4uCmVudHJ5ICI0ODMudGVz dCIgYXQgYmxvY2sgMiBvZmZzZXQgMzQ3MiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5j ZXMgbm9uLWV4aXN0ZW50IGlub2RlIDY3MjUKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBl bnRyeSBhdCBvZmZzZXQgMzQ3Mi4uLgplbnRyeSAiNDg0LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0 IDM0OTYgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9k ZSA2NzI2Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDM0OTYu Li4KZW50cnkgIjQ4NS50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAzNTIwIGluIGRpcmVjdG9yeSBp bm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNjcyNwoJd291bGQgY2xlYXIg aW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAzNTIwLi4uCmVudHJ5ICI0ODYudGVzdCIg YXQgYmxvY2sgMiBvZmZzZXQgMzU0NCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMg bm9uLWV4aXN0ZW50IGlub2RlIDY3MjgKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRy eSBhdCBvZmZzZXQgMzU0NC4uLgplbnRyeSAiNDg3LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDM1 NjggaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA2 NzI5Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDM1NjguLi4K ZW50cnkgIjQ4OC50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAzNTkyIGluIGRpcmVjdG9yeSBpbm9k ZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNjczMAoJd291bGQgY2xlYXIgaW5v ZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAzNTkyLi4uCmVudHJ5ICI0ODkudGVzdCIgYXQg YmxvY2sgMiBvZmZzZXQgMzYxNiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9u LWV4aXN0ZW50IGlub2RlIDY3MzEKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBh dCBvZmZzZXQgMzYxNi4uLgplbnRyeSAiNDkwLnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDM2NDAg aW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA2NzMy Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDM2NDAuLi4KZW50 cnkgIjQ5MS50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAzNjY0IGluIGRpcmVjdG9yeSBpbm9kZSAx MjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNjczMwoJd291bGQgY2xlYXIgaW5vZGUg bnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAzNjY0Li4uCmVudHJ5ICI0OTIudGVzdCIgYXQgYmxv Y2sgMiBvZmZzZXQgMzY4OCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4 aXN0ZW50IGlub2RlIDY3MzQKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBv ZmZzZXQgMzY4OC4uLgplbnRyeSAiNDkzLnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDM3MTIgaW4g ZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA2NzM1Cgl3 b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDM3MTIuLi4KZW50cnkg IjQ5NC50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAzNzM2IGluIGRpcmVjdG9yeSBpbm9kZSAxMjgg cmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNjczNgoJd291bGQgY2xlYXIgaW5vZGUgbnVt YmVyIGluIGVudHJ5IGF0IG9mZnNldCAzNzM2Li4uCmVudHJ5ICI0OTUudGVzdCIgYXQgYmxvY2sg MiBvZmZzZXQgMzc2MCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0 ZW50IGlub2RlIDY3MzcKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZz ZXQgMzc2MC4uLgplbnRyeSAiNDk2LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDM3ODQgaW4gZGly ZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA2NzM4Cgl3b3Vs ZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDM3ODQuLi4KZW50cnkgIjQ5 Ny50ZXN0IiBhdCBibG9jayAyIG9mZnNldCAzODA4IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVm ZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNjczOQoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVy IGluIGVudHJ5IGF0IG9mZnNldCAzODA4Li4uCmVudHJ5ICI0OTgudGVzdCIgYXQgYmxvY2sgMiBv ZmZzZXQgMzgzMiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50 IGlub2RlIDY3NDAKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQg MzgzMi4uLgplbnRyeSAiNDk5LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDM4NTYgaW4gZGlyZWN0 b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA2NzQxCgl3b3VsZCBj bGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDM4NTYuLi4KZW50cnkgIjUwMC50 ZXN0IiBhdCBibG9jayAyIG9mZnNldCAzODgwIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJl bmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNjc0MgoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGlu IGVudHJ5IGF0IG9mZnNldCAzODgwLi4uCmVudHJ5ICI1MDEudGVzdCIgYXQgYmxvY2sgMiBvZmZz ZXQgMzkwNCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlu b2RlIDY3NDMKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMzkw NC4uLgplbnRyeSAiNTAyLnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDM5MjggaW4gZGlyZWN0b3J5 IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA2NzQ0Cgl3b3VsZCBjbGVh ciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDM5MjguLi4KZW50cnkgIjUwMy50ZXN0 IiBhdCBibG9jayAyIG9mZnNldCAzOTUyIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNl cyBub24tZXhpc3RlbnQgaW5vZGUgNjc0NQoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVu dHJ5IGF0IG9mZnNldCAzOTUyLi4uCmVudHJ5ICI1MDQudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQg Mzk3NiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2Rl IDY3NDYKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMzk3Ni4u LgplbnRyeSAiNTA1LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDQwMDAgaW4gZGlyZWN0b3J5IGlu b2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA2NzQ3Cgl3b3VsZCBjbGVhciBp bm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDQwMDAuLi4KZW50cnkgIjUwNi50ZXN0IiBh dCBibG9jayAyIG9mZnNldCA0MDI0IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBu b24tZXhpc3RlbnQgaW5vZGUgNjc0OAoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5 IGF0IG9mZnNldCA0MDI0Li4uCmVudHJ5ICI1MDcudGVzdCIgYXQgYmxvY2sgMiBvZmZzZXQgNDA0 OCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDY3 NDkKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgNDA0OC4uLgpl bnRyeSAiNTA4LnRlc3QiIGF0IGJsb2NrIDIgb2Zmc2V0IDQwNzIgaW4gZGlyZWN0b3J5IGlub2Rl IDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA2NzUwCgl3b3VsZCBjbGVhciBpbm9k ZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDQwNzIuLi4KZW50cnkgIjUwOS50ZXN0IiBhdCBi bG9jayAzIG9mZnNldCAxNiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4 aXN0ZW50IGlub2RlIDY3NTEKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBv ZmZzZXQgMTYuLi4KZW50cnkgIjUxMC50ZXN0IiBhdCBibG9jayAzIG9mZnNldCA0MCBpbiBkaXJl Y3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDc4NDAKCXdvdWxk IGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgNDAuLi4KZW50cnkgIjUxMS50 ZXN0IiBhdCBibG9jayAzIG9mZnNldCA2NCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5j ZXMgbm9uLWV4aXN0ZW50IGlub2RlIDc4NDEKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBl bnRyeSBhdCBvZmZzZXQgNjQuLi4KZW50cnkgIjUxMi50ZXN0IiBhdCBibG9jayAzIG9mZnNldCA4 OCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDc4 NDIKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgODguLi4KZW50 cnkgIjUxMy50ZXN0IiBhdCBibG9jayAzIG9mZnNldCAxMTIgaW4gZGlyZWN0b3J5IGlub2RlIDEy OCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA3ODQzCgl3b3VsZCBjbGVhciBpbm9kZSBu dW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDExMi4uLgplbnRyeSAiNTE0LnRlc3QiIGF0IGJsb2Nr IDMgb2Zmc2V0IDEzNiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0 ZW50IGlub2RlIDc4NDQKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZz ZXQgMTM2Li4uCmVudHJ5ICI1MTUudGVzdCIgYXQgYmxvY2sgMyBvZmZzZXQgMTYwIGluIGRpcmVj dG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNzg0NQoJd291bGQg Y2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAxNjAuLi4KZW50cnkgIjUxNi50 ZXN0IiBhdCBibG9jayAzIG9mZnNldCAxODQgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVu Y2VzIG5vbi1leGlzdGVudCBpbm9kZSA3ODQ2Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4g ZW50cnkgYXQgb2Zmc2V0IDE4NC4uLgplbnRyeSAiNTE3LnRlc3QiIGF0IGJsb2NrIDMgb2Zmc2V0 IDIwOCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2Rl IDc4NDcKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMjA4Li4u CmVudHJ5ICI1MTgudGVzdCIgYXQgYmxvY2sgMyBvZmZzZXQgMjMyIGluIGRpcmVjdG9yeSBpbm9k ZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNzg0OAoJd291bGQgY2xlYXIgaW5v ZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAyMzIuLi4KZW50cnkgIjUxOS50ZXN0IiBhdCBi bG9jayAzIG9mZnNldCAyNTYgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1l eGlzdGVudCBpbm9kZSA3ODQ5Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQg b2Zmc2V0IDI1Ni4uLgplbnRyeSAiNTIwLnRlc3QiIGF0IGJsb2NrIDMgb2Zmc2V0IDI4MCBpbiBk aXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDc4NTAKCXdv dWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMjgwLi4uCmVudHJ5ICI1 MjEudGVzdCIgYXQgYmxvY2sgMyBvZmZzZXQgMzA0IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVm ZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNzg1MQoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVy IGluIGVudHJ5IGF0IG9mZnNldCAzMDQuLi4KZW50cnkgIjUyMi50ZXN0IiBhdCBibG9jayAzIG9m ZnNldCAzMjggaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBp bm9kZSA3ODUyCgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDMy OC4uLgplbnRyeSAiNTIzLnRlc3QiIGF0IGJsb2NrIDMgb2Zmc2V0IDM1MiBpbiBkaXJlY3Rvcnkg aW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDc4NTMKCXdvdWxkIGNsZWFy IGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMzUyLi4uCmVudHJ5ICI1MjQudGVzdCIg YXQgYmxvY2sgMyBvZmZzZXQgMzc2IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBu b24tZXhpc3RlbnQgaW5vZGUgNzg1NAoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5 IGF0IG9mZnNldCAzNzYuLi4KZW50cnkgIjUyNS50ZXN0IiBhdCBibG9jayAzIG9mZnNldCA0MDAg aW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA3ODU1 Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDQwMC4uLgplbnRy eSAiNTI2LnRlc3QiIGF0IGJsb2NrIDMgb2Zmc2V0IDQyNCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4 IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDc4NTYKCXdvdWxkIGNsZWFyIGlub2RlIG51 bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgNDI0Li4uCmVudHJ5ICI1MjcudGVzdCIgYXQgYmxvY2sg MyBvZmZzZXQgNDQ4IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3Rl bnQgaW5vZGUgNzg1NwoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNl dCA0NDguLi4KZW50cnkgIjUyOC50ZXN0IiBhdCBibG9jayAzIG9mZnNldCA0NzIgaW4gZGlyZWN0 b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA3ODU4Cgl3b3VsZCBj bGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDQ3Mi4uLgplbnRyeSAiNTI5LnRl c3QiIGF0IGJsb2NrIDMgb2Zmc2V0IDQ5NiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5j ZXMgbm9uLWV4aXN0ZW50IGlub2RlIDc4NTkKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBl bnRyeSBhdCBvZmZzZXQgNDk2Li4uCmVudHJ5ICI1MzAudGVzdCIgYXQgYmxvY2sgMyBvZmZzZXQg NTIwIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUg Nzg2MAoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCA1MjAuLi4K ZW50cnkgIjUzMS50ZXN0IiBhdCBibG9jayAzIG9mZnNldCA1NDQgaW4gZGlyZWN0b3J5IGlub2Rl IDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA3ODYxCgl3b3VsZCBjbGVhciBpbm9k ZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDU0NC4uLgplbnRyeSAiNTMyLnRlc3QiIGF0IGJs b2NrIDMgb2Zmc2V0IDU2OCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4 aXN0ZW50IGlub2RlIDc4NjIKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBv ZmZzZXQgNTY4Li4uCmVudHJ5ICI1MzMudGVzdCIgYXQgYmxvY2sgMyBvZmZzZXQgNTkyIGluIGRp cmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNzg2MwoJd291 bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCA1OTIuLi4KZW50cnkgIjUz NC50ZXN0IiBhdCBibG9jayAzIG9mZnNldCA2MTYgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZl cmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA3ODY0Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIg aW4gZW50cnkgYXQgb2Zmc2V0IDYxNi4uLgplbnRyeSAiNTM1LnRlc3QiIGF0IGJsb2NrIDMgb2Zm c2V0IDY0MCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlu b2RlIDc4NjUKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgNjQw Li4uCmVudHJ5ICI1MzYudGVzdCIgYXQgYmxvY2sgMyBvZmZzZXQgNjY0IGluIGRpcmVjdG9yeSBp bm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNzg2NgoJd291bGQgY2xlYXIg aW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCA2NjQuLi4KZW50cnkgIjUzNy50ZXN0IiBh dCBibG9jayAzIG9mZnNldCA2ODggaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5v bi1leGlzdGVudCBpbm9kZSA3ODY3Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkg YXQgb2Zmc2V0IDY4OC4uLgplbnRyeSAiNTM4LnRlc3QiIGF0IGJsb2NrIDMgb2Zmc2V0IDcxMiBp biBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDc4NjgK CXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgNzEyLi4uCmVudHJ5 ICI1MzkudGVzdCIgYXQgYmxvY2sgMyBvZmZzZXQgNzM2IGluIGRpcmVjdG9yeSBpbm9kZSAxMjgg cmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNzg2OQoJd291bGQgY2xlYXIgaW5vZGUgbnVt YmVyIGluIGVudHJ5IGF0IG9mZnNldCA3MzYuLi4KZW50cnkgIjU0MC50ZXN0IiBhdCBibG9jayAz IG9mZnNldCA3NjAgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVu dCBpbm9kZSA3ODcwCgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0 IDc2MC4uLgplbnRyeSAiNTQxLnRlc3QiIGF0IGJsb2NrIDMgb2Zmc2V0IDc4NCBpbiBkaXJlY3Rv cnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDc4NzEKCXdvdWxkIGNs ZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgNzg0Li4uCmVudHJ5ICI1NDIudGVz dCIgYXQgYmxvY2sgMyBvZmZzZXQgODA4IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNl cyBub24tZXhpc3RlbnQgaW5vZGUgNzg3MgoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVu dHJ5IGF0IG9mZnNldCA4MDguLi4KZW50cnkgIjU0My50ZXN0IiBhdCBibG9jayAzIG9mZnNldCA4 MzIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA3 ODczCgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDgzMi4uLgpl bnRyeSAiNTQ0LnRlc3QiIGF0IGJsb2NrIDMgb2Zmc2V0IDg1NiBpbiBkaXJlY3RvcnkgaW5vZGUg MTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDc4NzQKCXdvdWxkIGNsZWFyIGlub2Rl IG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgODU2Li4uCmVudHJ5ICI1NDUudGVzdCIgYXQgYmxv Y2sgMyBvZmZzZXQgODgwIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhp c3RlbnQgaW5vZGUgNzg3NQoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9m ZnNldCA4ODAuLi4KZW50cnkgIjU0Ni50ZXN0IiBhdCBibG9jayAzIG9mZnNldCA5MDQgaW4gZGly ZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA3ODc2Cgl3b3Vs ZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDkwNC4uLgplbnRyeSAiNTQ3 LnRlc3QiIGF0IGJsb2NrIDMgb2Zmc2V0IDkyOCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVy ZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDc4NzcKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBp biBlbnRyeSBhdCBvZmZzZXQgOTI4Li4uCmVudHJ5ICI1NDgudGVzdCIgYXQgYmxvY2sgMyBvZmZz ZXQgOTUyIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5v ZGUgNzg3OAoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCA5NTIu Li4KZW50cnkgIjU0OS50ZXN0IiBhdCBibG9jayAzIG9mZnNldCA5NzYgaW4gZGlyZWN0b3J5IGlu b2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA3ODc5Cgl3b3VsZCBjbGVhciBp bm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDk3Ni4uLgplbnRyeSAiNTUwLnRlc3QiIGF0 IGJsb2NrIDMgb2Zmc2V0IDEwMDAgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5v bi1leGlzdGVudCBpbm9kZSA3ODgwCgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkg YXQgb2Zmc2V0IDEwMDAuLi4KZW50cnkgIjU1MS50ZXN0IiBhdCBibG9jayAzIG9mZnNldCAxMDI0 IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNzg4 MQoJd291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAxMDI0Li4uCmVu dHJ5ICI1NTIudGVzdCIgYXQgYmxvY2sgMyBvZmZzZXQgMTA0OCBpbiBkaXJlY3RvcnkgaW5vZGUg MTI4IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDc4ODIKCXdvdWxkIGNsZWFyIGlub2Rl IG51bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMTA0OC4uLgplbnRyeSAiNTUzLnRlc3QiIGF0IGJs b2NrIDMgb2Zmc2V0IDEwNzIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1l eGlzdGVudCBpbm9kZSA3ODgzCgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQg b2Zmc2V0IDEwNzIuLi4KZW50cnkgIjU1NC50ZXN0IiBhdCBibG9jayAzIG9mZnNldCAxMDk2IGlu IGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNzg4NAoJ d291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAxMDk2Li4uCmVudHJ5 ICI1NTUudGVzdCIgYXQgYmxvY2sgMyBvZmZzZXQgMTEyMCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4 IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDc4ODUKCXdvdWxkIGNsZWFyIGlub2RlIG51 bWJlciBpbiBlbnRyeSBhdCBvZmZzZXQgMTEyMC4uLgplbnRyeSAiNTU2LnRlc3QiIGF0IGJsb2Nr IDMgb2Zmc2V0IDExNDQgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlz dGVudCBpbm9kZSA3ODg2Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zm c2V0IDExNDQuLi4KZW50cnkgIjU1Ny50ZXN0IiBhdCBibG9jayAzIG9mZnNldCAxMTY4IGluIGRp cmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNzg4NwoJd291 bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAxMTY4Li4uCmVudHJ5ICI1 NTgudGVzdCIgYXQgYmxvY2sgMyBvZmZzZXQgMTE5MiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJl ZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDc4ODgKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJl ciBpbiBlbnRyeSBhdCBvZmZzZXQgMTE5Mi4uLgplbnRyeSAiNTU5LnRlc3QiIGF0IGJsb2NrIDMg b2Zmc2V0IDEyMTYgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVu dCBpbm9kZSA3ODg5Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0 IDEyMTYuLi4KZW50cnkgIjU2MC50ZXN0IiBhdCBibG9jayAzIG9mZnNldCAxMjQwIGluIGRpcmVj dG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNzg5MAoJd291bGQg Y2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAxMjQwLi4uCmVudHJ5ICI1NjEu dGVzdCIgYXQgYmxvY2sgMyBvZmZzZXQgMTI2NCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVy ZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDc4OTEKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBp biBlbnRyeSBhdCBvZmZzZXQgMTI2NC4uLgplbnRyeSAiNTYyLnRlc3QiIGF0IGJsb2NrIDMgb2Zm c2V0IDEyODggaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBp bm9kZSA3ODkyCgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDEy ODguLi4KZW50cnkgIjU2My50ZXN0IiBhdCBibG9jayAzIG9mZnNldCAxMzEyIGluIGRpcmVjdG9y eSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNzg5MwoJd291bGQgY2xl YXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAxMzEyLi4uCmVudHJ5ICI1NjQudGVz dCIgYXQgYmxvY2sgMyBvZmZzZXQgMTMzNiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5j ZXMgbm9uLWV4aXN0ZW50IGlub2RlIDc4OTQKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBl bnRyeSBhdCBvZmZzZXQgMTMzNi4uLgplbnRyeSAiNTY1LnRlc3QiIGF0IGJsb2NrIDMgb2Zmc2V0 IDEzNjAgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9k ZSA3ODk1Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDEzNjAu Li4KZW50cnkgIjU2Ni50ZXN0IiBhdCBibG9jayAzIG9mZnNldCAxMzg0IGluIGRpcmVjdG9yeSBp bm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNzg5NgoJd291bGQgY2xlYXIg aW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAxMzg0Li4uCmVudHJ5ICI1NjcudGVzdCIg YXQgYmxvY2sgMyBvZmZzZXQgMTQwOCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMg bm9uLWV4aXN0ZW50IGlub2RlIDc4OTcKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRy eSBhdCBvZmZzZXQgMTQwOC4uLgplbnRyeSAiNTY4LnRlc3QiIGF0IGJsb2NrIDMgb2Zmc2V0IDE0 MzIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA3 ODk4Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDE0MzIuLi4K ZW50cnkgIjU2OS50ZXN0IiBhdCBibG9jayAzIG9mZnNldCAxNDU2IGluIGRpcmVjdG9yeSBpbm9k ZSAxMjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNzg5OQoJd291bGQgY2xlYXIgaW5v ZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAxNDU2Li4uCmVudHJ5ICI1NzAudGVzdCIgYXQg YmxvY2sgMyBvZmZzZXQgMTQ4MCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9u LWV4aXN0ZW50IGlub2RlIDc5MDAKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBh dCBvZmZzZXQgMTQ4MC4uLgplbnRyeSAiNTcxLnRlc3QiIGF0IGJsb2NrIDMgb2Zmc2V0IDE1MDQg aW4gZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSA3OTAx Cgl3b3VsZCBjbGVhciBpbm9kZSBudW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDE1MDQuLi4KZW50 cnkgIjU3Mi50ZXN0IiBhdCBibG9jayAzIG9mZnNldCAxNTI4IGluIGRpcmVjdG9yeSBpbm9kZSAx MjggcmVmZXJlbmNlcyBub24tZXhpc3RlbnQgaW5vZGUgNzkwMgoJd291bGQgY2xlYXIgaW5vZGUg bnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAxNTI4Li4uCmVudHJ5ICI1NzMudGVzdCIgYXQgYmxv Y2sgMyBvZmZzZXQgMTU1MiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHJlZmVyZW5jZXMgbm9uLWV4 aXN0ZW50IGlub2RlIDc5MDMKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBv ZmZzZXQgMTU1Mi4uLgplbnRyeSAiNTc0LnRlc3QiIGF0IGJsb2NrIDMgb2Zmc2V0IDE1NzYgaW4g ZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSAxMDAxNgoJ d291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAxNTc2Li4uCmVudHJ5 ICI1NzUudGVzdCIgYXQgYmxvY2sgMyBvZmZzZXQgMTYwMCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4 IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDEwMDE3Cgl3b3VsZCBjbGVhciBpbm9kZSBu dW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDE2MDAuLi4KZW50cnkgIjU3Ni50ZXN0IiBhdCBibG9j ayAzIG9mZnNldCAxNjI0IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhp c3RlbnQgaW5vZGUgMTAwMTgKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBv ZmZzZXQgMTYyNC4uLgplbnRyeSAiNTc3LnRlc3QiIGF0IGJsb2NrIDMgb2Zmc2V0IDE2NDggaW4g ZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSAxMDAxOQoJ d291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAxNjQ4Li4uCmVudHJ5 ICI1NzgudGVzdCIgYXQgYmxvY2sgMyBvZmZzZXQgMTY3MiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4 IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDEwMDIwCgl3b3VsZCBjbGVhciBpbm9kZSBu dW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDE2NzIuLi4KZW50cnkgIjU3OS50ZXN0IiBhdCBibG9j ayAzIG9mZnNldCAxNjk2IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhp c3RlbnQgaW5vZGUgMTAwMjEKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBv ZmZzZXQgMTY5Ni4uLgplbnRyeSAiNTgwLnRlc3QiIGF0IGJsb2NrIDMgb2Zmc2V0IDE3MjAgaW4g ZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSAxMDAyMgoJ d291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAxNzIwLi4uCmVudHJ5 ICI1ODEudGVzdCIgYXQgYmxvY2sgMyBvZmZzZXQgMTc0NCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4 IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDEwMDIzCgl3b3VsZCBjbGVhciBpbm9kZSBu dW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDE3NDQuLi4KZW50cnkgIjU4Mi50ZXN0IiBhdCBibG9j ayAzIG9mZnNldCAxNzY4IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhp c3RlbnQgaW5vZGUgMTAwMjQKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBv ZmZzZXQgMTc2OC4uLgplbnRyeSAiNTgzLnRlc3QiIGF0IGJsb2NrIDMgb2Zmc2V0IDE3OTIgaW4g ZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSAxMDAyNQoJ d291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAxNzkyLi4uCmVudHJ5 ICI1ODQudGVzdCIgYXQgYmxvY2sgMyBvZmZzZXQgMTgxNiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4 IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDEwMDI2Cgl3b3VsZCBjbGVhciBpbm9kZSBu dW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDE4MTYuLi4KZW50cnkgIjU4NS50ZXN0IiBhdCBibG9j ayAzIG9mZnNldCAxODQwIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhp c3RlbnQgaW5vZGUgMTAwMjcKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBv ZmZzZXQgMTg0MC4uLgplbnRyeSAiNTg2LnRlc3QiIGF0IGJsb2NrIDMgb2Zmc2V0IDE4NjQgaW4g ZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSAxMDAyOAoJ d291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAxODY0Li4uCmVudHJ5 ICI1ODcudGVzdCIgYXQgYmxvY2sgMyBvZmZzZXQgMTg4OCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4 IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDEwMDI5Cgl3b3VsZCBjbGVhciBpbm9kZSBu dW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDE4ODguLi4KZW50cnkgIjU4OC50ZXN0IiBhdCBibG9j ayAzIG9mZnNldCAxOTEyIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhp c3RlbnQgaW5vZGUgMTAwMzAKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBv ZmZzZXQgMTkxMi4uLgplbnRyeSAiNTg5LnRlc3QiIGF0IGJsb2NrIDMgb2Zmc2V0IDE5MzYgaW4g ZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSAxMDAzMQoJ d291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAxOTM2Li4uCmVudHJ5 ICI1OTAudGVzdCIgYXQgYmxvY2sgMyBvZmZzZXQgMTk2MCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4 IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDEwMDMyCgl3b3VsZCBjbGVhciBpbm9kZSBu dW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDE5NjAuLi4KZW50cnkgIjU5MS50ZXN0IiBhdCBibG9j ayAzIG9mZnNldCAxOTg0IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhp c3RlbnQgaW5vZGUgMTAwMzMKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBv ZmZzZXQgMTk4NC4uLgplbnRyeSAiNTkyLnRlc3QiIGF0IGJsb2NrIDMgb2Zmc2V0IDIwMDggaW4g ZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSAxMDAzNAoJ d291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAyMDA4Li4uCmVudHJ5 ICI1OTMudGVzdCIgYXQgYmxvY2sgMyBvZmZzZXQgMjAzMiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4 IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDEwMDM1Cgl3b3VsZCBjbGVhciBpbm9kZSBu dW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDIwMzIuLi4KZW50cnkgIjU5NC50ZXN0IiBhdCBibG9j ayAzIG9mZnNldCAyMDU2IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhp c3RlbnQgaW5vZGUgMTAwMzYKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBv ZmZzZXQgMjA1Ni4uLgplbnRyeSAiNTk1LnRlc3QiIGF0IGJsb2NrIDMgb2Zmc2V0IDIwODAgaW4g ZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSAxMDAzNwoJ d291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAyMDgwLi4uCmVudHJ5 ICI1OTYudGVzdCIgYXQgYmxvY2sgMyBvZmZzZXQgMjEwNCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4 IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDEwMDM4Cgl3b3VsZCBjbGVhciBpbm9kZSBu dW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDIxMDQuLi4KZW50cnkgIjU5Ny50ZXN0IiBhdCBibG9j ayAzIG9mZnNldCAyMTI4IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhp c3RlbnQgaW5vZGUgMTAwMzkKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBv ZmZzZXQgMjEyOC4uLgplbnRyeSAiNTk4LnRlc3QiIGF0IGJsb2NrIDMgb2Zmc2V0IDIxNTIgaW4g ZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSAxMDA0MAoJ d291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAyMTUyLi4uCmVudHJ5 ICI1OTkudGVzdCIgYXQgYmxvY2sgMyBvZmZzZXQgMjE3NiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4 IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDEwMDQxCgl3b3VsZCBjbGVhciBpbm9kZSBu dW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDIxNzYuLi4KZW50cnkgIjYwMC50ZXN0IiBhdCBibG9j ayAzIG9mZnNldCAyMjAwIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhp c3RlbnQgaW5vZGUgMTAwNDIKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBv ZmZzZXQgMjIwMC4uLgplbnRyeSAiNjAxLnRlc3QiIGF0IGJsb2NrIDMgb2Zmc2V0IDIyMjQgaW4g ZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSAxMDA0MwoJ d291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAyMjI0Li4uCmVudHJ5 ICI2MDIudGVzdCIgYXQgYmxvY2sgMyBvZmZzZXQgMjI0OCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4 IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDEwMDQ0Cgl3b3VsZCBjbGVhciBpbm9kZSBu dW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDIyNDguLi4KZW50cnkgIjYwMy50ZXN0IiBhdCBibG9j ayAzIG9mZnNldCAyMjcyIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhp c3RlbnQgaW5vZGUgMTAwNDUKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBv ZmZzZXQgMjI3Mi4uLgplbnRyeSAiNjA0LnRlc3QiIGF0IGJsb2NrIDMgb2Zmc2V0IDIyOTYgaW4g ZGlyZWN0b3J5IGlub2RlIDEyOCByZWZlcmVuY2VzIG5vbi1leGlzdGVudCBpbm9kZSAxMDA0NgoJ d291bGQgY2xlYXIgaW5vZGUgbnVtYmVyIGluIGVudHJ5IGF0IG9mZnNldCAyMjk2Li4uCmVudHJ5 ICI2MDUudGVzdCIgYXQgYmxvY2sgMyBvZmZzZXQgMjMyMCBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4 IHJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlub2RlIDEwMDQ3Cgl3b3VsZCBjbGVhciBpbm9kZSBu dW1iZXIgaW4gZW50cnkgYXQgb2Zmc2V0IDIzMjAuLi4KZW50cnkgIjYwNi50ZXN0IiBhdCBibG9j ayAzIG9mZnNldCAyMzQ0IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcmVmZXJlbmNlcyBub24tZXhp c3RlbnQgaW5vZGUgMTAwNDgKCXdvdWxkIGNsZWFyIGlub2RlIG51bWJlciBpbiBlbnRyeSBhdCBv ZmZzZXQgMjM0NC4uLgpiNTA1NWI5MDogQmFkbmVzcyBpbiBrZXkgbG9va3VwIChsZW5ndGgpCmJw PShibm8gNTA0MCwgbGVuIDQwOTYgYnl0ZXMpIGtleT0oYm5vIDUwNDAsIGxlbiA4MTkyIGJ5dGVz KQpObyBtb2RpZnkgZmxhZyBzZXQsIHNraXBwaW5nIHBoYXNlIDUKUGhhc2UgNiAtIGNoZWNrIGlu b2RlIGNvbm5lY3Rpdml0eS4uLgogICAgICAgIC0gdHJhdmVyc2luZyBmaWxlc3lzdGVtIC4uLgpl bnRyeSAiMzM5LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlz dGVudCBpbm9kZSA0NTAxLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICIzNDAudGVzdCIgaW4gZGly ZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDQ1MDIsIHdvdWxk IGp1bmsgZW50cnkKZW50cnkgIjM0MS50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50 cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNDUwMywgd291bGQganVuayBlbnRyeQplbnRyeSAiMzQy LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9k ZSA0NTA0LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICIzNDMudGVzdCIgaW4gZGlyZWN0b3J5IGlu b2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDQ1MDUsIHdvdWxkIGp1bmsgZW50 cnkKZW50cnkgIjM0NC50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24t ZXhpc3RlbnQgaW5vZGUgNDUwNiwgd291bGQganVuayBlbnRyeQplbnRyeSAiMzQ1LnRlc3QiIGlu IGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA0NTA3LCB3 b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICIzNDYudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBw b2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDQ1MDgsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkg IjM0Ny50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQg aW5vZGUgNDUwOSwgd291bGQganVuayBlbnRyeQplbnRyeSAiMzQ4LnRlc3QiIGluIGRpcmVjdG9y eSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA0NTEwLCB3b3VsZCBqdW5r IGVudHJ5CmVudHJ5ICIzNDkudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8g bm9uLWV4aXN0ZW50IGlub2RlIDQ1MTEsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjM1MC50ZXN0 IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNDUx Miwgd291bGQganVuayBlbnRyeQplbnRyeSAiMzUxLnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAx MjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA0NTEzLCB3b3VsZCBqdW5rIGVudHJ5CmVu dHJ5ICIzNTIudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0 ZW50IGlub2RlIDQ1MTQsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjM1My50ZXN0IiBpbiBkaXJl Y3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNDUxNSwgd291bGQg anVuayBlbnRyeQplbnRyeSAiMzU0LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRz IHRvIG5vbi1leGlzdGVudCBpbm9kZSA0NTE2LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICIzNTUu dGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2Rl IDQ1MTcsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjM1Ni50ZXN0IiBpbiBkaXJlY3RvcnkgaW5v ZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNDUxOCwgd291bGQganVuayBlbnRy eQplbnRyeSAiMzU3LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1l eGlzdGVudCBpbm9kZSA0NTE5LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICIzNTgudGVzdCIgaW4g ZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDQ1MjAsIHdv dWxkIGp1bmsgZW50cnkKZW50cnkgIjM1OS50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBv aW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNDUyMSwgd291bGQganVuayBlbnRyeQplbnRyeSAi MzYwLnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBp bm9kZSA0NTIyLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICIzNjEudGVzdCIgaW4gZGlyZWN0b3J5 IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDQ1MjMsIHdvdWxkIGp1bmsg ZW50cnkKZW50cnkgIjM2Mi50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBu b24tZXhpc3RlbnQgaW5vZGUgNDUyNCwgd291bGQganVuayBlbnRyeQplbnRyeSAiMzYzLnRlc3Qi IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA0NTI1 LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICIzNjQudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEy OCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDQ1MjYsIHdvdWxkIGp1bmsgZW50cnkKZW50 cnkgIjM2NS50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3Rl bnQgaW5vZGUgNDUyNywgd291bGQganVuayBlbnRyeQplbnRyeSAiMzY2LnRlc3QiIGluIGRpcmVj dG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA0NTI4LCB3b3VsZCBq dW5rIGVudHJ5CmVudHJ5ICIzNjcudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMg dG8gbm9uLWV4aXN0ZW50IGlub2RlIDQ1MjksIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjM2OC50 ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUg NDUzMCwgd291bGQganVuayBlbnRyeQplbnRyeSAiMzY5LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9k ZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA0NTMxLCB3b3VsZCBqdW5rIGVudHJ5 CmVudHJ5ICIzNzAudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4 aXN0ZW50IGlub2RlIDQ1MzIsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjM3MS50ZXN0IiBpbiBk aXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNDUzMywgd291 bGQganVuayBlbnRyeQplbnRyeSAiMzcyLnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9p bnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA0NTM0LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICIz NzMudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlu b2RlIDQ1MzUsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjM3NC50ZXN0IiBpbiBkaXJlY3Rvcnkg aW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNDUzNiwgd291bGQganVuayBl bnRyeQplbnRyeSAiMzc1LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5v bi1leGlzdGVudCBpbm9kZSA0NTM3LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICIzNzYudGVzdCIg aW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDQ1Mzgs IHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjM3Ny50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4 IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNDUzOSwgd291bGQganVuayBlbnRyeQplbnRy eSAiMzc4LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVu dCBpbm9kZSA0NTQwLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICIzNzkudGVzdCIgaW4gZGlyZWN0 b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDQ1NDEsIHdvdWxkIGp1 bmsgZW50cnkKZW50cnkgIjM4MC50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0 byBub24tZXhpc3RlbnQgaW5vZGUgNDU0Miwgd291bGQganVuayBlbnRyeQplbnRyeSAiMzgxLnRl c3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA0 NTQzLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICIzODIudGVzdCIgaW4gZGlyZWN0b3J5IGlub2Rl IDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDU2MDAsIHdvdWxkIGp1bmsgZW50cnkK ZW50cnkgIjM4My50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhp c3RlbnQgaW5vZGUgNTYwMSwgd291bGQganVuayBlbnRyeQplbnRyeSAiMzg0LnRlc3QiIGluIGRp cmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA1NjAyLCB3b3Vs ZCBqdW5rIGVudHJ5CmVudHJ5ICIzODUudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2lu dHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDU2MDMsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjM4 Ni50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5v ZGUgNTYwNCwgd291bGQganVuayBlbnRyeQplbnRyeSAiMzg3LnRlc3QiIGluIGRpcmVjdG9yeSBp bm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA1NjA1LCB3b3VsZCBqdW5rIGVu dHJ5CmVudHJ5ICIzODgudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9u LWV4aXN0ZW50IGlub2RlIDU2MDYsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjM4OS50ZXN0IiBp biBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNTYwNywg d291bGQganVuayBlbnRyeQplbnRyeSAiMzkwLnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjgg cG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA1NjA4LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5 ICIzOTEudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50 IGlub2RlIDU2MDksIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjM5Mi50ZXN0IiBpbiBkaXJlY3Rv cnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNTYxMCwgd291bGQganVu ayBlbnRyeQplbnRyeSAiMzkzLnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRv IG5vbi1leGlzdGVudCBpbm9kZSA1NjExLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICIzOTQudGVz dCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDU2 MTIsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjM5NS50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUg MTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNTYxMywgd291bGQganVuayBlbnRyeQpl bnRyeSAiMzk2LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlz dGVudCBpbm9kZSA1NjE0LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICIzOTcudGVzdCIgaW4gZGly ZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDU2MTUsIHdvdWxk IGp1bmsgZW50cnkKZW50cnkgIjM5OC50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50 cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNTYxNiwgd291bGQganVuayBlbnRyeQplbnRyeSAiMzk5 LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9k ZSA1NjE3LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI0MDAudGVzdCIgaW4gZGlyZWN0b3J5IGlu b2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDU2MTgsIHdvdWxkIGp1bmsgZW50 cnkKZW50cnkgIjQwMS50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24t ZXhpc3RlbnQgaW5vZGUgNTYxOSwgd291bGQganVuayBlbnRyeQplbnRyeSAiNDAyLnRlc3QiIGlu IGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA1NjIwLCB3 b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI0MDMudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBw b2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDU2MjEsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkg IjQwNC50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQg aW5vZGUgNTYyMiwgd291bGQganVuayBlbnRyeQplbnRyeSAiNDA1LnRlc3QiIGluIGRpcmVjdG9y eSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA1NjIzLCB3b3VsZCBqdW5r IGVudHJ5CmVudHJ5ICI0MDYudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8g bm9uLWV4aXN0ZW50IGlub2RlIDU2MjQsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjQwNy50ZXN0 IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNTYy NSwgd291bGQganVuayBlbnRyeQplbnRyeSAiNDA4LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAx MjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA1NjI2LCB3b3VsZCBqdW5rIGVudHJ5CmVu dHJ5ICI0MDkudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0 ZW50IGlub2RlIDU2MjcsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjQxMC50ZXN0IiBpbiBkaXJl Y3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNTYyOCwgd291bGQg anVuayBlbnRyeQplbnRyeSAiNDExLnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRz IHRvIG5vbi1leGlzdGVudCBpbm9kZSA1NjI5LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI0MTIu dGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2Rl IDU2MzAsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjQxMy50ZXN0IiBpbiBkaXJlY3RvcnkgaW5v ZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNTYzMSwgd291bGQganVuayBlbnRy eQplbnRyeSAiNDE0LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1l eGlzdGVudCBpbm9kZSA1NjMyLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI0MTUudGVzdCIgaW4g ZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDU2MzMsIHdv dWxkIGp1bmsgZW50cnkKZW50cnkgIjQxNi50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBv aW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNTYzNCwgd291bGQganVuayBlbnRyeQplbnRyeSAi NDE3LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBp bm9kZSA1NjM1LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI0MTgudGVzdCIgaW4gZGlyZWN0b3J5 IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDU2MzYsIHdvdWxkIGp1bmsg ZW50cnkKZW50cnkgIjQxOS50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBu b24tZXhpc3RlbnQgaW5vZGUgNTYzNywgd291bGQganVuayBlbnRyeQplbnRyeSAiNDIwLnRlc3Qi IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA1NjM4 LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI0MjEudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEy OCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDU2MzksIHdvdWxkIGp1bmsgZW50cnkKZW50 cnkgIjQyMi50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3Rl bnQgaW5vZGUgNTY0MCwgd291bGQganVuayBlbnRyeQplbnRyeSAiNDIzLnRlc3QiIGluIGRpcmVj dG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA1NjQxLCB3b3VsZCBq dW5rIGVudHJ5CmVudHJ5ICI0MjQudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMg dG8gbm9uLWV4aXN0ZW50IGlub2RlIDU2NDIsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjQyNS50 ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUg NTY0Mywgd291bGQganVuayBlbnRyeQplbnRyeSAiNDI2LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9k ZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA1NjQ0LCB3b3VsZCBqdW5rIGVudHJ5 CmVudHJ5ICI0MjcudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4 aXN0ZW50IGlub2RlIDU2NDUsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjQyOC50ZXN0IiBpbiBk aXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNTY0Niwgd291 bGQganVuayBlbnRyeQplbnRyeSAiNDI5LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9p bnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA1NjQ3LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI0 MzAudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlu b2RlIDU2NDgsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjQzMS50ZXN0IiBpbiBkaXJlY3Rvcnkg aW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNTY0OSwgd291bGQganVuayBl bnRyeQplbnRyeSAiNDMyLnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5v bi1leGlzdGVudCBpbm9kZSA1NjUwLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI0MzMudGVzdCIg aW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDU2NTEs IHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjQzNC50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4 IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNTY1Miwgd291bGQganVuayBlbnRyeQplbnRy eSAiNDM1LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVu dCBpbm9kZSA1NjUzLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI0MzYudGVzdCIgaW4gZGlyZWN0 b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDU2NTQsIHdvdWxkIGp1 bmsgZW50cnkKZW50cnkgIjQzNy50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0 byBub24tZXhpc3RlbnQgaW5vZGUgNTY1NSwgd291bGQganVuayBlbnRyeQplbnRyeSAiNDM4LnRl c3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA1 NjU2LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI0MzkudGVzdCIgaW4gZGlyZWN0b3J5IGlub2Rl IDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDU2NTcsIHdvdWxkIGp1bmsgZW50cnkK ZW50cnkgIjQ0MC50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhp c3RlbnQgaW5vZGUgNTY1OCwgd291bGQganVuayBlbnRyeQplbnRyeSAiNDQxLnRlc3QiIGluIGRp cmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA1NjU5LCB3b3Vs ZCBqdW5rIGVudHJ5CmVudHJ5ICI0NDIudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2lu dHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDU2NjAsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjQ0 My50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5v ZGUgNTY2MSwgd291bGQganVuayBlbnRyeQplbnRyeSAiNDQ0LnRlc3QiIGluIGRpcmVjdG9yeSBp bm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA1NjYyLCB3b3VsZCBqdW5rIGVu dHJ5CmVudHJ5ICI0NDUudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9u LWV4aXN0ZW50IGlub2RlIDU2NjMsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjQ0Ni50ZXN0IiBp biBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNjY4OCwg d291bGQganVuayBlbnRyeQplbnRyeSAiNDQ3LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjgg cG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA2Njg5LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5 ICI0NDgudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50 IGlub2RlIDY2OTAsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjQ0OS50ZXN0IiBpbiBkaXJlY3Rv cnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNjY5MSwgd291bGQganVu ayBlbnRyeQplbnRyeSAiNDUwLnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRv IG5vbi1leGlzdGVudCBpbm9kZSA2NjkyLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI0NTEudGVz dCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDY2 OTMsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjQ1Mi50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUg MTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNjY5NCwgd291bGQganVuayBlbnRyeQpl bnRyeSAiNDUzLnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlz dGVudCBpbm9kZSA2Njk1LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI0NTQudGVzdCIgaW4gZGly ZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDY2OTYsIHdvdWxk IGp1bmsgZW50cnkKZW50cnkgIjQ1NS50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50 cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNjY5Nywgd291bGQganVuayBlbnRyeQplbnRyeSAiNDU2 LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9k ZSA2Njk4LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI0NTcudGVzdCIgaW4gZGlyZWN0b3J5IGlu b2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDY2OTksIHdvdWxkIGp1bmsgZW50 cnkKZW50cnkgIjQ1OC50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24t ZXhpc3RlbnQgaW5vZGUgNjcwMCwgd291bGQganVuayBlbnRyeQplbnRyeSAiNDU5LnRlc3QiIGlu IGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA2NzAxLCB3 b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI0NjAudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBw b2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDY3MDIsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkg IjQ2MS50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQg aW5vZGUgNjcwMywgd291bGQganVuayBlbnRyeQplbnRyeSAiNDYyLnRlc3QiIGluIGRpcmVjdG9y eSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA2NzA0LCB3b3VsZCBqdW5r IGVudHJ5CmVudHJ5ICI0NjMudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8g bm9uLWV4aXN0ZW50IGlub2RlIDY3MDUsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjQ2NC50ZXN0 IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNjcw Niwgd291bGQganVuayBlbnRyeQplbnRyeSAiNDY1LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAx MjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA2NzA3LCB3b3VsZCBqdW5rIGVudHJ5CmVu dHJ5ICI0NjYudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0 ZW50IGlub2RlIDY3MDgsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjQ2Ny50ZXN0IiBpbiBkaXJl Y3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNjcwOSwgd291bGQg anVuayBlbnRyeQplbnRyeSAiNDY4LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRz IHRvIG5vbi1leGlzdGVudCBpbm9kZSA2NzEwLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI0Njku dGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2Rl IDY3MTEsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjQ3MC50ZXN0IiBpbiBkaXJlY3RvcnkgaW5v ZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNjcxMiwgd291bGQganVuayBlbnRy eQplbnRyeSAiNDcxLnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1l eGlzdGVudCBpbm9kZSA2NzEzLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI0NzIudGVzdCIgaW4g ZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDY3MTQsIHdv dWxkIGp1bmsgZW50cnkKZW50cnkgIjQ3My50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBv aW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNjcxNSwgd291bGQganVuayBlbnRyeQplbnRyeSAi NDc0LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBp bm9kZSA2NzE2LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI0NzUudGVzdCIgaW4gZGlyZWN0b3J5 IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDY3MTcsIHdvdWxkIGp1bmsg ZW50cnkKZW50cnkgIjQ3Ni50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBu b24tZXhpc3RlbnQgaW5vZGUgNjcxOCwgd291bGQganVuayBlbnRyeQplbnRyeSAiNDc3LnRlc3Qi IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA2NzE5 LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI0NzgudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEy OCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDY3MjAsIHdvdWxkIGp1bmsgZW50cnkKZW50 cnkgIjQ3OS50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3Rl bnQgaW5vZGUgNjcyMSwgd291bGQganVuayBlbnRyeQplbnRyeSAiNDgwLnRlc3QiIGluIGRpcmVj dG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA2NzIyLCB3b3VsZCBq dW5rIGVudHJ5CmVudHJ5ICI0ODEudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMg dG8gbm9uLWV4aXN0ZW50IGlub2RlIDY3MjMsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjQ4Mi50 ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUg NjcyNCwgd291bGQganVuayBlbnRyeQplbnRyeSAiNDgzLnRlc3QiIGluIGRpcmVjdG9yeSBpbm9k ZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA2NzI1LCB3b3VsZCBqdW5rIGVudHJ5 CmVudHJ5ICI0ODQudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4 aXN0ZW50IGlub2RlIDY3MjYsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjQ4NS50ZXN0IiBpbiBk aXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNjcyNywgd291 bGQganVuayBlbnRyeQplbnRyeSAiNDg2LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9p bnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA2NzI4LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI0 ODcudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlu b2RlIDY3MjksIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjQ4OC50ZXN0IiBpbiBkaXJlY3Rvcnkg aW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNjczMCwgd291bGQganVuayBl bnRyeQplbnRyeSAiNDg5LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5v bi1leGlzdGVudCBpbm9kZSA2NzMxLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI0OTAudGVzdCIg aW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDY3MzIs IHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjQ5MS50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4 IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNjczMywgd291bGQganVuayBlbnRyeQplbnRy eSAiNDkyLnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVu dCBpbm9kZSA2NzM0LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI0OTMudGVzdCIgaW4gZGlyZWN0 b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDY3MzUsIHdvdWxkIGp1 bmsgZW50cnkKZW50cnkgIjQ5NC50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0 byBub24tZXhpc3RlbnQgaW5vZGUgNjczNiwgd291bGQganVuayBlbnRyeQplbnRyeSAiNDk1LnRl c3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA2 NzM3LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI0OTYudGVzdCIgaW4gZGlyZWN0b3J5IGlub2Rl IDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDY3MzgsIHdvdWxkIGp1bmsgZW50cnkK ZW50cnkgIjQ5Ny50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhp c3RlbnQgaW5vZGUgNjczOSwgd291bGQganVuayBlbnRyeQplbnRyeSAiNDk4LnRlc3QiIGluIGRp cmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA2NzQwLCB3b3Vs ZCBqdW5rIGVudHJ5CmVudHJ5ICI0OTkudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2lu dHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDY3NDEsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjUw MC50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5v ZGUgNjc0Miwgd291bGQganVuayBlbnRyeQplbnRyeSAiNTAxLnRlc3QiIGluIGRpcmVjdG9yeSBp bm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA2NzQzLCB3b3VsZCBqdW5rIGVu dHJ5CmVudHJ5ICI1MDIudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9u LWV4aXN0ZW50IGlub2RlIDY3NDQsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjUwMy50ZXN0IiBp biBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNjc0NSwg d291bGQganVuayBlbnRyeQplbnRyeSAiNTA0LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjgg cG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA2NzQ2LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5 ICI1MDUudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50 IGlub2RlIDY3NDcsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjUwNi50ZXN0IiBpbiBkaXJlY3Rv cnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNjc0OCwgd291bGQganVu ayBlbnRyeQplbnRyeSAiNTA3LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRv IG5vbi1leGlzdGVudCBpbm9kZSA2NzQ5LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1MDgudGVz dCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDY3 NTAsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjUwOS50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUg MTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNjc1MSwgd291bGQganVuayBlbnRyeQpl bnRyeSAiNTEwLnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlz dGVudCBpbm9kZSA3ODQwLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1MTEudGVzdCIgaW4gZGly ZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDc4NDEsIHdvdWxk IGp1bmsgZW50cnkKZW50cnkgIjUxMi50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50 cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNzg0Miwgd291bGQganVuayBlbnRyeQplbnRyeSAiNTEz LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9k ZSA3ODQzLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1MTQudGVzdCIgaW4gZGlyZWN0b3J5IGlu b2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDc4NDQsIHdvdWxkIGp1bmsgZW50 cnkKZW50cnkgIjUxNS50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24t ZXhpc3RlbnQgaW5vZGUgNzg0NSwgd291bGQganVuayBlbnRyeQplbnRyeSAiNTE2LnRlc3QiIGlu IGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA3ODQ2LCB3 b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1MTcudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBw b2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDc4NDcsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkg IjUxOC50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQg aW5vZGUgNzg0OCwgd291bGQganVuayBlbnRyeQplbnRyeSAiNTE5LnRlc3QiIGluIGRpcmVjdG9y eSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA3ODQ5LCB3b3VsZCBqdW5r IGVudHJ5CmVudHJ5ICI1MjAudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8g bm9uLWV4aXN0ZW50IGlub2RlIDc4NTAsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjUyMS50ZXN0 IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNzg1 MSwgd291bGQganVuayBlbnRyeQplbnRyeSAiNTIyLnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAx MjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA3ODUyLCB3b3VsZCBqdW5rIGVudHJ5CmVu dHJ5ICI1MjMudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0 ZW50IGlub2RlIDc4NTMsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjUyNC50ZXN0IiBpbiBkaXJl Y3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNzg1NCwgd291bGQg anVuayBlbnRyeQplbnRyeSAiNTI1LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRz IHRvIG5vbi1leGlzdGVudCBpbm9kZSA3ODU1LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1MjYu dGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2Rl IDc4NTYsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjUyNy50ZXN0IiBpbiBkaXJlY3RvcnkgaW5v ZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNzg1Nywgd291bGQganVuayBlbnRy eQplbnRyeSAiNTI4LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1l eGlzdGVudCBpbm9kZSA3ODU4LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1MjkudGVzdCIgaW4g ZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDc4NTksIHdv dWxkIGp1bmsgZW50cnkKZW50cnkgIjUzMC50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBv aW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNzg2MCwgd291bGQganVuayBlbnRyeQplbnRyeSAi NTMxLnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBp bm9kZSA3ODYxLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1MzIudGVzdCIgaW4gZGlyZWN0b3J5 IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDc4NjIsIHdvdWxkIGp1bmsg ZW50cnkKZW50cnkgIjUzMy50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBu b24tZXhpc3RlbnQgaW5vZGUgNzg2Mywgd291bGQganVuayBlbnRyeQplbnRyeSAiNTM0LnRlc3Qi IGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA3ODY0 LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1MzUudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEy OCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDc4NjUsIHdvdWxkIGp1bmsgZW50cnkKZW50 cnkgIjUzNi50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3Rl bnQgaW5vZGUgNzg2Niwgd291bGQganVuayBlbnRyeQplbnRyeSAiNTM3LnRlc3QiIGluIGRpcmVj dG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA3ODY3LCB3b3VsZCBq dW5rIGVudHJ5CmVudHJ5ICI1MzgudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMg dG8gbm9uLWV4aXN0ZW50IGlub2RlIDc4NjgsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjUzOS50 ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUg Nzg2OSwgd291bGQganVuayBlbnRyeQplbnRyeSAiNTQwLnRlc3QiIGluIGRpcmVjdG9yeSBpbm9k ZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA3ODcwLCB3b3VsZCBqdW5rIGVudHJ5 CmVudHJ5ICI1NDEudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4 aXN0ZW50IGlub2RlIDc4NzEsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjU0Mi50ZXN0IiBpbiBk aXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNzg3Miwgd291 bGQganVuayBlbnRyeQplbnRyeSAiNTQzLnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9p bnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA3ODczLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1 NDQudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlu b2RlIDc4NzQsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjU0NS50ZXN0IiBpbiBkaXJlY3Rvcnkg aW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNzg3NSwgd291bGQganVuayBl bnRyeQplbnRyeSAiNTQ2LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5v bi1leGlzdGVudCBpbm9kZSA3ODc2LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1NDcudGVzdCIg aW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDc4Nzcs IHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjU0OC50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4 IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNzg3OCwgd291bGQganVuayBlbnRyeQplbnRy eSAiNTQ5LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVu dCBpbm9kZSA3ODc5LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1NTAudGVzdCIgaW4gZGlyZWN0 b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDc4ODAsIHdvdWxkIGp1 bmsgZW50cnkKZW50cnkgIjU1MS50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0 byBub24tZXhpc3RlbnQgaW5vZGUgNzg4MSwgd291bGQganVuayBlbnRyeQplbnRyeSAiNTUyLnRl c3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA3 ODgyLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1NTMudGVzdCIgaW4gZGlyZWN0b3J5IGlub2Rl IDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDc4ODMsIHdvdWxkIGp1bmsgZW50cnkK ZW50cnkgIjU1NC50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhp c3RlbnQgaW5vZGUgNzg4NCwgd291bGQganVuayBlbnRyeQplbnRyeSAiNTU1LnRlc3QiIGluIGRp cmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA3ODg1LCB3b3Vs ZCBqdW5rIGVudHJ5CmVudHJ5ICI1NTYudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2lu dHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDc4ODYsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjU1 Ny50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5v ZGUgNzg4Nywgd291bGQganVuayBlbnRyeQplbnRyeSAiNTU4LnRlc3QiIGluIGRpcmVjdG9yeSBp bm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA3ODg4LCB3b3VsZCBqdW5rIGVu dHJ5CmVudHJ5ICI1NTkudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9u LWV4aXN0ZW50IGlub2RlIDc4ODksIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjU2MC50ZXN0IiBp biBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNzg5MCwg d291bGQganVuayBlbnRyeQplbnRyeSAiNTYxLnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjgg cG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA3ODkxLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5 ICI1NjIudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50 IGlub2RlIDc4OTIsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjU2My50ZXN0IiBpbiBkaXJlY3Rv cnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNzg5Mywgd291bGQganVu ayBlbnRyeQplbnRyeSAiNTY0LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRv IG5vbi1leGlzdGVudCBpbm9kZSA3ODk0LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1NjUudGVz dCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDc4 OTUsIHdvdWxkIGp1bmsgZW50cnkKZW50cnkgIjU2Ni50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUg MTI4IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNzg5Niwgd291bGQganVuayBlbnRyeQpl bnRyeSAiNTY3LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlz dGVudCBpbm9kZSA3ODk3LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1NjgudGVzdCIgaW4gZGly ZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDc4OTgsIHdvdWxk IGp1bmsgZW50cnkKZW50cnkgIjU2OS50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50 cyB0byBub24tZXhpc3RlbnQgaW5vZGUgNzg5OSwgd291bGQganVuayBlbnRyeQplbnRyeSAiNTcw LnRlc3QiIGluIGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9k ZSA3OTAwLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1NzEudGVzdCIgaW4gZGlyZWN0b3J5IGlu b2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDc5MDEsIHdvdWxkIGp1bmsgZW50 cnkKZW50cnkgIjU3Mi50ZXN0IiBpbiBkaXJlY3RvcnkgaW5vZGUgMTI4IHBvaW50cyB0byBub24t ZXhpc3RlbnQgaW5vZGUgNzkwMiwgd291bGQganVuayBlbnRyeQplbnRyeSAiNTczLnRlc3QiIGlu IGRpcmVjdG9yeSBpbm9kZSAxMjggcG9pbnRzIHRvIG5vbi1leGlzdGVudCBpbm9kZSA3OTAzLCB3 b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1NzQudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBw b2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDEwMDE2LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5 ICI1NzUudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50 IGlub2RlIDEwMDE3LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1NzYudGVzdCIgaW4gZGlyZWN0 b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDEwMDE4LCB3b3VsZCBq dW5rIGVudHJ5CmVudHJ5ICI1NzcudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMg dG8gbm9uLWV4aXN0ZW50IGlub2RlIDEwMDE5LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1Nzgu dGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2Rl IDEwMDIwLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1NzkudGVzdCIgaW4gZGlyZWN0b3J5IGlu b2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDEwMDIxLCB3b3VsZCBqdW5rIGVu dHJ5CmVudHJ5ICI1ODAudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9u LWV4aXN0ZW50IGlub2RlIDEwMDIyLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1ODEudGVzdCIg aW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDEwMDIz LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1ODIudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEy OCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDEwMDI0LCB3b3VsZCBqdW5rIGVudHJ5CmVu dHJ5ICI1ODMudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0 ZW50IGlub2RlIDEwMDI1LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1ODQudGVzdCIgaW4gZGly ZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDEwMDI2LCB3b3Vs ZCBqdW5rIGVudHJ5CmVudHJ5ICI1ODUudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2lu dHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDEwMDI3LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1 ODYudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlu b2RlIDEwMDI4LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1ODcudGVzdCIgaW4gZGlyZWN0b3J5 IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDEwMDI5LCB3b3VsZCBqdW5r IGVudHJ5CmVudHJ5ICI1ODgudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8g bm9uLWV4aXN0ZW50IGlub2RlIDEwMDMwLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1ODkudGVz dCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDEw MDMxLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1OTAudGVzdCIgaW4gZGlyZWN0b3J5IGlub2Rl IDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDEwMDMyLCB3b3VsZCBqdW5rIGVudHJ5 CmVudHJ5ICI1OTEudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4 aXN0ZW50IGlub2RlIDEwMDMzLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1OTIudGVzdCIgaW4g ZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDEwMDM0LCB3 b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1OTMudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBw b2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDEwMDM1LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5 ICI1OTQudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50 IGlub2RlIDEwMDM2LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1OTUudGVzdCIgaW4gZGlyZWN0 b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDEwMDM3LCB3b3VsZCBq dW5rIGVudHJ5CmVudHJ5ICI1OTYudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMg dG8gbm9uLWV4aXN0ZW50IGlub2RlIDEwMDM4LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1OTcu dGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2Rl IDEwMDM5LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI1OTgudGVzdCIgaW4gZGlyZWN0b3J5IGlu b2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDEwMDQwLCB3b3VsZCBqdW5rIGVu dHJ5CmVudHJ5ICI1OTkudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9u LWV4aXN0ZW50IGlub2RlIDEwMDQxLCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI2MDAudGVzdCIg aW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDEwMDQy LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI2MDEudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEy OCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDEwMDQzLCB3b3VsZCBqdW5rIGVudHJ5CmVu dHJ5ICI2MDIudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0 ZW50IGlub2RlIDEwMDQ0LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI2MDMudGVzdCIgaW4gZGly ZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDEwMDQ1LCB3b3Vs ZCBqdW5rIGVudHJ5CmVudHJ5ICI2MDQudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2lu dHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDEwMDQ2LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI2 MDUudGVzdCIgaW4gZGlyZWN0b3J5IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlu b2RlIDEwMDQ3LCB3b3VsZCBqdW5rIGVudHJ5CmVudHJ5ICI2MDYudGVzdCIgaW4gZGlyZWN0b3J5 IGlub2RlIDEyOCBwb2ludHMgdG8gbm9uLWV4aXN0ZW50IGlub2RlIDEwMDQ4LCB3b3VsZCBqdW5r IGVudHJ5CnVua25vd24gbWFnaWMgbnVtYmVyIDB4ZDJmMSBmb3IgYmxvY2sgODM4ODYwOCBpbiBk aXJlY3RvcnkgaW5vZGUgMTI4CiAgICAgICAgLSB0cmF2ZXJzYWwgZmluaXNoZWQgLi4uCiAgICAg ICAgLSBtb3ZpbmcgZGlzY29ubmVjdGVkIGlub2RlcyB0byBsb3N0K2ZvdW5kIC4uLgpkaXNjb25u ZWN0ZWQgaW5vZGUgMjMxOSwgd291bGQgbW92ZSB0byBsb3N0K2ZvdW5kCmRpc2Nvbm5lY3RlZCBp bm9kZSAyMzIwLCB3b3VsZCBtb3ZlIHRvIGxvc3QrZm91bmQKZGlzY29ubmVjdGVkIGlub2RlIDIz MjEsIHdvdWxkIG1vdmUgdG8gbG9zdCtmb3VuZApkaXNjb25uZWN0ZWQgaW5vZGUgMjMyMiwgd291 bGQgbW92ZSB0byBsb3N0K2ZvdW5kCmRpc2Nvbm5lY3RlZCBpbm9kZSAyMzIzLCB3b3VsZCBtb3Zl IHRvIGxvc3QrZm91bmQKZGlzY29ubmVjdGVkIGlub2RlIDIzMjQsIHdvdWxkIG1vdmUgdG8gbG9z dCtmb3VuZApkaXNjb25uZWN0ZWQgaW5vZGUgMjMyNSwgd291bGQgbW92ZSB0byBsb3N0K2ZvdW5k CmRpc2Nvbm5lY3RlZCBpbm9kZSAyMzI2LCB3b3VsZCBtb3ZlIHRvIGxvc3QrZm91bmQKZGlzY29u bmVjdGVkIGlub2RlIDIzMjcsIHdvdWxkIG1vdmUgdG8gbG9zdCtmb3VuZApkaXNjb25uZWN0ZWQg aW5vZGUgMjMyOCwgd291bGQgbW92ZSB0byBsb3N0K2ZvdW5kCmRpc2Nvbm5lY3RlZCBpbm9kZSAy MzI5LCB3b3VsZCBtb3ZlIHRvIGxvc3QrZm91bmQKZGlzY29ubmVjdGVkIGlub2RlIDIzMzAsIHdv dWxkIG1vdmUgdG8gbG9zdCtmb3VuZApkaXNjb25uZWN0ZWQgaW5vZGUgMjMzMSwgd291bGQgbW92 ZSB0byBsb3N0K2ZvdW5kCmRpc2Nvbm5lY3RlZCBpbm9kZSAyMzMyLCB3b3VsZCBtb3ZlIHRvIGxv c3QrZm91bmQKZGlzY29ubmVjdGVkIGlub2RlIDIzMzMsIHdvdWxkIG1vdmUgdG8gbG9zdCtmb3Vu ZApkaXNjb25uZWN0ZWQgaW5vZGUgMjMzNCwgd291bGQgbW92ZSB0byBsb3N0K2ZvdW5kCmRpc2Nv bm5lY3RlZCBpbm9kZSAyMzM1LCB3b3VsZCBtb3ZlIHRvIGxvc3QrZm91bmQKZGlzY29ubmVjdGVk IGlub2RlIDIzMzYsIHdvdWxkIG1vdmUgdG8gbG9zdCtmb3VuZApkaXNjb25uZWN0ZWQgaW5vZGUg MjMzNywgd291bGQgbW92ZSB0byBsb3N0K2ZvdW5kCmRpc2Nvbm5lY3RlZCBpbm9kZSAyMzM4LCB3 b3VsZCBtb3ZlIHRvIGxvc3QrZm91bmQKZGlzY29ubmVjdGVkIGlub2RlIDIzMzksIHdvdWxkIG1v dmUgdG8gbG9zdCtmb3VuZApkaXNjb25uZWN0ZWQgaW5vZGUgMjM0MCwgd291bGQgbW92ZSB0byBs b3N0K2ZvdW5kCmRpc2Nvbm5lY3RlZCBpbm9kZSAyMzQxLCB3b3VsZCBtb3ZlIHRvIGxvc3QrZm91 bmQKZGlzY29ubmVjdGVkIGlub2RlIDIzNDIsIHdvdWxkIG1vdmUgdG8gbG9zdCtmb3VuZApkaXNj b25uZWN0ZWQgaW5vZGUgMjM0Mywgd291bGQgbW92ZSB0byBsb3N0K2ZvdW5kCmRpc2Nvbm5lY3Rl ZCBpbm9kZSAyMzQ0LCB3b3VsZCBtb3ZlIHRvIGxvc3QrZm91bmQKZGlzY29ubmVjdGVkIGlub2Rl IDIzNDUsIHdvdWxkIG1vdmUgdG8gbG9zdCtmb3VuZApkaXNjb25uZWN0ZWQgaW5vZGUgMjM0Niwg d291bGQgbW92ZSB0byBsb3N0K2ZvdW5kCmRpc2Nvbm5lY3RlZCBpbm9kZSAyMzQ3LCB3b3VsZCBt b3ZlIHRvIGxvc3QrZm91bmQKZGlzY29ubmVjdGVkIGlub2RlIDIzNDgsIHdvdWxkIG1vdmUgdG8g bG9zdCtmb3VuZApkaXNjb25uZWN0ZWQgaW5vZGUgMjM0OSwgd291bGQgbW92ZSB0byBsb3N0K2Zv dW5kCmRpc2Nvbm5lY3RlZCBpbm9kZSAyMzUwLCB3b3VsZCBtb3ZlIHRvIGxvc3QrZm91bmQKZGlz Y29ubmVjdGVkIGlub2RlIDIzNTEsIHdvdWxkIG1vdmUgdG8gbG9zdCtmb3VuZApkaXNjb25uZWN0 ZWQgaW5vZGUgMjM1Miwgd291bGQgbW92ZSB0byBsb3N0K2ZvdW5kCmRpc2Nvbm5lY3RlZCBpbm9k ZSAyMzUzLCB3b3VsZCBtb3ZlIHRvIGxvc3QrZm91bmQKZGlzY29ubmVjdGVkIGlub2RlIDIzNTQs IHdvdWxkIG1vdmUgdG8gbG9zdCtmb3VuZApkaXNjb25uZWN0ZWQgaW5vZGUgMjM1NSwgd291bGQg bW92ZSB0byBsb3N0K2ZvdW5kCmRpc2Nvbm5lY3RlZCBpbm9kZSAyMzU2LCB3b3VsZCBtb3ZlIHRv IGxvc3QrZm91bmQKZGlzY29ubmVjdGVkIGlub2RlIDIzNTcsIHdvdWxkIG1vdmUgdG8gbG9zdCtm b3VuZApkaXNjb25uZWN0ZWQgaW5vZGUgMjM1OCwgd291bGQgbW92ZSB0byBsb3N0K2ZvdW5kCmRp c2Nvbm5lY3RlZCBpbm9kZSAyMzU5LCB3b3VsZCBtb3ZlIHRvIGxvc3QrZm91bmQKZGlzY29ubmVj dGVkIGlub2RlIDIzNjAsIHdvdWxkIG1vdmUgdG8gbG9zdCtmb3VuZApkaXNjb25uZWN0ZWQgaW5v ZGUgMjM2MSwgd291bGQgbW92ZSB0byBsb3N0K2ZvdW5kCmRpc2Nvbm5lY3RlZCBpbm9kZSAyMzYy LCB3b3VsZCBtb3ZlIHRvIGxvc3QrZm91bmQKZGlzY29ubmVjdGVkIGlub2RlIDIzNjMsIHdvdWxk IG1vdmUgdG8gbG9zdCtmb3VuZApkaXNjb25uZWN0ZWQgaW5vZGUgMjM2NCwgd291bGQgbW92ZSB0 byBsb3N0K2ZvdW5kCmRpc2Nvbm5lY3RlZCBpbm9kZSAyMzY1LCB3b3VsZCBtb3ZlIHRvIGxvc3Qr Zm91bmQKZGlzY29ubmVjdGVkIGlub2RlIDIzNjYsIHdvdWxkIG1vdmUgdG8gbG9zdCtmb3VuZApk aXNjb25uZWN0ZWQgaW5vZGUgMjM2Nywgd291bGQgbW92ZSB0byBsb3N0K2ZvdW5kClBoYXNlIDcg LSB2ZXJpZnkgbGluayBjb3VudHMuLi4KTm8gbW9kaWZ5IGZsYWcgc2V0LCBza2lwcGluZyBmaWxl c3lzdGVtIGZsdXNoIGFuZCBleGl0aW5nLgo= --0016362842eae2a29f0497fa4d18-- From michael.monnerie@is.it-management.at Wed Dec 22 02:03:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBM836pu203351 for ; Wed, 22 Dec 2010 02:03:06 -0600 X-ASG-Debug-ID: 1293005099-104a03ab0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 308B7216381 for ; Wed, 22 Dec 2010 00:04:59 -0800 (PST) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id oF5lZBFcNO6s0AUa for ; Wed, 22 Dec 2010 00:04:59 -0800 (PST) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 38991400; Wed, 22 Dec 2010 09:04:58 +0100 (CET) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 3F8AB401C3E; Wed, 22 Dec 2010 09:04:57 +0100 (CET) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS hangs Subject: Re: XFS hangs Date: Wed, 22 Dec 2010 09:04:56 +0100 User-Agent: KMail/1.13.5 (Linux/2.6.37-rc6-zmi; KDE/4.4.4; x86_64; ; ) Cc: Dave Chinner , Amit Sahrawat , Eric Sandeen References: <20101222060254.GH4907@dastard> In-Reply-To: <20101222060254.GH4907@dastard> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart2388745.nWRAbCaOEZ"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201012220904.56914@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1293005100 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50151 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart2388745.nWRAbCaOEZ Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Mittwoch, 22. Dezember 2010 Dave Chinner wrote: > For future reference, when you are reporting a problem you need to > be specific about what you were doing to cause the problem you are > reporting. Describe your kernel, your storage, your test case, any > errors that occurred before the problem you are reporting, etc. >=20 > We need this information to make any sense of your bug report, but > I'm getting tired of having to ask for it every time you report a > problem. The more information you put in your bug report, the more > likely we are to be able to help you. We don't have unlimited > amounts of time (or patience) to drag all the basic details of your > problem out of you over 3 or 4 emails, so including it up front will > help a lot.... Should I update this section? http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_= reporting_a_problem.3F We should probably just send that link to people so you don't have to=20 write long texts all the time. Maybe above section should be updated to: Things to include are what version of XFS you are using and version of=20 the kernel. If you have problems with userland packages please report=20 the version of the package you are using. If the problem relates to a particular filesystem, the output from the=20 xfs_info(8) command and any mount(8) options in use will also be useful=20 to the developers. If you experience an oops, please run it through ksymoops so that it can=20 be interpreted. Also describe what you were doing, if you can repeat it,=20 and describe you kernel, storage, test case, if there was a hardware=20 problem before, etc. If you have a filesystem that cannot be repaired, make sure you have=20 xfsprogs 3.1.x or later and run xfs_metadump(8) to capture the metadata=20 (which obfuscates filenames and attributes to protect your privacy) and=20 make the dump available for someone to analyse.=20 =2D-=20 mit freundlichen Gr=FCssen, Michael Monnerie, Ing. BSc it-management Internet Services: Prot=E9ger http://proteger.at [gesprochen: Prot-e-schee] Tel: +43 660 / 415 6531 // ****** Radiointerview zum Thema Spam ****** // http://www.it-podcast.at/archiv.html#podcast-100716 //=20 // Haus zu verkaufen: http://zmi.at/langegg/ --nextPart2388745.nWRAbCaOEZ Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.15 (GNU/Linux) iEYEABECAAYFAk0RsSgACgkQzhSR9xwSCbSALQCfQnX6mVVFVcPWbPMsZRgj2mU0 0UwAn1EL03pnMs6KxzVr+z1ztu40xOXP =oz/Z -----END PGP SIGNATURE----- --nextPart2388745.nWRAbCaOEZ-- From amit.sahrawat83@gmail.com Wed Dec 22 03:10:09 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBM9A8qi210107 for ; Wed, 22 Dec 2010 03:10:08 -0600 X-ASG-Debug-ID: 1293009124-267a02960000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-qy0-f174.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E20161473F5D for ; Wed, 22 Dec 2010 01:12:04 -0800 (PST) Received: from mail-qy0-f174.google.com (mail-qy0-f174.google.com [209.85.216.174]) by cuda.sgi.com with ESMTP id YFb2HIzmuDXiZHrg for ; Wed, 22 Dec 2010 01:12:04 -0800 (PST) Received: by qyj19 with SMTP id 19so6138359qyj.5 for ; Wed, 22 Dec 2010 01:12:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:cc:content-type; bh=Kj7nKetBxY0yhm452aazhNtHKpRHX875ljclKd5s8CY=; b=nB0HDr/fhNj5DMLfIpBoWvhUW5JsQWFq2tfemCv1QuvqTbZak5Wmr4kx8IyLNfzNnw JWEkW7o6qmccoexXDpU9F4WAlCcm97d5iaKMQnhs3r4Z0pqafJNvbQt922UABe0qRpRX FaMEQ5vt1R/hrZRf6Bkpo4YdUIFi4E2m8ehyw= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; b=xZAS2Pod1D+ZjI7COgyvh1enmycJn75N8KCuUAIXtPqT193k1HogMMpwLqPlv7yndN 97xMlVTYTNE0g3gDTPqwhitj4FAeMd6keFT6L289rr81r4xWYXquRFP/iNJuDacErV9K I5VBQhmG4ky/uC1/pXRc8I7E5o4NJcjgKWI/I= MIME-Version: 1.0 Received: by 10.224.19.199 with SMTP id c7mr6213101qab.140.1293009123333; Wed, 22 Dec 2010 01:12:03 -0800 (PST) Received: by 10.220.96.65 with HTTP; Wed, 22 Dec 2010 01:12:03 -0800 (PST) In-Reply-To: <201012220904.56914@zmi.at> References: <20101222060254.GH4907@dastard> <201012220904.56914@zmi.at> Date: Wed, 22 Dec 2010 14:42:03 +0530 Message-ID: X-ASG-Orig-Subj: Re: XFS hangs Subject: Re: XFS hangs From: Amit Sahrawat To: Michael Monnerie Cc: xfs@oss.sgi.com, Dave Chinner , Eric Sandeen Content-Type: multipart/alternative; boundary=0015175cb07e7cd73e0497fc2586 X-Barracuda-Connect: mail-qy0-f174.google.com[209.85.216.174] X-Barracuda-Start-Time: 1293009124 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA085, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50156 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 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --0015175cb07e7cd73e0497fc2586 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Hi, There seems to be a problem in posting - I already apologized and provided complete details. I guess this was the first time, i missed on providing th= e test case. Please refer my earlier post on the same issue: Extremely sorry for inconvenience, will take care about posting complete details in future. Test Case : cp Complex directory structure(large no of files and directories) to my XFS formatted partition: cp -ar /LibExe /usb/sda2 Unplug the USB while the COPY is in progress. Storage: USB Flash, USB HDD (Both) Kernel: 2.6.34 Target: MIPS LOGS: usb 2-1: USB disconnect, address 7 Device sda2, XFS metadata write error block 0x0 in sda2 xfs_force_shutdown(sda2,0x1) called from line 1004 of file fs/xfs/linux-2.6/xfs_buf.c. Return address =3D 0x801cc294 Filesystem "sda2": I/O Error Detected. Shutting down filesystem: sda2 Please umount the filesystem, and rectify the problem(s) Plug in USB Port1 sd 7:0:0:0: [sdb] Attached SCSI disk Filesystem "sda2": xfs_log_force: error 5 returned. Filesystem "sda2": xfs_log_force: error 5 returned. Filesystem "sda2": xfs_log_force: error 5 returned. Filesystem "sda2": xfs_log_force: error 5 returned. - Show quoted text - INFO: task usb_mount:1858 blocked for more than 120 seconds. "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. usb_mount D [84a42440] 8032d62c 0 1858 1816 (user thread) Stack : 00000107 00000000 85e7be80 00030002 84a425c8 8032d62c 7fffffff 84a42440 00000002 8496e200 00000001 00000000 85e7bf00 85e7bef8 7fa2f2e0 8032d62c 00000001 801d69a8 85e7bd40 801d6b34 85e7bd4c 8032dc6c 00000000 801dbc80 85e7be80 864315a8 8662c980 00000001 00000742 00000000 00000000 84b85800 85e7bd90 801d6cc0 7fffffff 84a42440 00000002 8032ee74 00000081 804158a0 ... Call Trace: [<8032d574>] __schedule+0x618/0x6b8 from[<8032d62c>] schedule+0x18/0x3c [<8032d62c>] schedule+0x18/0x3c from[<8032dc6c>] schedule_timeout+0x2c/0x1c= 0 [<8032dc6c>] schedule_timeout+0x2c/0x1c0 from[<8032ee74>] __down+0x8c/0xdc [<8032ee74>] __down+0x8c/0xdc from[<8004500c>] down+0x40/0x88 [<8004500c>] down+0x40/0x88 from[<801ca838>] xfs_buf_lock+0xcc/0x15c [<801ca838>] xfs_buf_lock+0xcc/0x15c from[<801b71a0>] xfs_getsb+0x38/0x54 [<801b71a0>] xfs_getsb+0x38/0x54 from[<801d64a8>] xfs_sync_fsdata+0x7c/0x15= 4 [<801d64a8>] xfs_sync_fsdata+0x7c/0x154 from[<801d7284>] xfs_quiesce_data+0x34/0x60 [<801d7284>] xfs_quiesce_data+0x34/0x60 from[<801d3514>] xfs_fs_sync_fs+0x30/0xec [<801d3514>] xfs_fs_sync_fs+0x30/0xec from[<800ba09c>] __fsync_super+0xa4/0xc8 [<800ba09c>] __fsync_super+0xa4/0xc8 from[<800ba0d4>] fsync_super+0x14/0x28 [<800ba0d4>] fsync_super+0x14/0x28 from[<800ba4a0>] generic_shutdown_super+0x34/0x190 [<800ba4a0>] generic_shutdown_super+0x34/0x190 from[<800ba654>] kill_block_super+0x58/0x80 [<800ba654>] kill_block_super+0x58/0x80 from[<800bac6c>] deactivate_super+0x7c/0x110 [<800bac6c>] deactivate_super+0x7c/0x110 from[<800d2bbc>] sys_umount+0x310/0x358 [<800d2bbc>] sys_umount+0x310/0x358 from[<8000ff44>] stack_done+0x20/0x3c ---------------------------------------------------------------------------= ---------- Filesystem "sda2": xfs_log_force: error 5 returned. Please let me know in case more information is needed. Thanks & Regards, Amit Sahrawat On Wed, Dec 22, 2010 at 1:34 PM, Michael Monnerie < michael.monnerie@is.it-management.at> wrote: > On Mittwoch, 22. Dezember 2010 Dave Chinner wrote: > > For future reference, when you are reporting a problem you need to > > be specific about what you were doing to cause the problem you are > > reporting. Describe your kernel, your storage, your test case, any > > errors that occurred before the problem you are reporting, etc. > > > > We need this information to make any sense of your bug report, but > > I'm getting tired of having to ask for it every time you report a > > problem. The more information you put in your bug report, the more > > likely we are to be able to help you. We don't have unlimited > > amounts of time (or patience) to drag all the basic details of your > > problem out of you over 3 or 4 emails, so including it up front will > > help a lot.... > > Should I update this section? > > > http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_whe= n_reporting_a_problem.3F > > We should probably just send that link to people so you don't have to > write long texts all the time. > > Maybe above section should be updated to: > > Things to include are what version of XFS you are using and version of > the kernel. If you have problems with userland packages please report > the version of the package you are using. > > If the problem relates to a particular filesystem, the output from the > xfs_info(8) command and any mount(8) options in use will also be useful > to the developers. > > If you experience an oops, please run it through ksymoops so that it can > be interpreted. Also describe what you were doing, if you can repeat it, > and describe you kernel, storage, test case, if there was a hardware > problem before, etc. > > If you have a filesystem that cannot be repaired, make sure you have > xfsprogs 3.1.x or later and run xfs_metadump(8) to capture the metadata > (which obfuscates filenames and attributes to protect your privacy) and > make the dump available for someone to analyse. > > -- > mit freundlichen Gr=FCssen, > Michael Monnerie, Ing. BSc > > it-management Internet Services: Prot=E9ger > http://proteger.at [gesprochen: Prot-e-schee] > Tel: +43 660 / 415 6531 > > // ****** Radiointerview zum Thema Spam ****** > // http://www.it-podcast.at/archiv.html#podcast-100716 > // > // Haus zu verkaufen: http://zmi.at/langegg/ > --0015175cb07e7cd73e0497fc2586 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Hi,
=A0
There seems to be a problem in posting - I already apologized and prov= ided complete details. I guess this was the first time, i missed on providi= ng the test case.
=A0
Please refer my earlier post on the same issue:
=A0
=A0
Extremely sorry for inconvenience, will take care about posting comple= te details in future.
=A0
Test Case :
cp Complex directory struct= ure(large no of files and directories) to my XFS formatted partition:
cp -ar /LibExe /usb/sda2
Unplug the USB while the COPY is in progress.=A0
Storage: USB Flash, USB HDD (Both)
=A0
Kernel: 2.6.34
Tar= get: MIPS
LOGS:
usb 2-1: USB disconnect, address 7
Device sda2, XF= S metadata write error block 0x0 in sda2
xfs_force_shutdown(sda2,0x1) called from line 1004 of file fs/xfs/linux-2.6= /xfs_buf.c.=A0 Return address =3D 0x801cc294
Filesystem "sda2"= : I/O Error Detected.=A0 Shutting down filesystem: sda2
Please umount th= e filesystem, and rectify the problem(s)
=A0
Plug in USB Port1
sd 7:0:0:0: [sdb] Attached SCSI disk
Filesys= tem "sda2": xfs_log_force: error 5 returned.
Filesystem "= sda2": xfs_log_force: error 5 returned.
Filesystem "sda2"= : xfs_log_force: error 5 returned.
Filesystem "sda2": xfs_log_force: error 5 returned.
- Show quo= ted text -
INFO: task usb_mount:1858 blocked for more than 120 seconds.<= br>"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables= this message.
usb_mount=A0=A0=A0=A0=A0=A0=A0 D [84a42440] 8032d62c=A0=A0=A0=A0 0=A0 1858= =A0=A0 1816=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0 (user thread)
Stack : 00000107 00000000 85e7be80 0= 0030002 84a425c8 8032d62c 7fffffff 84a42440
=A0=A0=A0=A0=A0=A0=A0 000000= 02 8496e200 00000001 00000000 85e7bf00 85e7bef8 7fa2f2e0 8032d62c
=A0=A0=A0=A0=A0=A0=A0 00000001 801d69a8 85e7bd40 801d6b34 85e7bd4c 8032dc6c= 00000000 801dbc80
=A0=A0=A0=A0=A0=A0=A0 85e7be80 864315a8 8662c980 0000= 0001 00000742 00000000 00000000 84b85800
=A0=A0=A0=A0=A0=A0=A0 85e7bd90 = 801d6cc0 7fffffff 84a42440 00000002 8032ee74 00000081 804158a0
=A0=A0=A0=A0=A0=A0=A0 ...
Call Trace:
[<8032d574>] __schedule+0= x618/0x6b8 from[<8032d62c>] schedule+0x18/0x3c
[<8032d62c>] = schedule+0x18/0x3c from[<8032dc6c>] schedule_timeout+0x2c/0x1c0
[&= lt;8032dc6c>] schedule_timeout+0x2c/0x1c0 from[<8032ee74>] __down+= 0x8c/0xdc
[<8032ee74>] __down+0x8c/0xdc from[<8004500c>] down+0x40/0x88[<8004500c>] down+0x40/0x88 from[<801ca838>] xfs_buf_lock+0xc= c/0x15c
[<801ca838>] xfs_buf_lock+0xcc/0x15c from[<801b71a0>= ] xfs_getsb+0x38/0x54
[<801b71a0>] xfs_getsb+0x38/0x54 from[<801d64a8>] xfs_sync_fsda= ta+0x7c/0x154
[<801d64a8>] xfs_sync_fsdata+0x7c/0x154 from[<801= d7284>] xfs_quiesce_data+0x34/0x60
[<801d7284>] xfs_quiesce_dat= a+0x34/0x60 from[<801d3514>] xfs_fs_sync_fs+0x30/0xec
[<801d3514>] xfs_fs_sync_fs+0x30/0xec from[<800ba09c>] __fsync_= super+0xa4/0xc8
[<800ba09c>] __fsync_super+0xa4/0xc8 from[<800b= a0d4>] fsync_super+0x14/0x28
[<800ba0d4>] fsync_super+0x14/0x28= from[<800ba4a0>] generic_shutdown_super+0x34/0x190
[<800ba4a0>] generic_shutdown_super+0x34/0x190 from[<800ba654>]= kill_block_super+0x58/0x80
[<800ba654>] kill_block_super+0x58/0x8= 0 from[<800bac6c>] deactivate_super+0x7c/0x110
[<800bac6c>] = deactivate_super+0x7c/0x110 from[<800d2bbc>] sys_umount+0x310/0x358 [<800d2bbc>] sys_umount+0x310/0x358 from[<8000ff44>] stack_done= +0x20/0x3c
-------------------------------------------------------------= ------------------------
Filesystem "sda2": xfs_log_force: err= or 5 returned.
Please let me know in case more information is needed.
=A0
Thank= s & Regards,
Amit Sahrawat

On Wed, Dec 22, 2010 at 1:34 PM, Michael Monneri= e <michael.monnerie@is.it-management.at> wrote:
On Mittwoch, 22. Dezember 2010 Dave Chinner wrote:
>= ; For future reference, when you are reporting a problem you need to
>= ; be specific about what you were doing to cause the problem you are
> reporting. =A0Describe your kernel, your storage, your test case, any<= br>> errors that occurred before the problem you are reporting, etc.
= >
> We need this information to make any sense of your bug report,= but
> I'm getting tired of having to ask for it every time you report a<= br>> problem. The more information you put in your bug report, the more<= br>> likely we are to be able to help you. We don't have unlimited > amounts of time (or patience) to drag all the basic details of your> problem out of you over 3 or 4 emails, so including it up front will<= br>> help a lot....

Should I update this section?

http://xfs.org/index.p= hp/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F=

We should probably just send that link to people so you don't have = to
write long texts all the time.

Maybe above section should be u= pdated to:

Things to include are what version of XFS you are using a= nd version of
the kernel. If you have problems with userland packages please report
th= e version of the package you are using.

If the problem relates to a = particular filesystem, the output from the
xfs_info(8) command and any m= ount(8) options in use will also be useful
to the developers.

If you experience an oops, please run it through = ksymoops so that it can
be interpreted. Also describe what you were doin= g, if you can repeat it,
and describe you kernel, storage, test case, if= there was a hardware
problem before, etc.

If you have a filesystem that cannot be repaire= d, make sure you have
xfsprogs 3.1.x or later and run xfs_metadump(8) to= capture the metadata
(which obfuscates filenames and attributes to prot= ect your privacy) and
make the dump available for someone to analyse.

--
mit freundlich= en Gr=FCssen,
Michael Monnerie, Ing. BSc

it-management Internet S= ervices: Prot=E9ger
ht= tp://proteger.at [gesprochen: Prot-e-schee]
Tel: +43 660 / 415 6531

// ****** Radiointerview zum Thema Spam ****= **
// http://www.it-podcast.at/archiv.html#podcast-100716
//
// Haus zu verkaufen: http://zmi.at/langegg/

--0015175cb07e7cd73e0497fc2586-- From SRS0+8jG0+25+fromorbit.com=david@internode.on.net Wed Dec 22 03:48:40 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBM9mesR211881 for ; Wed, 22 Dec 2010 03:48:40 -0600 X-ASG-Debug-ID: 1293011435-608403090000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9544D1CEA7E4 for ; Wed, 22 Dec 2010 01:50:36 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id qUWvinAKlcHWWi87 for ; Wed, 22 Dec 2010 01:50:36 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50224996-1927428 for multiple; Wed, 22 Dec 2010 20:20:26 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PVLKy-0003Oh-37; Wed, 22 Dec 2010 20:50:24 +1100 Date: Wed, 22 Dec 2010 20:50:24 +1100 From: Dave Chinner To: Michael Monnerie Cc: xfs@oss.sgi.com, Amit Sahrawat , Eric Sandeen X-ASG-Orig-Subj: Re: XFS hangs Subject: Re: XFS hangs Message-ID: <20101222095024.GI4907@dastard> References: <20101222060254.GH4907@dastard> <201012220904.56914@zmi.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201012220904.56914@zmi.at> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1293011437 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50159 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 22, 2010 at 09:04:56AM +0100, Michael Monnerie wrote: > On Mittwoch, 22. Dezember 2010 Dave Chinner wrote: > > For future reference, when you are reporting a problem you need to > > be specific about what you were doing to cause the problem you are > > reporting. Describe your kernel, your storage, your test case, any > > errors that occurred before the problem you are reporting, etc. > > > > We need this information to make any sense of your bug report, but > > I'm getting tired of having to ask for it every time you report a > > problem. The more information you put in your bug report, the more > > likely we are to be able to help you. We don't have unlimited > > amounts of time (or patience) to drag all the basic details of your > > problem out of you over 3 or 4 emails, so including it up front will > > help a lot.... > > Should I update this section? > > http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F > > We should probably just send that link to people so you don't have to > write long texts all the time. Yup, I was looking at that earlier today and I agree that it needs an update. I'll update it to include everything that is generally needed in the next few days. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Wed Dec 22 10:06:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBMG6RMQ250232 for ; Wed, 22 Dec 2010 10:06:28 -0600 X-ASG-Debug-ID: 1293034102-78b900610000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 801231CEC039 for ; Wed, 22 Dec 2010 08:08:22 -0800 (PST) Received: from mail.sandeen.net (64-131-28-21.usfamily.net [64.131.28.21]) by cuda.sgi.com with ESMTP id bc5SaTYBHZSBmbHh for ; Wed, 22 Dec 2010 08:08:22 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 20C0048406EC; Wed, 22 Dec 2010 10:08:22 -0600 (CST) Message-ID: <4D122275.2000808@sandeen.net> Date: Wed, 22 Dec 2010 10:08:21 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: Amit Sahrawat CC: Michael Monnerie , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS hangs Subject: Re: XFS hangs References: <20101222060254.GH4907@dastard> <201012220904.56914@zmi.at> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: 64-131-28-21.usfamily.net[64.131.28.21] X-Barracuda-Start-Time: 1293034103 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.82 X-Barracuda-Spam-Status: No, SCORE=-1.82 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA085, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50183 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 12/22/10 3:12 AM, Amit Sahrawat wrote: > Hi, > > There seems to be a problem in posting - I already apologized and > provided complete details. I guess this was the first time, i missed > on providing the test case. the xfs mailing list sometimes eats or delays email :( > Please refer my earlier post on the same issue: > > > Extremely sorry for inconvenience, will take care about posting > complete details in future. > > Test Case : cp Complex directory structure(large no of files and > directories) to my XFS formatted partition: cp -ar /LibExe /usb/sda2 > Unplug the USB while the COPY is in progress. Success here will depend to some degree on how well your storage behaves. For starters, do you see any messages about barriers at mount time? > Storage: USB Flash, USB HDD (Both) > > Kernel: 2.6.34 Target: MIPS LOGS: So you unplug the USB storage: > usb 2-1: USB disconnect, address 7 > Device sda2, XFS metadata write error block 0x0 in sda2 > xfs_force_shutdown(sda2,0x1) called from line 1004 of file > fs/xfs/linux-2.6/xfs_buf.c. Return address = 0x801cc294 Filesystem > "sda2": I/O Error Detected. Shutting down filesystem: sda2 Please > umount the filesystem, and rectify the problem(s) this much looks normal for a storage device that disappears. And now you plug it back in: > Plug in USB Port1 sd 7:0:0:0: [sdb] Attached SCSI disk Filesystem > "sda2": xfs_log_force: error 5 returned. Filesystem "sda2": > xfs_log_force: error 5 returned. Filesystem "sda2": xfs_log_force: > error 5 returned. Filesystem "sda2": xfs_log_force: error 5 EIO. > returned. - Show quoted text - INFO: task usb_mount:1858 blocked for > more than 120 seconds. "echo 0 > > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Might be interesting to know exactly what "usb_mount" does? Fixing the stack trace so I can read it ... > usb_mount D [84a42440] 8032d62c 0 1858 1816 > (user thread) Stack : 00000107 00000000 85e7be80 00030002 84a425c8 > 8032d62c 7fffffff 84a42440 00000002 8496e200 00000001 00000000 > 85e7bf00 85e7bef8 7fa2f2e0 8032d62c 00000001 801d69a8 85e7bd40 > 801d6b34 85e7bd4c 8032dc6c 00000000 801dbc80 85e7be80 864315a8 > 8662c980 00000001 00000742 00000000 00000000 84b85800 85e7bd90 > 801d6cc0 7fffffff 84a42440 00000002 8032ee74 00000081 804158a0 ... > Call Trace: > [<8032d574>] __schedule+0x618/0x6b8 from[<8032d62c>] schedule+0x18/0x3c > [<8032d62c>] schedule+0x18/0x3c from[<8032dc6c>] schedule_timeout+0x2c/0x1c0 > [<8032dc6c>] schedule_timeout+0x2c/0x1c0 from[<8032ee74>] __down+0x8c/0xdc > [<8032ee74>] __down+0x8c/0xdc from[<8004500c>] down+0x40/0x88 > [<8004500c>] down+0x40/0x88 from[<801ca838>] xfs_buf_lock+0xcc/0x15c > [<801ca838>] xfs_buf_lock+0xcc/0x15c from[<801b71a0>] xfs_getsb+0x38/0x54 > [<801b71a0>] xfs_getsb+0x38/0x54 from[<801d64a8>] xfs_sync_fsdata+0x7c/0x154 > [<801d64a8>] xfs_sync_fsdata+0x7c/0x154 from[<801d7284>] xfs_quiesce_data+0x34/0x60 > [<801d7284>] xfs_quiesce_data+0x34/0x60 from[<801d3514>] xfs_fs_sync_fs+0x30/0xec > [<801d3514>] xfs_fs_sync_fs+0x30/0xec from [<800ba09c>] __fsync_super+0xa4/0xc8 > [<800ba09c>] __fsync_super+0xa4/0xc8 from[<800ba0d4>] fsync_super+0x14/0x28 > [<800ba0d4>] fsync_super+0x14/0x28 from[<800ba4a0>] generic_shutdown_super+0x34/0x190 > [<800ba4a0>] generic_shutdown_super+0x34/0x190 from[<800ba654>] kill_block_super+0x58/0x80 > [<800ba654>] kill_block_super+0x58/0x80 from[<800bac6c>] deactivate_super+0x7c/0x110 > [<800bac6c>] deactivate_super+0x7c/0x110 from[<800d2bbc>] sys_umount+0x310/0x358 > [<800d2bbc>] sys_umount+0x310/0x358 from[<8000ff44>] stack_done+0x20/0x3c so "usb_mount" is calling umount. Why? What does this script do? Let's start with what the script is doing, and please also answer Dave's question about what "echo w > /proc/sysrq-trigger" says. This may tell us if other threads are blocked as well. You guys are on a custom kernel with custom hardware so you absolutely must provide as much information as possible if you need help. As Dave said, we can't go back and forth 5 times in email repeatedly begging for info, it doesn't scale, and this sort of support is done in spare time. Given my experience with embedded development processes, I'm also extremely wary of what other unspecified changes may be in the kernel tree. If upstream kernels boot on this hardware, testing a recent pristine upstream kernel would be a very good test as well. Sometimes sending test hardware to developers makes this sort of thing go more smoothly as well. 46" or larger, I suppose ;) Thanks, -Eric > ------------------------------------------------------------------------------------- > > Filesystem "sda2": xfs_log_force: error 5 returned. > Please let me know in case more information is needed. > > Thanks & Regards, Amit Sahrawat > > On Wed, Dec 22, 2010 at 1:34 PM, Michael Monnerie > > wrote: > > On Mittwoch, 22. Dezember 2010 Dave Chinner wrote: >> For future reference, when you are reporting a problem you need to >> be specific about what you were doing to cause the problem you are >> reporting. Describe your kernel, your storage, your test case, >> any errors that occurred before the problem you are reporting, >> etc. >> >> We need this information to make any sense of your bug report, but >> I'm getting tired of having to ask for it every time you report a >> problem. The more information you put in your bug report, the more >> likely we are to be able to help you. We don't have unlimited >> amounts of time (or patience) to drag all the basic details of >> your problem out of you over 3 or 4 emails, so including it up >> front will help a lot.... > > Should I update this section? > > http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F > > We should probably just send that link to people so you don't have > to write long texts all the time. > > Maybe above section should be updated to: > > Things to include are what version of XFS you are using and version > of the kernel. If you have problems with userland packages please > report the version of the package you are using. > > If the problem relates to a particular filesystem, the output from > the xfs_info(8) command and any mount(8) options in use will also be > useful to the developers. > > If you experience an oops, please run it through ksymoops so that it > can be interpreted. Also describe what you were doing, if you can > repeat it, and describe you kernel, storage, test case, if there was > a hardware problem before, etc. > > If you have a filesystem that cannot be repaired, make sure you have > xfsprogs 3.1.x or later and run xfs_metadump(8) to capture the > metadata (which obfuscates filenames and attributes to protect your > privacy) and make the dump available for someone to analyse. > > -- mit freundlichen Grüssen, Michael Monnerie, Ing. BSc > > it-management Internet Services: Protéger http://proteger.at > [gesprochen: Prot-e-schee] Tel: +43 660 / 415 > 6531 > > // ****** Radiointerview zum Thema Spam ****** // > http://www.it-podcast.at/archiv.html#podcast-100716 // // Haus zu > verkaufen: http://zmi.at/langegg/ > > > > > _______________________________________________ xfs mailing list > xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs From jpiszcz@lucidpixels.com Wed Dec 22 10:28:09 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBMGS9ZX254415 for ; Wed, 22 Dec 2010 10:28:09 -0600 X-ASG-Debug-ID: 1293035405-4af9005c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lucidpixels.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 334C51476303 for ; Wed, 22 Dec 2010 08:30:06 -0800 (PST) Received: from lucidpixels.com (lucidpixels.com [75.144.35.66]) by cuda.sgi.com with ESMTP id HYl4fNjSZIjxNFAK for ; Wed, 22 Dec 2010 08:30:06 -0800 (PST) Received: by lucidpixels.com (Postfix, from userid 1001) id 8B7A91200F4; Wed, 22 Dec 2010 11:30:05 -0500 (EST) Date: Wed, 22 Dec 2010 11:30:05 -0500 (EST) From: Justin Piszcz To: xfs@oss.sgi.com X-ASG-Orig-Subj: Anyone using XFS in production on > 20TiB volumes? Subject: Anyone using XFS in production on > 20TiB volumes? Message-ID: User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; format=flowed; charset=US-ASCII X-Barracuda-Connect: lucidpixels.com[75.144.35.66] X-Barracuda-Start-Time: 1293035407 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50184 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi, Is there anyone currently using this in production? How much ram is needed when you fsck with a many files on such a volume? Dave Chinner reported 5.5g or so is needed for ~43TB with no inodes. Any recent issues/bugs one needs to be aware of? Is inode64 recommended on a 64-bit system? Any specific 64-bit tweaks/etc for a large 43TiB FS? Justin. From eflorac@intellique.com Wed Dec 22 10:54:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBMGsESZ259435 for ; Wed, 22 Dec 2010 10:54:14 -0600 X-ASG-Debug-ID: 1293036969-15ae03420000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E8AB31473E1D for ; Wed, 22 Dec 2010 08:56:10 -0800 (PST) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id ZHWu91bBfFb5txxD for ; Wed, 22 Dec 2010 08:56:10 -0800 (PST) Received: from harpe.intellique.com (unknown [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id 61E264C8117; Wed, 22 Dec 2010 17:56:05 +0100 (CET) Date: Wed, 22 Dec 2010 17:56:11 +0100 From: Emmanuel Florac To: Justin Piszcz Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? Message-ID: <20101222175611.1c7d5190@harpe.intellique.com> In-Reply-To: References: Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.16.6; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1293036972 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50186 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Wed, 22 Dec 2010 11:30:05 -0500 (EST) Justin Piszcz =E9crivait: > Is there anyone currently using this in production? Yup, lots of people do. Currently supporting 28 such systems (from 20 to 76 TiB, most are 39.7 TiB). > How much ram is needed when you fsck with a many files on such a > volume? Dave Chinner reported 5.5g or so is needed for ~43TB with no > inodes. Any recent issues/bugs one needs to be aware of? I never had any trouble running xfs_repair on 39.7 TB+ systems with 8 GB of RAM. > Is inode64 recommended on a 64-bit system? Sure, however 32 bits clients may scoff sometimes, though it's limited to some weird programs. > Any specific 64-bit tweaks/etc for a large 43TiB FS? >=20 Nothing unusual (inode64,noatime, mkfs with lazy-count enabled, etc). It should just works. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From cw@f00f.org Wed Dec 22 11:04:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBMH4Nek261837 for ; Wed, 22 Dec 2010 11:04:23 -0600 X-ASG-Debug-ID: 1293037581-2d2602220000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from parsec.stupidest.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 576271475EEE for ; Wed, 22 Dec 2010 09:06:21 -0800 (PST) Received: from parsec.stupidest.org (parsec.stupidest.org [71.6.196.126]) by cuda.sgi.com with ESMTP id b50xJZjq1JKJb2em for ; Wed, 22 Dec 2010 09:06:21 -0800 (PST) Received: from stupidest.org (unknown [10.0.0.2]) by parsec.stupidest.org (Postfix) with ESMTP id DB0EEE6781; Wed, 22 Dec 2010 09:06:20 -0800 (PST) Received: by tuatara.stupidest.org (Postfix, from userid 10000) id 9A0D12827230; Wed, 22 Dec 2010 09:06:20 -0800 (PST) Date: Wed, 22 Dec 2010 09:06:20 -0800 From: Chris Wedgwood To: Justin Piszcz Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? Message-ID: <20101222170620.GA29117@puku.stupidest.org> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Barracuda-Connect: parsec.stupidest.org[71.6.196.126] X-Barracuda-Start-Time: 1293037581 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50188 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 22, 2010 at 11:30:05AM -0500, Justin Piszcz wrote: > Is there anyone currently using this in production? yes (in the past more than now) > How much ram is needed when you fsck with a many files on such a > volume? didn't check specifically, but with older xfsprogs it could easily use more than 16GB > Is inode64 recommended on a 64-bit system? it's for inode distribution, not 64-bit vs 32-bit system yes, enable that ... it should be the default > Any specific 64-bit tweaks/etc for a large 43TiB FS? if using hw raid teach mkfs about the array geom, that coupled with inode64 made a huge difference in performance that last time i did this From jpiszcz@lucidpixels.com Wed Dec 22 11:08:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBMH888l000835 for ; Wed, 22 Dec 2010 11:08:08 -0600 X-ASG-Debug-ID: 1293037806-2d2e024e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lucidpixels.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D4AA01476192 for ; Wed, 22 Dec 2010 09:10:06 -0800 (PST) Received: from lucidpixels.com (lucidpixels.com [75.144.35.66]) by cuda.sgi.com with ESMTP id YiL9YxO5CEWqDpmG for ; Wed, 22 Dec 2010 09:10:06 -0800 (PST) Received: by lucidpixels.com (Postfix, from userid 1001) id 182861200F4; Wed, 22 Dec 2010 12:10:06 -0500 (EST) Date: Wed, 22 Dec 2010 12:10:06 -0500 (EST) From: Justin Piszcz To: Chris Wedgwood cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? In-Reply-To: <20101222170620.GA29117@puku.stupidest.org> Message-ID: References: <20101222170620.GA29117@puku.stupidest.org> User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-Barracuda-Connect: lucidpixels.com[75.144.35.66] X-Barracuda-Start-Time: 1293037806 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50188 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 22 Dec 2010, Chris Wedgwood wrote: > if using hw raid teach mkfs about the array geom, that coupled with > inode64 made a huge difference in performance that last time i did > this When I had used XFS in the past on a 3ware 9650SE-16ML with 1TB HDDs I did not notice any performance difference on whether you set the su/swidth/etc. Do you have an example/of what you found? Is it dependent on the RAID card? Justin. From cw@f00f.org Wed Dec 22 11:30:12 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBMHUB7H004615 for ; Wed, 22 Dec 2010 11:30:12 -0600 X-ASG-Debug-ID: 1293039129-1ebb01ff0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from parsec.stupidest.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 631572184E8 for ; Wed, 22 Dec 2010 09:32:09 -0800 (PST) Received: from parsec.stupidest.org (parsec.stupidest.org [71.6.196.126]) by cuda.sgi.com with ESMTP id dTijd9R5YEx8tAPT for ; Wed, 22 Dec 2010 09:32:09 -0800 (PST) Received: from stupidest.org (unknown [10.0.0.2]) by parsec.stupidest.org (Postfix) with ESMTP id 65AFCE6781; Wed, 22 Dec 2010 09:32:09 -0800 (PST) Received: by tuatara.stupidest.org (Postfix, from userid 10000) id 46AD82827230; Wed, 22 Dec 2010 09:32:09 -0800 (PST) Date: Wed, 22 Dec 2010 09:32:09 -0800 From: Chris Wedgwood To: Justin Piszcz Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? Message-ID: <20101222173209.GA29291@puku.stupidest.org> References: <20101222170620.GA29117@puku.stupidest.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Barracuda-Connect: parsec.stupidest.org[71.6.196.126] X-Barracuda-Start-Time: 1293039130 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50189 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 22, 2010 at 12:10:06PM -0500, Justin Piszcz wrote: > Do you have an example/of what you found? i don't have the numbers anymore, they are with a previous employer. basically using dbench (there were cifs NAS machines, so dbench seemed as good or bad as anything to test with) the performance was about 3x better between 'old' and 'new' with a small number of workers and about 10x better with a large number i don't know how much difference each of inode64 and getting the geom right made each, but bother were quite measurable in the graphs i made at the time from memory the machines are raid50 (4x (5+1)) with 2TB drives, so about 38TB usable on each one initially these machines were 3ware controllers and later on LSI (the two products lines have since merged so it's not clear how much difference that makes now) in testing 16GB for xfs_repair wasn't enough, so they were upped to 64GB, that's likely largely a result of the fact there were 100s of millions of small files (as well as some large ones) > Is it dependent on the RAID card? perhaps, do you have a BBU and enable WC? certainly we found the LSI cards to be faster in most cases than the (now old) 3ware where i am now i use larger chassis and no hw raid cards, using sw raid on these works spectacularly well with the exception of burst of small seeky writes (which a BBU + wc soaks up quite well) From jpiszcz@lucidpixels.com Wed Dec 22 11:33:49 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBMHXn64005479 for ; Wed, 22 Dec 2010 11:33:49 -0600 X-ASG-Debug-ID: 1293039346-2d29032a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lucidpixels.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2D5601476378 for ; Wed, 22 Dec 2010 09:35:46 -0800 (PST) Received: from lucidpixels.com (lucidpixels.com [75.144.35.66]) by cuda.sgi.com with ESMTP id WZ6FsIedmmBrNpWG for ; Wed, 22 Dec 2010 09:35:46 -0800 (PST) Received: by lucidpixels.com (Postfix, from userid 1001) id 3E37F1200F4; Wed, 22 Dec 2010 12:35:46 -0500 (EST) Date: Wed, 22 Dec 2010 12:35:46 -0500 (EST) From: Justin Piszcz To: Chris Wedgwood cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? In-Reply-To: <20101222173209.GA29291@puku.stupidest.org> Message-ID: References: <20101222170620.GA29117@puku.stupidest.org> <20101222173209.GA29291@puku.stupidest.org> User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-Barracuda-Connect: lucidpixels.com[75.144.35.66] X-Barracuda-Start-Time: 1293039347 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50190 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 22 Dec 2010, Chris Wedgwood wrote: > On Wed, Dec 22, 2010 at 12:10:06PM -0500, Justin Piszcz wrote: > >> Do you have an example/of what you found? > > i don't have the numbers anymore, they are with a previous employer. > > basically using dbench (there were cifs NAS machines, so dbench seemed > as good or bad as anything to test with) the performance was about 3x > better between 'old' and 'new' with a small number of workers and > about 10x better with a large number Is this by specifying the sunit/swidth? Can you elaborate on which paramters you modified? > > i don't know how much difference each of inode64 and getting the geom > right made each, but bother were quite measurable in the graphs i made > at the time > > > from memory the machines are raid50 (4x (5+1)) with 2TB drives, so > about 38TB usable on each one > > initially these machines were 3ware controllers and later on LSI (the > two products lines have since merged so it's not clear how much > difference that makes now) > > in testing 16GB for xfs_repair wasn't enough, so they were upped to > 64GB, that's likely largely a result of the fact there were 100s of > millions of small files (as well as some large ones) Yikes =) Hopefully its better now? > >> Is it dependent on the RAID card? > > perhaps, do you have a BBU and enable WC? certainly we found the LSI > cards to be faster in most cases than the (now old) 3ware Yes and have it set to perform(ance). Going to be using 19HDD x 3TB Hiatchi 7200RPMs, (18HDD RAID-6 + 1 hot spare). > > where i am now i use larger chassis and no hw raid cards, using sw > raid on these works spectacularly well with the exception of burst of > small seeky writes (which a BBU + wc soaks up quite well) Interesting.. > From cw@f00f.org Wed Dec 22 12:48:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBMIm8UB015559 for ; Wed, 22 Dec 2010 12:48:08 -0600 X-ASG-Debug-ID: 1293043805-2ff2015f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from parsec.stupidest.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9F06414768F7 for ; Wed, 22 Dec 2010 10:50:05 -0800 (PST) Received: from parsec.stupidest.org (parsec.stupidest.org [71.6.196.126]) by cuda.sgi.com with ESMTP id OUeKKa3t9EfopYbH for ; Wed, 22 Dec 2010 10:50:05 -0800 (PST) Received: from stupidest.org (unknown [10.0.0.2]) by parsec.stupidest.org (Postfix) with ESMTP id AB508E6777; Wed, 22 Dec 2010 10:50:05 -0800 (PST) Received: by tuatara.stupidest.org (Postfix, from userid 10000) id 88B1C2827230; Wed, 22 Dec 2010 10:50:05 -0800 (PST) Date: Wed, 22 Dec 2010 10:50:05 -0800 From: Chris Wedgwood To: Justin Piszcz Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? Message-ID: <20101222185005.GB30073@puku.stupidest.org> References: <20101222170620.GA29117@puku.stupidest.org> <20101222173209.GA29291@puku.stupidest.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Barracuda-Connect: parsec.stupidest.org[71.6.196.126] X-Barracuda-Start-Time: 1293043806 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50194 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 22, 2010 at 12:35:46PM -0500, Justin Piszcz wrote: > Is this by specifying the sunit/swidth? yes > Can you elaborate on which paramters you modified? i set both to match what the hw raid was doing, the lru that is my brain doesn't have the detail anymore sorry at a guess it was probably something like 64k chunk, 20 devices wide the metadata performance difference between wrong and right is quite noticable > Yes and have it set to perform(ance). be sure you have a bbu, there is a setting for force wc --- i wouldn't do that i would have it wc when the battery is good automatically disable it when it's bad i was able to buffer ~490MB of writes in the card without trying hard, that's a lot of pain to get corrupted > Going to be using 19HDD x 3TB Hiatchi 7200RPMs, (18HDD RAID-6 + 1 > hot spare). are those 4k sector drives? i ask because it's not clear if/how the raid fw deals with these From sandeen@sandeen.net Wed Dec 22 13:01:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBMJ1ImQ016190 for ; Wed, 22 Dec 2010 13:01:18 -0600 X-ASG-Debug-ID: 1293044594-2fef01e40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0E2A31477540 for ; Wed, 22 Dec 2010 11:03:14 -0800 (PST) Received: from mail.sandeen.net (64-131-28-21.usfamily.net [64.131.28.21]) by cuda.sgi.com with ESMTP id cOqA8UK4M0xNjzuG for ; Wed, 22 Dec 2010 11:03:14 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id D0F494882007; Wed, 22 Dec 2010 13:03:13 -0600 (CST) Message-ID: <4D124B71.9030401@sandeen.net> Date: Wed, 22 Dec 2010 13:03:13 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: Emmanuel Florac CC: Justin Piszcz , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? References: <20101222175611.1c7d5190@harpe.intellique.com> In-Reply-To: <20101222175611.1c7d5190@harpe.intellique.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: 64-131-28-21.usfamily.net[64.131.28.21] X-Barracuda-Start-Time: 1293044595 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.82 X-Barracuda-Spam-Status: No, SCORE=-1.82 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA085, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50194 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 12/22/10 10:56 AM, Emmanuel Florac wrote: > Le Wed, 22 Dec 2010 11:30:05 -0500 (EST) > Justin Piszcz écrivait: > >> Is there anyone currently using this in production? > > Yup, lots of people do. Currently supporting 28 such systems (from 20 > to 76 TiB, most are 39.7 TiB). > >> How much ram is needed when you fsck with a many files on such a >> volume? Dave Chinner reported 5.5g or so is needed for ~43TB with no >> inodes. Any recent issues/bugs one needs to be aware of? > > I never had any trouble running xfs_repair on 39.7 TB+ systems with 8 GB > of RAM. > >> Is inode64 recommended on a 64-bit system? > > Sure, however 32 bits clients may scoff sometimes, though it's limited > to some weird programs. > >> Any specific 64-bit tweaks/etc for a large 43TiB FS? >> > > Nothing unusual (inode64,noatime, mkfs with lazy-count enabled, etc). It > should just works. yes, inode64 is recommended for such a large filesystem; lazy-count has been default in mkfs for quite some time. noatime if you really need it, I guess. See also http://xfs.org/index.php/XFS_FAQ#Q:_I_want_to_tune_my_XFS_filesystems_for_.3Csomething.3E which mentions getting your geometry right if it's hardware raid that can't be detected automatically. (maybe we should add inode64 usecases to that too...) -Eric From jpiszcz@lucidpixels.com Wed Dec 22 13:22:27 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBMJMQXt018752 for ; Wed, 22 Dec 2010 13:22:27 -0600 X-ASG-Debug-ID: 1293045864-2ff8028c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lucidpixels.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D0EF514772AC for ; Wed, 22 Dec 2010 11:24:24 -0800 (PST) Received: from lucidpixels.com (lucidpixels.com [75.144.35.66]) by cuda.sgi.com with ESMTP id C6zKnsQG7MlZFyVw for ; Wed, 22 Dec 2010 11:24:24 -0800 (PST) Received: by lucidpixels.com (Postfix, from userid 1001) id F1DD612013D; Wed, 22 Dec 2010 14:24:23 -0500 (EST) Date: Wed, 22 Dec 2010 14:24:23 -0500 (EST) From: Justin Piszcz To: Chris Wedgwood cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? In-Reply-To: <20101222185005.GB30073@puku.stupidest.org> Message-ID: References: <20101222170620.GA29117@puku.stupidest.org> <20101222173209.GA29291@puku.stupidest.org> <20101222185005.GB30073@puku.stupidest.org> User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-Barracuda-Connect: lucidpixels.com[75.144.35.66] X-Barracuda-Start-Time: 1293045864 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50196 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 22 Dec 2010, Chris Wedgwood wrote: > On Wed, Dec 22, 2010 at 12:35:46PM -0500, Justin Piszcz wrote: > >> Is this by specifying the sunit/swidth? > > yes > >> Can you elaborate on which paramters you modified? > > i set both to match what the hw raid was doing, the lru that is my > brain doesn't have the detail anymore sorry > > at a guess it was probably something like 64k chunk, 20 devices wide > > > the metadata performance difference between wrong and right is quite > noticable > > >> Yes and have it set to perform(ance). > > be sure you have a bbu, there is a setting for force wc --- i wouldn't > do that > > i would have it wc when the battery is good automatically disable it > when it's bad > > i was able to buffer ~490MB of writes in the card without trying hard, > that's a lot of pain to get corrupted > >> Going to be using 19HDD x 3TB Hiatchi 7200RPMs, (18HDD RAID-6 + 1 >> hot spare). > > are those 4k sector drives? i ask because it's not clear if/how the > raid fw deals with these > Hi, they are 512 byte sector drives. From aelder@sgi.com Wed Dec 22 15:39:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_64 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBMLdJPF033470 for ; Wed, 22 Dec 2010 15:39:19 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3F3843040C9; Wed, 22 Dec 2010 13:41:15 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 22 Dec 2010 15:41:14 -0600 Subject: Re: xfs: add FITRIM support From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20101125112304.GA4195@infradead.org> References: <20101125112304.GA4195@infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Wed, 22 Dec 2010 15:41:13 -0600 Message-ID: <1293054073.2408.374.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 22 Dec 2010 21:41:14.0724 (UTC) FILETIME=[F53CB240:01CBA220] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean (I actually wrote most of this last week and finally decided it'd be better to send it than to sit on it.) On Thu, 2010-11-25 at 06:23 -0500, Christoph Hellwig wrote: > Allow manual discards from userspace using the FITRIM ioctl. This is not > intended to be run during normal workloads, as the freepsace btree walks > can cause large performance degradation. > > Signed-off-by: Christoph Hellwig I missed this when it first came through, sorry. A few comments and questions, below. Mostly driven by my not knowing where to find a reference on what (precisely) FITRIM is supposed to do. -Alex . . . > Index: linux-2.6/fs/xfs/linux-2.6/xfs_discard.c > =================================================================== > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > +++ linux-2.6/fs/xfs/linux-2.6/xfs_discard.c 2010-11-25 12:14:43.270005863 +0100 > @@ -0,0 +1,187 @@ . . . > + > +STATIC int > +xfs_trim_extents( > + struct xfs_mount *mp, > + xfs_agnumber_t agno, > + xfs_fsblock_t start, > + xfs_fsblock_t len, > + xfs_fsblock_t minlen) > +{ > + struct block_device *bdev = mp->m_ddev_targp->bt_bdev; > + struct xfs_btree_cur *cur; > + struct xfs_buf *agbp; > + struct xfs_perag *pag; > + int error; > + int i; > + > + pag = xfs_perag_get(mp, agno); > + > + error = xfs_alloc_read_agf(mp, NULL, agno, > + XFS_ALLOC_FLAG_TRYLOCK, &agbp); > + if (error || !agbp) { > + if (error == EAGAIN) > + error = 0; EAGAIN is ignored because it's an advisory interface, right? How hard are we expected to try? What I really mean is, is the benefit of FITRIM enough that we should try again later when we can get a buffer or lock on it? > + goto out_put_perag; > + } > + > + cur = xfs_allocbt_init_cursor(mp, NULL, agbp, agno, XFS_BTNUM_CNT); > + > + /* > + * Force out the log. This means any transactions that might have freed > + * space before we took the AGF buffer lock are now on disk, and the > + * volatile disk cache is flushed. > + */ > + xfs_log_force(mp, XFS_LOG_SYNC); > + > + /* > + * Look up the longest btree in the AGF and start with it. > + */ > + error = xfs_alloc_lookup_le(cur, 0, > + XFS_BUF_TO_AGF(agbp)->agf_longest, &i); > + if (error) > + goto out_del_cursor; > + > + /* > + * Loop until we are done with all extents that are large > + * enough to be worth discarding. > + */ > + while (i) { > + xfs_agblock_t fbno; > + xfs_extlen_t flen; > + > + error = xfs_alloc_get_rec(cur, &fbno, &flen, &i); > + if (error) > + goto out_del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, out_del_cursor); > + ASSERT(flen <= XFS_BUF_TO_AGF(agbp)->agf_longest); > + > + /* > + * Too small? Give up. > + */ > + if (flen < minlen) { > + trace_xfs_discard_toosmall(mp, agno, fbno, flen); > + goto out_del_cursor; > + } > + > + /* > + * If the extent is entirely outside of the range we are > + * supposed to discard skip it. Do not bother to trim > + * down partially overlapping ranges for now. > + */ > + if (XFS_AGB_TO_FSB(mp, agno, fbno) + flen < start || > + XFS_AGB_TO_FSB(mp, agno, fbno) > start + len) { > + trace_xfs_discard_exclude(mp, agno, fbno, flen); > + goto next_extent; > + } > + > + /* > + * If any blocks in the range are still busy, skip the > + * discard and try again the next time. > + */ > + if (xfs_alloc_busy_search(mp, agno, fbno, flen)) { > + trace_xfs_discard_busy(mp, agno, fbno, flen); > + goto next_extent; > + } > + > + trace_xfs_discard_extent(mp, agno, fbno, flen); > + error = -blkdev_issue_discard(bdev, > + XFS_AGB_TO_DADDR(mp, agno, fbno), > + XFS_FSB_TO_BB(mp, flen), > + GFP_NOFS, 0); > + if (error) > + goto out_del_cursor; > + > +next_extent: > + error = xfs_btree_decrement(cur, 0, &i); > + if (error) > + goto out_del_cursor; > + } > + > +out_del_cursor: > + xfs_btree_del_cursor(cur, error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); > + xfs_buf_relse(agbp); > +out_put_perag: > + xfs_perag_put(pag); > + return error; > +} > + > +int > +xfs_ioc_trim( > + struct xfs_mount *mp, > + struct fstrim_range *urange) struct fstrim_range __user *urange) > +{ > + struct request_queue *q = mp->m_ddev_targp->bt_bdev->bd_disk->queue; > + unsigned int granularity = q->limits.discard_granularity; > + struct fstrim_range range; > + xfs_fsblock_t start, len, minlen; > + xfs_agnumber_t start_agno, end_agno, agno; > + int error, last_error = 0; > + > + if (!capable(CAP_SYS_ADMIN)) > + return -XFS_ERROR(EPERM); > + if (copy_from_user(&range, urange, sizeof(range))) > + return -XFS_ERROR(EFAULT); > + > + /* > + * Truncating down the len isn't actually quite correct, but using > + * XFS_B_TO_FSB would mean we trivially get overflows for values > + * of ULLONG_MAX or slightly lower. And ULLONG_MAX is the default > + * used by the fstrim application. In the end it really doesn't > + * matter as trimming blocks is an advisory interface. I don't know where (or if) FITRIM is precisely documented. But I question whether truncating down the start offset is the correct thing to do. If the starting byte offset given were not block-aligned, it seems like you should not assume that the caller wanted the bytes below unmapped. (This is a broader question, not related directly to your change.) Similarly, on the length it is probably best to truncate it, because it avoids any bytes beyond the specified range getting unmapped. (I.e., in my mind what you did is the right way to do it.) But these interpretations are dependent on the specific interpretation of FITRIM... > + */ > + start = XFS_B_TO_FSBT(mp, range.start); > + len = XFS_B_TO_FSBT(mp, range.len); > + minlen = XFS_B_TO_FSB(mp, max_t(u64, granularity, range.minlen)); > + > + start_agno = XFS_FSB_TO_AGNO(mp, start); > + if (start_agno >= mp->m_sb.sb_agcount) > + return -XFS_ERROR(EINVAL); > + > + end_agno = XFS_FSB_TO_AGNO(mp, start + len); > + if (end_agno >= mp->m_sb.sb_agcount) > + end_agno = mp->m_sb.sb_agcount - 1; > + > + for (agno = start_agno; agno <= end_agno; agno++) { > + error = -xfs_trim_extents(mp, agno, start, len, minlen); > + if (error) > + last_error = error; > + } > + You don't update range anywhere, so the copyout below is not really doing anything useful. However I think it should stay, and the number of bytes actually trimmed should be updated and returned to the user. That seems to be what ext4 does (the only reference I found at the moment for what FITRIM is supposed to return). > + if (copy_to_user(urange, &range, sizeof(range))) > + return -XFS_ERROR(EFAULT); > + return last_error; > +} . . . From uuklo@akcja.pl Wed Dec 22 16:37:56 2010 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBMMbswN040210 for ; Wed, 22 Dec 2010 16:37:55 -0600 X-ASG-Debug-ID: 1293057589-251b01b40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mout8.freenet.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 33F0A21984D for ; Wed, 22 Dec 2010 14:39:49 -0800 (PST) Received: from mout8.freenet.de (mout8.freenet.de [195.4.92.98]) by cuda.sgi.com with ESMTP id WC8XonLuO37kP4CT for ; Wed, 22 Dec 2010 14:39:49 -0800 (PST) Received: from [195.4.92.19] (helo=9.mx.freenet.de) by mout8.freenet.de with esmtpa (ID mmmxz@justmail.de) (port 25) (Exim 4.72 #3) id 1PVXLR-0001Iy-Df; Wed, 22 Dec 2010 23:39:41 +0100 Received: from 41-184-48-38.rv.ipnxtelecoms.com ([41.184.48.38]:40233 helo=User) by 9.mx.freenet.de with esmtpa (ID mmmxz@justmail.de) (port 587) (Exim 4.72 #3) id 1PVXKw-0003h3-JY; Wed, 22 Dec 2010 23:39:41 +0100 Reply-To: From: "@MSL" X-ASG-Orig-Subj: Suprise!! Subject: Suprise!! Date: Wed, 22 Dec 2010 23:38:57 -0100 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0018_01C2A9A6.18EFFA2A" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2600.0000 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 Message-ID: <1PVXKw-0003h3-JY@9.mx.freenet.de> X-Barracuda-Connect: mout8.freenet.de[195.4.92.98] X-Barracuda-Start-Time: 1293057593 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1001.00 X-Barracuda-Spam-Status: No, SCORE=-1001.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 To: undisclosed-recipients:; X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is a multi-part message in MIME format. ------=_NextPart_000_0018_01C2A9A6.18EFFA2A Content-Type: text/plain; charset="Windows-1251" Content-Transfer-Encoding: 7bit This is a gift for your contributions. ------=_NextPart_000_0018_01C2A9A6.18EFFA2A Content-Type: application/msword; name="NO 22.doc" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="NO 22.doc" 0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAAK AAAAvwQAAAAAAAAAEAAAwgQAAAEAAAD+////AAAAALUEAAC2BAAAtwQAALgE AAC5BAAAugQAALsEAAC8BAAAvQQAAL4EAAD///////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// ///////////////////////spcEAA4AJBAAA+BK/AAAAAAAAEAAAAAAACAAA Ux4AAA4AYmpiarRWtFYAAAAAAAAAAAAAAAAAAAAAAAAJBBYA3h0GANY8AQDW PAEAPBYAAAAAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//w8AAAAAAAAA AAD//w8AAAAAAAAAAAD//w8AAAAAAAAAAAAAAAAAAAAAALcAAAAAAIAJAAAA AAAAgAkAAMMWAAAAAAAAwxYAAAAAAADDFgAAAAAAAMMWAAAAAAAAwxYAABQA AAAAAAAAAAAAAP////8AAAAA1xYAAAAAAADXFgAAAAAAANcWAAA4AAAADxcA AGQAAABzFwAAhAAAANcWAAAAAAAA7DsAAHgCAAD3FwAAFgAAAA0YAAAAAAAA DRgAAAAAAAANGAAAAAAAAA0YAAAAAAAAbzUAAAAAAABvNQAAAAAAAG81AAAA AAAAazsAAAIAAABtOwAAAAAAAG07AAAAAAAAbTsAAAAAAABtOwAAAAAAAG07 AAAAAAAAbTsAACQAAABkPgAAogIAAAZBAAA8AAAAkTsAABUAAAAAAAAAAAAA AAAAAAAAAAAAwxYAAAAAAABvNQAAAAAAAAAAAAAAAAAAAAAAAAAAAADxMgAA IAIAABE1AABeAAAAbzUAAAAAAABvNQAAAAAAAJE7AAAAAAAAAAAAAAAAAADD FgAAAAAAAMMWAAAAAAAADRgAAAAAAAAAAAAAAAAAAA0YAADkGgAApjsAABYA AABjOQAAAAAAAGM5AAAAAAAAYzkAAAAAAABvNQAAZAAAAMMWAAAAAAAADRgA AAAAAADDFgAAAAAAAA0YAAAAAAAAazsAAAAAAAAAAAAAAAAAAGM5AAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAbzUAAAAAAABrOwAAAAAAAAAAAAAAAAAAYzkAAAAAAAAAAAAAAAAAAGM5 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYzkAAAAAAAANGAAA AAAAAP////8AAAAAEKUC5MyhywEAAAAAAAAAANcWAAAAAAAA0zUAAI4AAABj OQAAAAAAAAAAAAAAAAAAVzsAABQAAAC8OwAAMAAAAOw7AAAAAAAAYzkAAAAA AABCQQAAAAAAAGE2AACEAQAAQkEAAAAAAABjOQAAGAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAB7OQAAXAAAAEJBAAAAAAAAAAAAAAAAAADDFgAAAAAAANc5AACA AQAAbzUAAAAAAABvNQAAAAAAAGM5AAAAAAAAbzUAAAAAAABvNQAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbzUAAAAAAABvNQAAAAAA AG81AAAAAAAAkTsAAAAAAACROwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA5TcAAH4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAG81AAAAAAAAbzUAAAAAAABvNQAAAAAAAOw7AAAAAAAAbzUAAAAA AABvNQAAAAAAAG81AAAAAAAAbzUAAAAAAAAAAAAAAAAAAP////8AAAAA//// /wAAAAD/////AAAAAAAAAAAAAAAA/////wAAAAD/////AAAAAP////8AAAAA /////wAAAAD/////AAAAAP////8AAAAA/////wAAAAD/////AAAAAP////8A AAAA/////wAAAAD/////AAAAAP////8AAAAA/////wAAAAD/////AAAAAEJB AAAAAAAAbzUAAAAAAABvNQAAAAAAAG81AAAAAAAAbzUAAAAAAABvNQAAAAAA AG81AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAABvNQAAAAAAAG81AAAAAAAAbzUAAAAAAACA CQAACQwAAIkVAAA6AQAABQASAQAACQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIoKCg oKCgoKCgoKCgoKCgoKAgDQigoKCgoKCgoKCgoKCgQ29uZ3JhdHVsYXRpb25z ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg DQ2gIA1GUk9NOiBUSEUgREVTSyBPRiBUSEUgRS1NQUlMIFBST01PVElPTlMg TUFOQUdFUiBJTlRFUk5BVElPTkFMIFBST01PVElPTlMvUFJJWkUgQVdBUkQg REVQQVJUTUVOVCwgTUlDUk9TT0ZUoENPUlBPUkFUSU9OoFdPUkxEIExPVFRF UlkgVU5JVEVEIEtJTkdET00uNjEtNzAgU09VVEhBTVBUT04gUk9XIEJMT09N U0JVUlkgTE9ORE9OIFVOSVRFRCBLSU5HRE9NIFdDMUIgNEFSLg2gDVJFRkVS RU5DRSBOTzogNDc1MDYxNzk4LzAxMDIzNA1CQVRDSCBOTzogNzA1NjQ5Njc3 MDAvMTg4ODIxDVdJTk5JTkcgTk86IEdCODkwMjExOTAvTFBSQw1XSU5ORVI6 IE5POiAyMg1FTEVDVFJPTklDIEVNQUlMIEFXQVJEIFdJTk5JTkcgTk9USUZJ Q0FUSU9OIEFXQVJEIFBSRVNFTlRBVElPTiBDRU5URVI6IFVOSVRFRCBLSU5H RE9NDaANREVBUiBXSU5ORVIsDQigTUlDUk9TT0ZUIENPLU9QRVJBVElPTiBN QU5BR0VNRU5UoFdPUkxEV0lERSBBUkUgUExFQVNFRCBUTyBJTkZPUk0gWU9V IFRIQVQgWU9VIEFSRSBBIFdJTk5FUqBPRiBPVVIgQU5OVUFMIE1TLVdPUkxE IExPVFRFUlkgKE1FR0EgSkFDS1BPVCBMT1RUTyBQUk9HUkFNTUUpIENPTkRV Q1RFRCBPTiAxNFRIIE9GIE5PVi4gMjAxMCANDVlPVVKgUEVSU09OQUwgRS1N QUlMIEFERFJFU1MgT1IgQ09NUEFOWSBFTUFJTCBXQVMgQVRUQUNIRUQgVE8g VEhJUyBZRUFSklMgTVNXTEwuIFdJVEggU0VSSUFMIE5VTUJFUiA3NzQxMTM3 MDAyIERSRVcgVEhFIExVQ0tZIE5VTUJFUlMgNS0xMy0zMy0zNy00MiwgQU5E IENPTlNFUVVFTlRMWSBXT04gSU4gVEhFIEZJUlNUIExPVFRFUlkgQ0FURUdP UlkuIFlPVSBIQVZFIFRIRVJFRk9SRSBCRUVOIEFQUFJPVkVEIEZPUiBMVU1Q IFNVTVMgT0YgIChVU0QgT05FIE1JTExJT04gVU5JVEVEIFNUQVRFUyBET0xM QVJTKSBQQVlBQkxFIElOIENBU0ggQ1JFRElURUQgVE8gRklMRSBSRUYgTk86 IElMUC9IVyA0NzUwNjE3OTgvMDEwMCBUSElTIElTIEZST00gVE9UQUwgUFJJ WkUgTU9ORVkgT0YgVFdFTlRZIEZJVkUgTUlMTElPTiBVU0QsIFNIQVJFRCBB TU9ORyBUSEUgVFdFTlRZLUZJVkWgKDI1KaBMVUNLWSBJTlRFUk5BVElPTkFM IFdJTk5FUlMgSU6gRklSU1QgQU5EIFNFQ09ORKBDQVRFR09SWS4NCEFMTCBQ QVJUSUNJUEFOVFMgV0VSRSBTRUxFQ1RFRKBGUk9NIFdPUkxEV0lERSBBIENP TVBVVEVSIEJBTExPVElORyBTWVNURU0gVEhST1VHSCBPVVIgTUlDUk9TT0ZU IENPTVBVVEVSIEJBTExPVCBTWVNURU0gRFJBV04gRlJPTSAyMSwwMDAgTkFN RVMsIDMsMDAwIE5BTUVTIEZST00gRUFDSCBDT05USU5FTlQgKENBTkFEQSwg QVNJQSwgQVVTVFJBTElBLCBVTklURUQgU1RBVEUsoEVVUk9QRSwgTUlERExF IEVBU1QsIEFGUklDQSBBTkQgT0NFQU5JQSwgQVMgUEFSVCBPRiBJTlRFUk5B VElPTkFMICJFLU1BSUwiIFBST01PVElPTlMgUFJPR1JBTU1FLCBXSElDSCBJ UyBDT05EVUNURUQgQU5OVUFMTFkgRk9SIE9VUiBQUk9NSU5FTlQgTVMgLVdP UkQgVVNFUlMgQUxMIE9WRVIgVEhFIFdPUkxEIFRPIEVOQ09VUkFHRSBUSEUg VVNFIE9GIElOVEVSTkVUIEFORCBDT01QVVRFUlMgV09STERXSURFLqAgDaAN WU9VUiBGVU5EIChDRVJUSUZJRUQgQ0hFUVVFKSBIQVMgQkVFTiBJTlNVUkVE IFdJVEggWU9VUiBSRUYgTk86IElMUC9IVy00NzUwNjE3MjUvMDcgQU5EIFdJ TEwgQkUgUkVBRFkgRk9SIFRSQU5TRkVSIEFTIFNPT04gQVMgWU9VIENPTlRB Q1QgWU9VUiBDTEFJTSBBR0VOVCBEUiBTTUlUSCBXQUxLRVKgLiBZT1VSIEUt TUFJTCBBRERSRVNTIFNIT1VMRCBCRSBVU0VEIElOIEFMTCBDT1JSRVNQT05E RU5DRSBXSVRIIFlPVVIgQ0xBSU1TIE9GRklDRVIsIFBMRUFTRSBOT1RFIFRI QVQsIFlPVSBBUkUgVE8gQ09OVEFDVCBZT1VSIENMQUlNUyBPRkZJQ0VSIFZJ QSBFTUFJTCBPUiBURUxFUEhPTkUgQVMgV0UgQVJFIFBST01PVElORyBUSEUg VVNFIE9GIEUtTUFJTC4gQUxTTyBZT1UgSEFWRSBUSEUgUklHSFQgVE8gQ0FM TCBISU0gVE8gQ09ORklSTSBZT1VSIFdJTk5JTkdTIEFORCBHT1ZFUk5NRU5U IFRBWCBQQVlNRU5UIFRIQVQgSVMgQUxMLCBBUyBIRSBXSUxMIFBST1ZJREUg WU9VIFdJVEggVEhFIE5FQ0VTU0FSWSBERVRBSUxTIE9OIEhPVyBUTyBDTEFJ TSBZT1VSIFBSSVpFLiBBUyBQQVJUIE9GIE9VUiBTRUNVUklUWSBQUk9UT0NP TCBZT1UgQVJFIFRPIFFVT1RFIFRISVMgU0VDVVJJVFkgQ09ERSBNU1cvREVD L1hYMjUgVE8gWU9VUiBDTEFJTUlORyBBR0VOVC4gVEhJUyBJUyBUTyBQUkVW RU5UIFNDQU0uDaANQ09OVEFDVCBZT1VSIENMQUlNUyBBR0VOVCBPRkZJQ0VS oElOoFVOSVRFRCBLSU5HRE9NLiANTkFNRTqgIERyLiBTTUlUSCBXQUxLRVIN RU1BSUw6IHNsaWZ5bWFuYWdlcjQ0QHNpZnkuY29tDVRFTEVQSE9ORTogKys0 NDcwMzE5NjI4NzkNoAhOT1RFOiBJTiBPUkRFUiBUTyBBVk9JRCBNSVNUQUtF UywgUExFQVNFIFJFTUVNQkVSIFRPIFFVT1RFIFlPVVIgUkVGRVJFTkNFIEFO RCBCQVRDSCBOVU1CRVJTIEFORCBZT1VSIFNFQ1VSSVRZIENPREUgT0YgTVNX L0RFQy9YWDI1IElOIEFMTCBDT1JSRVNQT05ERU5DRVMgV0lUSCBZT1VSIENM QUlNUyBPRkZJQ0VSLiBETyBOT1QgUkVQTFkgQU5ZIE9USEVSIE1BSUxTIExJ S0UgVEhJUyBPTiBORVQsIEFTIFRIRVkgQVJFIEEgTE9UIE9GIFNDQU0gQVJU SVNUIE9VVCBUSEVSRSBQUkVURU5ESU5HIFRPIEJFIFVTLllPVSBNQVkgU0VF IE1BSUxTIExJS0UgVEhJUyBETyBOT1QgUkVQTFkuIERPIENPTlRBQ1QgWU9V UiBDTEFJTVMgT0ZGSUNFUiwgRFIuIFNNSVRIIFdBTEtFUqBJTiBVTklURUQg S0lOR0RPTS6gIFlPVSBXSUxMIEJFIEFTS0VEIFRPIFBST1ZJREUgU09NRSBE RVRBSUxTIEFORCBBUyBXRUxMIExFVCBZT1UgS05PVyBUSEUgQ09VTlRSSUVT IE9GIFRIRSBQQVlJTkcgQ0VOVFJFUyBBTkQgQUxTTyBUTyBFTkFCTEUgVEhF IE9GRklDRSBQUk9DRUVEIFdJVEggWU9VUiBXSU5OSU5HIENFUlRJRklDQVRF IEFORCBGSUxFIEtFRVBJTkcuDaANQ09OR1JBVFVMQVRJT05TLCBPTkNFIE1P UkUgRlJPTaBUSEUgRU5USVJFoE1BTkFHRU1FTlQgQU5EIFNUQUZGIE9GIE1J Q1JPU09GVCBDTy1PUEVSQVRJT04gVE8gQUxMIE9VUqBMVUNLWSBXSU5ORVJT LiBUSEFOSyBZT1UgRk9SIEJFSU5HIFBBUlQgT0YgVEhJUyBQUk9NT1RJT05B TCBMT1RURVJZIFBST0dSQU0uIE9VUiBTUEVDSUFMIFRIQU5LUyBBTkQgR1JB VElUVURFIFRPIEFMTKBUSEUgQVNTT0NJQVRFUyBGT1IgQUxMRVZJQVRJTkcg UE9WRVJUWSBST1VORCBUSEUgV09STEQuIA2gDVNJTkNFUkVMWS4gDU1SUyBC RVRIIE1PT0RZDaCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCAN DQ0NDQgICAgICAgNDSAgICAgICAgICAgICAgICAgICAgIA0IDU1SUy4gQkFT SEVFUkEgQUJVQkFLQVIgDShDTy1DT09SRElOVE9SKS6goKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoA1MT1RURVJZIFNQT05TT1JTOiBDSElF RiBTUE9OU09SUzsNTUlDUk9TT0ZUIENPUlBPUkFUSU9OIFVLLKCgoKCgoKCg oKCgoKBNSUNST1NPRlQgQ09SUE9SQVRJT04gQUZSSUNBLA1NSUNST1NPRlQg Q09SUE9SQVRJT04gVVNBLKCgoKCgoKCgoKCgTUlDUk9TT0ZUIENPUlBPUkFU SU9OIEFTSUEuDQ1QYXN0IHdpbm5lcnMuDaANUkVGOiBTRVRUTEVNRU5UIENF TlRSRToNV0UgV0lTSCBUTyBDT05HUkFUVUxBVEUgWU9VIEFORCBJVCBJU6BN WSBQTEVBU1VSRSBUTyBJTkZPUk0gWU9VIFRIQVQgWU9VUiBTRVRUTEVNRU5U IENFTlRFUiBXSEVSRSBZT1UgV0lMTCBDT05UQUNUIEZPUiBTRVRUTEVNRU5U IE9GIFlPVVIgV0lOTklORyBQUklaRSBPRiBPTkUgTUlMTElPTiBET0xMQVJT IFVTRC4NDTogVEhFIEVVUk9QRUFOIElOVEVSTkFUSU9OQUwgUEFZTUVOVCBD RU5URVIgKExPTkRPTiwgVUspLg2gDVRIRSBQQVlNRU5UIENFTlRSRSBXSUxM IFJFUVVJUkUgWU9VUiBDT05UQUNUIElORk9STUFUSU9OIEFORCBZT1VSIElE RU5USUZJQ0FUSU9OLCBTTyBUSEUgRlVORFMgV0lMTCBOT1QgQkUgVFJBTlNG RVJSRUQgVE8gQSBXUk9ORyBQRVJTT04uDQ1PV0lORyBUTyBUSEUgRkFDVCBU SEFUIFRIRSBQQVlNRU5UIENFTlRFUiBJUyBKVVNUIEEgWUVBUiBBTkQgRk9V UiBNT05USFMgT0xELCBZT1UgRE8gTk9UIE5FRUQgVE8gVFJBVkVMIERPV04g VE8gTE9ORE9OOyBBTEwgWU9VIE5FRUQgVE8gRE8gSVMgVE8gR0lWRSBUSEVN IFlPVVIgQkFOS0lORyBBQ0NPVU5UIElORk9STUFUSU9OIFdIRVJFIFlPVSBX QU5UIFRIRSBGVU5EIFRPIEJFIFRSQU5TRkVSUkVEIFRPLCBUSEVOIEkgU0hB TEwgRk9SV0FSRCBZT1VSIElORk9STUFUSU9OIFRPIFRIRSBQQVlNRU5UIENF TlRFUiBGT1IgSU1NRURJQVRFIElOSVRJQVRJT04gT0YgWU9VUiBXSU5OSU5H IEZVTkQgVFJBTlNGRVIuoElOIFJFQ0VJUFQgT0YgWU9VUiBSRVBMWaBXSVRI IFRIRSBSRVFVSVJFRCBJTkZPUk1BVElPTiBXRSBTSEFMTCBGT1JXQVJEIFlP VVIgQ0VSVElGSUNBVEUgT0YgV0lOTklORyBUTyBZT1UgV0hJTEUgVEhFIE9S SUdJTkFMIENPUFkgV0lMTCBCRSBTRU5UIFRPIFRISVMgUEFZTUVOVCBDRU5U RVIuIA0NCEZPUiBTRUNVUklUWSBSRUFTT04gQUxMIENPUlJFU1BPTkRFTkNF IEZPUiBZT1VSIFNFVFRMRU1FTlQgV0lMTCBDQVJSWSBTRUNVUklUWSBDT0RF IE5VTUJFUiBXSVRIIE9VVCBUSElTIENPREUgSVQgU0hPVUxEIEJFIElHTk9S RUQgVEhJUyBJUyBUTyBBVk9JRCBUQUtFTiBVTldBUlJBTlRFRCBBRFZBTlRB R0UgT0YgVEhJUyBQUk9HUkFNTUUuIA0NDVBMRUFTRSBBTFdBWVMgQ0FMTCBG T1IgTU9SRSBJTkZPUk1BVElPTiwgQUxMIFlPVSBIQVZFIFRPIERPIElTIFRP IEJFIENBTExJTkc7IFNPIFRIQVQgSSBXSUxMIFRFTEwgWU9VIE1PUkUgQU5E IEhPVyBZT1UgQ0FOIFJFQ0VJVkUgWU9VUiBXSU5OSU5HIFBSSVpFLCBXRSBB UkUgQVNLSU5HIFlPVSBUTyBTQ0FOoFlPVVKgVkFMSUQgRFJJVkVSIExJQ0VO U0UgT1IgSU5URVJOQVRJT05BTCBQQVNTUE9SVCBUTyBUSElTIE9GRklDRSBT TyBUSEFUIFlPVVIgUFJJWkUgV0lMTCBOT1QgQkUgR0lWSU5HIE9VVCBUTyBU SEUgV1JPTkcgUEVSU09OLg0NUExFQVNFIEZJTEwgVEhFIEZPUk0gVU5ERVJO RUFUSCBBTkQgUkVUVVJOIElUIFRPIFVTLg0NQ09OR1JBVFVMQVRJT04gT05D RSBBR0FJTiwgDQ0NQkVTVCBSRUdBUkQuDU1SLiBTTUlUSCBXQUxLRVINQ0xB SU1TIEFHRU5ULg1URUwgKzQ0NzAzMTk2Mjg3OQ1FLU1BSUw6IBMgSFlQRVJM SU5LICJtYWlsdG86U2xpZnltYW5hZ2VyNDVAc2lmeS5jb20iIBRTbGlmeW1h bmFnZXI0NUBzaWZ5LmNvbRUNICAgICAgICAgICAgICANDQ2gCKAgWU9VklJF IFdJTk5FUjogTk8gMjIgICAgDQ0NDU5BTUUNCAcNOgcNBwcNQUREUkVTUw0H DToHDQcHDU5BVElPTkFMSVRZDQcNOgcNBwcNU0VYDQcNOgcNBwcNQUdFDQcN OgcNBwcNUEhPTkUNBw06Bw0HBw1PQ0NVUEFUSU9ODQcNOgcIDQcHDUNPTVBB TlkNBw06Bw0HBw1TRUNVUklUWSBDT0RFDQcNOgcNBwcNV0lOTklORyBOTw0H DToHDQcHDQcNOgcNBwcNAQ0DDQ0EDQ0DDQ0EDQ0IDQ0IDQ0IDQ0NDQAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAIAAACCAAACQgAAAoIAAAVCAAAFggAACMI AAAxCAAAMggAAFYIAABrCAAAuQgAAOPRudGdi3Jccj8kAAAAAAAAAAAAAAAA ADUVaAY05AAWaNBFwgA1CIE2CIFCKgZDSpAAT0oDAFFKAwBYCIFcCIFeSgQA YUqQAHBo/wAAADgVaAY05AAWaNBFwgA1CIE2CIFCKgZDSpAAT0oDAFFKAwBY CIFcCIFdCIFeSgIAYUqQAHBo/wAAAAArFmjQRcIANQiBNgiBQioGQ0qQAE9K AwBRSgMAWAiBXAiBYUqQAHBo/wAAADEVaAY05AAWaNBFwgA1CIE2CIFCKgZD SpAAT0oDAFFKAwBYCIFcCIFhSpAAcGj/AAAAIxZo0EXCAEIqAUNKFABPSgIA UUoCAF5KAgBhShQAcGgAAAAANwNqAAAAABZoYFaUAEIqAUNKFABPSgIAUUoC AFUIAV5KAgBhShQAbUgABG5IAARwaAAAAAB1CAEvFmjQRcIANQiBNgiBQioB Q0oUAE9KAgBRSgIAXAiBXQiBXkoCAGFKFABwaDMzMwAjFmjQRcIAQioBQ0oU AE9KAgBRSgIAXkoCAGFKFABwaDMzMwA3A2oAAAAAFmhgVpQAQioBQ0oUAE9K AgBRSgIAVQgBXkoCAGFKFABtSAAEbkgABHBoMzMzAHUIAQALAAgAABUIAAC6 CAAAuwgAAL4IAACTCQAAlQkAALQJAADRCQAA7QkAAPwJAABSCgAAVAoAAGEK AAAdCwAAHgsAABgNAADeDgAA4A4AAI0RAACPEQAAxREAAN0RAAD8EQAAFhIA AGYUAABoFAAA7wAAAAAAAAAAAAAAAO8AAAAAAAAAAAAAAADvAAAAAAAAAAAA AAAA7wAAAAAAAAAAAAAAAOcAAAAAAAAAAAAAAADnAAAAAAAAAAAAAAAA5wAA AAAAAAAAAAAAAOcAAAAAAAAAAAAAAADnAAAAAAAAAAAAAAAA5wAAAAAAAAAA AAAAAOcAAAAAAAAAAAAAAADnAAAAAAAAAAAAAAAA5wAAAAAAAAAAAAAAAOcA AAAAAAAAAAAAAADnAAAAAAAAAAAAAAAA5wAAAAAAAAAAAAAAAOcAAAAAAAAA AAAAAADnAAAAAAAAAAAAAAAA5wAAAAAAAAAAAAAAAOcAAAAAAAAAAAAAAADn AAAAAAAAAAAAAAAA5wAAAAAAAAAAAAAAAOcAAAAAAAAAAAAAAADnAAAAAAAA AAAAAAAA5wAAAAAAAAAAAAAAAOcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAcAABJkHwEAAGdkFWiRAAAPAAASZCABAAAUpAAAMSQANyQAOCQASCQA Z2TQRcIAABq5CAAAuggAALsIAAC9CAAAvggAAOUIAADmCAAAkgkAAJMJAACV CQAAswkAAMcJAADJCQAAzgkAANAJAADkCQAA5wkAAO0JAAD6CQAA6tjDsJ2M nYV0Y1JBUmNSY1I2AAAAAAAAAAAAAAAAAAAVFmgVaJEANQiBQioGXAiBcGj/ AAAAIRZoy2KDADUIgUIqBk9KAgBRSgIAXAiBXkoCAHBo/wAAACEWaBVokQA1 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 ADBKFwA1CIFVCAFcCIEQFWgfJ7IAFmjsDIAAMEoXAAAZA2oAAAAAFWgfJ7IA FmjsDIAAMEoXAFUIAQARbB0AAG0dAACKHQAAix0AAIwdAACNHQAAkh0AAJQd AACVHQAAlx0AAJgdAACZHQAA7wAAAAAAAAAAAAAAAN8AAAAAAAAAAAAAAADf AAAAAAAAAAAAAAAA3wAAAAAAAAAAAAAAANYAAAAAAAAAAAAAAADWAAAAAAAA AAAAAAAA1gAAAAAAAAAAAAAAANYAAAAAAAAAAAAAAADWAAAAAAAAAAAAAAAA 1gAAAAAAAAAAAAAAANYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJGAAWJAFJ ZgEAAABnZOAi1wAADwAAEmQgAQAAFKQAADEkADckADgkAEgkAGdkJF0nAAAP AAASZCABAAAUpAAAMSQANyQAOCQASCQAZ2TQRcIAAAuFHQAAiR0AAIodAACL HQAAjB0AAJIdAACTHQAA9B0AAPUdAAAuHgAALx4AADkeAAA6HgAAOx4AADwe AAA9HgAAPx4AAEAeAABCHgAAQx4AAEUeAABGHgAASB4AAO3Zx7OsnqyerIus dF1IQDxAPEA8QDwAAAAAAAAGFmhxG5cAAA8DagAAAAAWaHEblwBVCAEpFWix Sw4AFmhqTf4AQioBQ0oUAE9KAgBRSgIAXkoCAGFKFABwaAAAAAAsA2qmBwAA FmhaeSUAQioBQ0oUAE9KAgBRSgIAVQgBXkoCAGFKFABwaAAAAAAALBZoak3+ ADUIgUIqCUNKFABPSgIAUUoCAFwIgV0IgV5KAgBhShQAcGgAM5kAACUVaGBW lAAWaGpN/gAwShcAQioKT0oCAFFKAgBeSgIAcGgAM2YAGgNqAAAAABZoYFaU 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 gMdys3BhhJQkT8m5KmwPM9XVFVbtcXv6vcOcq6dEs4yZhowZGeYcNNr4tCEj y2bdn2GYMWNGRgX4yTEsbV5a22RozlQ6mENo5OF1Ex73h7tmTY9jSbxeNNqy KrJyANuEu9FhNPwoM8NsNfIXDMUOyrLuz0SNmWZUmFVRkWV1GJsqcmzmjMwf oR5ejZUa9aMcx9P9XUPDd/r6Roc87kHRqS7vkBf9679o0SbhSE1OypVmJTW2 H0blHRoa8nK9XV73WF+Pe2h4tG+kf/CG6KfNvHib2by0uQJtznl2Gzgz1jZm vfyyIbfJYWt+0bypaenyxQ1EJYkxY30m8prRRVvm4aWquaFsfkKunrJas15c RjDjUlOmzVjbvH9T5vImY+biDNBtrThs4Fq3NWbtz8ytNTrMuduyHMafL16a U9FcYcxqNlhtmY1IR8WmDKNj/8AAtb7PPTI2NkIUoXfDw8O8f/0Xq1VWEt+T ckVNJ6YGvH7/8LAf2jAAZL59fXf8YKxnRLUJ42ID+MloNKPti6lZjtrGTXjO ynKYTUh0WF9ubKBkLoa9KEd5MLq94FcV66yEXK20OYwNBpRwOMyNOQ4DKbRt O7wi50Wwba0wVSIPQjVaVzRvM9oOv2a0GZ7NMDaZalHGcLjCkdO4nSAVlShq 9KA/o31jY+jG2JAfVoDOoXt+Mob+wfzEJCmpybhKgbMiprqEMlJHWjEIo3dG R8fGPAMetfucK0fOKw1ofJgrKwzJ6jDsfZma6Yjjaj98L1JjuLJxOya+jlfN rTquEteOaddQ4XgZVgSuNr3WSHO5wmTgXO0wHV5uwLs6OgbTCnCVY2g02Gy1 phVI39RYa4vmyuYmQxqDYB4SS4r4yRjA1vmpyErG1cIjRBVMSdUm7sScf8h/ p29k4A/UahLBla0BthPmylCxlLJr95I7AVfc3PijoTKjYpmYkLFcdSr0VGWb 9q2ZPVcli3OFnhuIqxXrG6io2VRrhl2ZGw+btxm4Vm7JjqZnd9gONy5djKlt azC1IMfa+NqmaK6ss6hLY6P+4dFR1QpUuoYwJS8unIKsZFyVE1WYdLFUDSMB dgvvOOZWp6DClTWaq8XNuctiuIqag5tzm3MTcaWY0jrTzqLVpWW7Fylk5dEc NK9/NncTuMpRuNpMXOW82FhhjeFqz+IK4+HGzKXNsKvEXDme8dAc7EEfqC8x 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 VykX1ljLqtq62tpOdJ08efKZurqfFq+bi0/6JX88e7YO310mCk1FcvnqrqSv 75n2eVtLXt2e/jnZEuT9l+chKA0L6IoP42K1TjAozlRX5Z711YKUXxabdykH JjEsiZcZclX67v519NVG+KtpcCVqu2AtyMxJW1Q53/SXv7xeTF/JYFcfnL04 P7ZP4TeE+/RPvFcu+iP587QvwuTk5BemK991eNrVzzsqE9IuFCSh6sTK4lfh 0KtLU43ri8wVv0rA0v8VV9I+7Jn5JKR1cNpcpVZLB984sPn5LIXlV2jjval9 z6J+7unDHE186J0/l3up61fCTH388YoXmqLs6kq6bm77/9Ljo3dCiWGqTfnk CMO6POvtopJXV1dnv7R+fcla85vkuRILt6vpxAw2Y3b2QTonFtJIvSWHRfHV dLla/aY95ddra17lvz1AyXUm6MBt3aatm57BL5Fw7pVQ+vthUutenSe8VISs aH91JX3Tq3vmPvPn/MtH47UIF/V/GPsWrzaue91K4mGnwU54xKY4gRrbxSAw eYCYGUFwsCTEawBlxEvCxCDwCXYlHoaA7SC7IXGSdoXUxMe3YCiLFjDrruX0 JPUFEVb8iHNqJ/f29KzzB93vt/ee0QjjtHstJCGNRjOfvt9vf7/HHpmw+uSt FGv565/AGXz4xq2U9iYcSmuD3+fsdsuhYv0Mn74nrFL+OVbtJ1wazqpBF2rt nVSEoOFmWD3bIeofWV9vcVQpnfVViupUNXpnfy2qcxhuZootOR/Por1ml/E/ p4450V7yPPfj69vmCVDgth573uv05nzy0T++oZGwm12cOe+7RvGnjykaRyjg 9nhqm301avDZ3grVBIZVqn5GT93/jD/Tie/f46wr1V93sLNlZwqs+uWj+gvP ureeG7TUNygT5xvQISWzdzPNgRJrmLWMzM9FIu+Ik/yfl04dOnLk0CFyY//7 V/modcW91Ov791Nvn3msbyd5a705H9NnM6z+YULcRCfuyTEfx1N4/HCPdgQU lIElT41fJ8Nu5/GvYeUIoQDRUGpYoMXydhNSVzpWHnlwt32bn3M0VPQMwh00 o6OJhgKWok6NQ3Q68cBTOx+ZmUUNDzL1UOZ73S3UceP0Hj51DFU0tXAl7qUK T558Pv4fIFt/Y39lbUvmx39hH2cQC5IXyO9Cqi+/PGk+MPa4vavJ5XJJFc7q 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 Si9S6+qCkbE99V99VcWYFdbVYtBtUqPz9EdesfKZ7Z09NW19digMyD+USk9n 40RRURFj+Rb8Hd+cNE8AyarNJ1bqJmvNLXuf1VYzaL4FnwdW4IaEpMc8rTdl Rc2wCJQ1/6Oe5hErXXTWard7LPYhu/3mGU5IxM8pEzKtlmmhCG0oMqSK65+P CkyGyvKIlTAbsHa7Ldg/C7vPdd5qY/Ak/YcdnqKuP8LTQebVlaEPH+tSHrGC th3xKe1kh7iFJGSiQCUDy2rFwtoSWFjwDHoMO0DIyidWVxlWgIoR1s25EEKe qXhDM+TngOIOeb9BwoarhoUtcwzKgQjziJVStwC6Yms/bERtGzrtFGmH/GL0 5AbqH5GcunyDofwzrTxiNXLHbUHee6ZT6OnMkitWJIORhT9KZrEcCCPHR/OI VdCLRPaY8LhWoYdvCxa86oNbcWwkmNyvq4GQtARKvvEx/8ojVgr/AmNKnLI6 99O6z+ex9jUg7BnJU+SuUyOhwdDHRCVzXfnEimykFsvt27RVnI3tsQKF6HWn MMK8wAMhb0wnYFsDXcwHjZ8/c/s/5tV8YqVqmoNIcGP+JjyCbrE8YjPtExH0 3uAhYQG5ZsSC0211gPlAwPOJFTPQBD6fmnaHO3rIxidYuXu1TufDXjhcbGCg bUmY1gcikv1n+cRKBz+0gPaLrz+rmezouYw2Bj19zMoF1HTjHvjHBjxwuw14 sniOZO/V9tzJJ1Y+V5tFe9RcabdDycDWyG3W65LiXekcqK6OQsryRZ15t3Zx 7POJlYBAMMqzWgPe3hOk9vgs4WFiWOR1NSAcHtcJwfyLoKw99F8+sVLoEdRg MV85Bro6x2T2AZel/YJ+BOWql7kZ95V/MqqJNzbPJ3nFCnSEKKSj9uIDQzbu XYXsSxbkkHWL68GA21ZeVGjKM0ZS9fnFyun2nC66VLOv5bKtDGERKAN6r8uL aAoUn8s6GDDbD9TXSo3N8zGvWCldZld1lbsbq8GOYxmSNut6He19yXvD5xOu vGKls5/XQsVHq2dbZ6rvLKHi7ILCfZ8Jm3XmfzWYZ94uNDDVsdV2rrG4lpaD aaWpubm8qK6lvlWTduvjX8grXSn01cXVXxpOG8/uKy7K2Hdl7VdfYVfG/Otj qHX5xUpRcvrTourdfzhw8kzN4YxgIX5px0hYecZKV1V5quL48bLysmNFJZnB 2jlX84zV4ZMV2mPHKj8rK/v8i307hoCyfJ48Y7X7syNHPzt2/PODX5w4UqTJ 0sadcjm/WKmLSg+WlR84dGDfvsOHd+8MDp79y+QXK8W+3Xv3f3qgqKh49/59 JdlbuTPu5BmrPXv37du7t6iI9mzaGYC8oxV5xgpZ8oFR4Sc7na0zBPOOFbVi 9yc7n6jQzB2BVTzgmX2+HfvfrsJdu3ZVqQ/sUu/qd3V3Fyh24+9Tin/9S4Xj rl3/B+NQKHkAbh7w/ikAAMwSGHVURVT16IZzRFJgyJ//iVBORw0KGgoAAAAN SUhEUgAAAEcAAABaCAIAAABlmtwNAAAAAXNSR0IArs4c6QAAKadJREFUeF6l fG+I49iV751sDVxDNUiQAulDB+5AB2SYARl2wP4wAQUmoIIEXLAB+0E+aCAB F2ygCrKP8odZcEMCLniB8uMNtBcmoIIN2JABayGPUmACMqRBgtdgLfTSd6AH JJgGCVKgu+Bh3u/IVdXV1dXd+aNOd2xZ0r3nnnPP+Z3fORr2zTffFPh7eVTX PtcfNyeyzYerX29cVj3/5eKqF898882T6JsCD8F110fbDHb9YS+Nf3M+dD0u urzu+fXX7/wWY0zD34tDccbU5efL/8/D05HKM3y9+hUf6gsvruX0CyvxlU5w /MM3P10+iy1nTEb1E66Nht9VfjVafXP94BePzTPyNEyDISuXuAYXXc7k+fXX 7ySprg1OXy5+llEuU3zLo5M09GWMz/WUL2eqrmZ8OQn6CRKlCZeYa/2YzbOU ZKtAhf7N+colL1dXJzdL8/JRC6A0XkbT+6E/rkWULA+vXX1zKhupri64mIVK 5/PpYVFi9aVcTnlRZhmken7QqnJIcHH95gfogc5kMTs9YGVWXl0uE1YWWZRs VHl5JPL+kNUWgGE2RvLSQl1cC4GzNDU5W87nZV6WGdZ5mASHZB8vzP/i+o1U L0y3zAM5H6ZJomtansmqKvG4UsWXwtP4G41dLsblWmzONE0l52x8qNVPpetk AHkbMitTCLY5mzAMEcfMdHAGV16TCCdukU6Vkuu8qlgmY83UZbSM/ONkGd6Y /+brtzbCXkygXrI0jspVqnFWlVml6nVs4Fkw6Ktjo6WSpUuWLxmuoYmQudPB LSYYVpXdP6SzOFPGLC81pqqongQMOxqrcVBaJjMuLJXMD3+UzIMAF2PQ69OF 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 hlsF/BulwrxfqOfX2x52CDcYRguJJu9L/AkYeTEw/gMVRYmmFlD+RIrAuYIY 0cye20V7zat4lTdp5fbf/0apXjMYtASro5em0NOOt7ipJlNeXk/OEBsGdUd0 YID8wL762+b9d8Wrv39IvJJPMQr7rd70SJyNv+FN6b9yHv8fpdi1u2wconcA AAAASUVORK5CYIIAbh7wzugAACSAQrdC3oHS7kZk/Z2Ai6v/iVBORw0KGgoA AAANSUhEUgAAANwAAAClCAIAAAC4FQTfAAAAAXNSR0IArs4c6QAA6HdJREFU eF6c/W+EpHma749H7mQQQSYRZFBRRBFFJplUUskkXYcaauimmh662Wb7wRz6 xy49nGGHM1/fOeyDXc6yw1nOPJivXx/OYYYzTD9oppY+vjV0U0UXlXTSOWQT SSYRZBBBBhlFJL/X6/25I6t6Znam5xfTE5UZecd9f/5cn+v/9b6+VavVGo3a 6mptseDHP/dq1Grf5LLlbbjzYvXPfKXRaCy+0bP/xNgcVrkPP/HA8t9aRruW 7/HeYpqLGp/xX/mE1/XFr35rnsvK173PH7myseCJtcbqcuXKwlTL88ovr37O AMoN/+gIqw9ZMW9U/snrlTX/2lNeWY9XL3/1S9fXv3zici7e/et33sgzr+d7 vW5luV5dz5ef1Grz5W2kot+b3SvPKvtyvaTlZ9a5kN9yruzhKpu40mrxU6PZ bEwmc0fJQ3zL//iAb87nXOBn+YWf+bxcmQ+qn6ut9stc0+JbfFLuN5/mpmUV vD5fWz7Lx3PPMjtv5xNfWfA/8mN1g1zeunFjOhrlWd6RT260Gt1uq9/vt1vt RrM2v5xPRpP55ZRPHEKzNZxMp8NhrQmZtpqN5o3ujdFkype7/f5wNOje6F7W aoOjwXx+2W41h4PJZDTlT41Wq9tuTyeXXw4G3W73nbff6fdv9Ps73KdW4xs8 t+3Uqm3ihylPY+6DweDg+fPfPHr0+NGjZqNxo9t1aSeX3G46nOTrfK/J4zLV JvMYDIeMbbm08zKx7EL2pqye32IvXt2Aat2WC389mFq7fDfP4p/J5WS5QX7e 9s/Nve3twXDw4MGDwdERc3xw7wF/GrFQnOeuG8oaXs4vm3x9OuGKhw8eDOfT Ztuz1mq1p9MJ6zHhE5ZjXptKT/PhaDgYDO/e3Wk2Wg0m36jx+3TuyvT7Pm4w GDGDy0u+4dTa7SYffWs+X6yu1eYznrlY8N9iMZvNYABcs7rK4xarcFHnzzGA M6yGUhtcuaSM6ucFn6/6M//IRWC98/na2tp85j0ryir/ll+Xn3F/XxyzP0aR Pmt10Vgrd66+FV7C/bNHs1m5m49Z1Po3Wr1eh/84ht3O+hrjXqlNp+PV+ur6 2mqjuc60ZtPh4OR4XTqYra83Op32dDblBv3bvcPDQ9aOkdTrtdlsyoh47skp VNhbbzQg5v37D/7j9//jBz/4YHtnu9vv1eo+dzIZQ3xn48F0ND4bnZ6cHJ8d H/PFZr3eaKx1Op07+/vvvPG92/3e6enp04ODxWzebreZ8nQ6XWu6sLMLl+kC JrGoXcxnWWfWkHdGwEjmLBD74qZkeQtF8nVWjisYMBLJfcrnYdqrzdVafX1t Nh2zLHzQXF+vXS4Y8PxyUW/6aNec/zVXVxaL1lq7d7urqIGm6rWD54e92735 Bc9dvVjM1uuri8v5Yn7hyqxCqafj8bjVaXU7neFwWGdxuWCxaK7xkLWL6aTZ qLN6q01HyOJDuJ32OkNaazRfuE3z09PhnTs70MZoPD4/n/AU7sxe1et1pvyt nDmmjOxjzoUWCxXySWgR2szMc14LNUgf0sSrP0tsFbVBnex3+LL0Vp3sa7kf fl1J25zg6polP2ClWmsy8Far5Uh4PnuheKi2JBR/LTakSM4hn21sNHp9/tdj 2u2NdmN9db2xNpdRs2UL6CD3Wh2NOJ2SxaK+WG+sdm93To+Pe93ObD67Wsz7 O1vj0XgymayvrbfbndHpaDqdwxrv3bv3t3/7n/bv7bEe0NnqGgu5ymnh3063 U1+ps8SD4enu7t76asObL1bH4+lXUOdstsKKdzvbO3vv/e37e1tbkNdnz55x nNY7a+fDaZNRQjErtWZ9/WI25j5MdF3SWqyr/Mx5CkvkikG6/D6d81hWg1nw +Wa/v76+3qyvIu547soKRLXKf602k6uvuKoztrTJF5QbyAppVDpgF3jMpUS9 Uq+xbuPTs/XGer/XPT05ZUwrq7WN9lqzvja/nHGX8+m41+sNR6NWsw0NTcfj 3bt7EyazuGivN8PCVhjDyuJKnl9366FWD9sU1ljrcA5X62vrq+MzFvgMQl3v tIbD8UqzzlmEqJjcerMJuX9LrYsZhi86SmmR+ReOGKkRqmLPf19QXAuHij5k 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 kmBzfeJNQOGOvJsJW9CRKi7r3SylX76ubw8zoMaISrcnj58eDb5cIlpVgrTg O1zvYGhUPhqRYxWeK8+755FsDO7P5Ng7vy51hqZLLXkhtyqf0jGLO1NyP71N 4Zce8Sob1F8K14b3BhoklJRl0Wbk6lLVy3fhUmW5XJFycPJWrW9Z5eqTil9W e2Um4vX1AeNIHnGyZkh9MSJMCVcOFH9DjuT8AThQeFJFmeX2/Fdyi16pcjQf CoelpbdinebIl0TSnFFOU3DAglSrtWcipnSUWkQu9Ckm85jpKFR9o0WdLpWW XBAtpkQCZdJlZyu4hKpWLjKe/yreUFYmYy48NdPy3fq2CtIjwHIemLLrFXVJ sPlujkv1Xh75yjqQlmSCVbJDETFl0RDDyO4Ks9S9DjUUgVFpLPnZVtX9u6/d JaPZBj95FMwS3KWUn5sT9PJZ2fhqf1NXXuVrvqyvN+kKfKKS7slGZm3DXbje Hs5lHXwv+JTLu1T0p5BHEPOnonvBCH2RnQqFI6mrROWii1RV4SHCMsHqNIfP yR8qSq04YvlWljGH5eXCFn6ZE1PRtF/XY59l92vqOcnBMoc0J4+0qJJe7G55 T59eJAWkutx1Sc8E2qWc+vLLL8URBD3LFN0kqLJZZGoWbcn3IhiWzMi5lBO/ 3Am2pAuygGI3cwHN1qTjINCNSDEnmzyF0gzQ9atmnWz8YKcztCKFQu36LgoV Lj9eYkrYoB1lo3DukpVX1mdJl7mBs87cX24DX+C7SdwOn674WsWOSnVApVkW wg5VZSCsrfKZ/4lamJYdMv8bLZgPWS7moalRmovOn5abk53NLi+H5iehRTHS yOcFpk+MAzdQtlbGlNWuVPLCNYNPmcR0f4s2U0231GIuKT3PK6gjZeZLyqsy +MMj89UyJn8ME+JbWTQ/K6d8yS8LRYaSqmPvX4ueorjxu1n+cJ0sEmiR/Rsk OzcbJOu5LAV7LfgWudL1KU+R66eylo9ksQ2hH71l7oyCBKHAR8kB5Z6MBLZJ EqHdjLOvuXPkfkU2ZfxF3FVygAJE71VS/6mmAMkusPWBamWlkV9yzQoLJF9X 0lWE48qUZXLk13ngDl1hXjQEmFzyIzF05CvVklZDKQO6lg/Vui3vWUikVSAC yzck7mLxmIyd1cYBFjwmf07JQbkp0qninZWex2FwYVkjBYunfVnHna9IJxle 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 oJIJECP1sLbXk854q+hT9OzNx90nU+vflYNbI0yj9dCTTBQSkN6S2iy02ebt 1jP10Da+R1RFPxTtpCGK7u6tjrVaHOO/+LTarTixRKoN//WdMVqvbqif6Ote B8/qW8v06/SJjsSod88TXwcFzFW7lGmpnbfmwdE++jxPV3ZmL41/K3GbmfSz r8mB3ppoZOZz74NdfNRMxEgseIWuT3om2AbdkigO9X1lY2k2GlkU3/C77w/e T1w2z3QmKdnKq1r5HqmNMSYqF/JX6OidFtyoh7LD4zvnuyP1+a2xxxXp9M37 tgL2XYtR3LThnTcZle+amaB1cEPM/EbrJf5Ivfc9xXmiu22mngt+KbpQaMKC wTbi7XtM/oJNEpdJleSlldoJyqrNwiYVI9q2f1tXb9u7dRadS4Zl53zn7Rt9 FbRK3JPn5U/kvSQZ3NIRrpf8utnt2JJ2uz2yNAbRZqsHb1mhIPtGnaYZSOye BOo7FA+vZvMxRfyCpIt3CLClmjVJGmGie5rLYtbD09ioYcvQliKvzcRun0Pb 7E5oGmPYpIL33YK55HvmSpfLf/zNPxXPBBOkLuy2VfCFv9x22M/9N9Y8R7Nu 5jIUfMFHO1y/IdVr/F7YST0TGjy931OwQ6+dc+tQRt6uyezmq/k8C4XTbh9I +beCRkGXnSbyJE9bqkWj3/3s9Dbpn0Lv70rPhq9fl6S8FJweDUcPbnFBuh7z tiHXVlJ2Z3vn61vtyP/DC2TAG1Jt+lFY+fBYkm2EtvLcfQzPInxqCBZdXdkC wfIbK4fX32q1NaUZwqmZxhSPs/l8PObtg7NXtVY9aM1j3YN+t8vN+Ozzequ9 EdDdoRek1rVCM7wuRCE9ux/+ZoZ3R/emNuH03/6T3OKtZkj0tTYsrFy9lku5 ugcbHtlOwhuktSB7SKXahOkgxeZ4q6+b63E1vEbR2xrGfATdw1+kuXarFdZx lc8hXqslY5tlc/rcbkHt2nA45DyDqJm4fTzX0X1Qa61W9+j4qM0kuWu6M89C sr/nszv2JGGv0fo1hnxjO8FVHPc+ePqkVq/ka1FnbZquS+tahc6s3SUf1xz1 LW3p23RnnHMslSpbulf8mI7rvAK9KqVapbJeryuNZoljpRp0X1eqtUqV63Di 2lTWefwnrleb63xd4n6e8re0RkOmXV7O16v1ul6qNmrV2Wy8zpetVmO9ZlR1 7qk3mlmW8QjH+Xy+zEvj+ezqcsyf+fpmfSPxabbbegP/8TVnGgfD5rxCb6qO tKulCjSqMhhdDwrQvDvn6eeZxMvcwlDSscarmcvt0XdWK3qK497P3nsnaCq+ RmKhlI58r7a5sv025qO4s7i+5h46UlGfmK3dY4NGGnW9u9FsQDYdYcw23Flq +Vw6xzMR1Occ+aedakXHUkXOQbNUFaU9LXDKuqJv1kIOmLZSJV8NL4btdhPO RTL0UJPZrAwGA5G4VJtly263K4o0O412p91uVCslboe4VUi7rrZajJcZbWkU jYbmzPRq1hq8i2O6XuED/8A80Jkj/eDIGGmZe3ysMgjmXiO9deSBnc/eB++9 U3A09M3hSx8ruzy+1TO3eT9dj6d25KDwYROHBhcXEmO5QR/Ml3QEDoJ/1b9G FXpxXCIHovtKBBGnc24NYwbLl4tKrVqvMMD2epkvlqtvLwYMu9vt1WvN+XLR 7nXyxXp0NZ6Jf5khqFGvd7o0ftNodjqd0rq832hXIXzlZr1ctzsdTVK8K5R3 xZa2AgXgYnO0GgmW0BERgBnQt3wrKdR5cazqPEmtRr20ZOiIdNJMntOjyt7P f/bTSrlUqzbW1XXDR9gE6dKRG+oSPB3TFVo3X0gCtpIR56bsRmLSnUkOQmI2 z66QCY1EdC/RG0mqjjnX6cGKF9NatVGHyavMCjhUBcVRwe6Z7fPpbJwtsmyW rRZ5tsz6PYjeht8h2Wgyni/W/f69arNda3dukPNKY3Z9U6lKejR4eLleW8yX N9V1s0rs2lzSN2sPa04LGKO2dHkegr6J4uGbQ5O4YqBoMxPF3CTN4zG6JWhd jDHf+/Cdd9Yw2WqJskFN1nTOHFhbVa0rJMTwbJxzDwaugtLlSmggaaTNEQrG 9cLJDzWm+8Phr8r538yctErSpDC9/nAvpfflw6xX1Vp1la+huPQsVgg6T6fn L84uhhfjSYakwLGj0XiZr6tSLfXlOh8NJ51eT01VkPESKmW8vKk12tzaqjWn kysUg961Xk+uxihuhtDmW5+E1va4xOmi0851hE06IB1vUbyYiTQHaT6Sygzt X9jaSm3v3ceP8uUch92sL9lnDkV3NNe6hORxERaj9zqX+pW6r1gmNAcMTtJg KqcjvXELPBa6OIVYdEwzX+epnZlwo9aP3M7brK/N6VAZihe4bqU0Ho2Gg+H5 2Yurq6tlNuWt5WvYtjybTG7y/NXF4OamhNJel9flWnO/20XDNpto7/ZsPKNN es3ciImllxszvBrmbb7s9Xrdt6V/rEM0ojg2kj5JV9TFJPcNrAyNm99NTzjJ 3Ekb+AdoGNlCHbdzsONslPY+/ulTHC1xslUOT2HO+TObjJfL6yybLvNruGu5 1nG9vrZ+5gPPQllIYsfF/BvBYq0pO446Mg+rN0HlCJil73zOs8i4WrA3Umva gcjxN+aNVme6XDRrTYa5XC7CVf/qy2fn54Pzs7Py9fKgUb1/eO9ep9PrdLq9 bhMtfLNsNxuT2eRiOOzsd5788Mm12KHMIV8sKuXKdbYEXzq9f3+BJsSK1qrT LGt3u9jaZb68f3KyxOjSBfP4a0d5d0mPh2mHyhtYOc51RE9wLCgufatz+X7J zwk9w6f8m7/7G64Hct2OTIJRsVYCnvXUNoeA8z+exAuFZegYWi9FMRE3Sner NR3lnxe4ccJPzADhN0sMoP4m8oxIcpWPJ3N0NPcT4PA0fneO65dl3HnQqp2c HPUPukQ4ERtyD4/gijNhQ6Ih9+DRoz8zG9Tnc71/PFGo1O33X42HYf9ps9tu c+Q1T5884W3BN7KQGw7VeesNYeEmgtnNzGzPg7bbj9t0y26r/Jt/+BtjdRGQ pquiR3GHKFiQjWe6B91b7W37l0A/2Z2EiWu2PAlFt3WaZqvdZjCmT2Re0nlp PB7zh8DBWh0KEt2IZOMxbh/N0NX+QQtyH+hxR7B4hYQ5DsYcLq0GEHI8PHkI HUENdMOc0Gk+5nqt3R3PiVHdnzwnyBpPJkznnz06abcOghluUxxKvUF3vwa5 3Z4Vj2Q7fzGL2yNf7t0/7CFo1+vr5WxpbW/vZYX9aaCw2lC8UmnW8QpKzUYT SYLdZtNZfp0v+ayXPIUZWCKc2JdlVg4Nhytca3Y7HZ6oIZCVcgOlw7HSRHvF ESOWZROewpumpdkMHQtsvkQCaQynebFcXgwu6BvaA5XdajbF5gcHnW6n227R 02ZCPBRzQcblcoXnU8faSE/in1TxCBvtJhqmXMnpJl1cLDN5qPhIeDSlUqfT xBeq1ety82uNiBCTR7ullHRL+CcFpuhz6fFCzm+BJ9Yh0BBtUuXZLcXjCspL nC6+DmkHG3LuJmUQiknXlSKfqVAiPjs8rj4FrhrgTcI81abutrYp2gzW5+4E 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 nJqedDp1//jc1+f6XD/e1/v6JLb3zTfTKIwiz/OmyWQq4tXzoihKZn0vmnrJ FK+pZGrKAfqFl0p6eu/Zh7yNIj/LeamDly8/2d1NJZP1k0bEERFX8/ntlGN1 HXduin8lk0kvxWuW27jP+Qfv+VzDcMfoJtF8JPzW84KgkOR3dtOUzuczj/ee vfdT2fE45O7ZlOcnvU6ndXZW7w9aKW86noacxvWCQsBJQSprD+DGkBx0Bv3x 1ItS2UIplcx2OuGNm1srpVK/P8gGiwNe/aweh+M1Wt1VA5xGSW4z/4TfZjUa ruh513a3t2J6qFkynuCsTDwxmyXi6bkcZxwVT2jU8eQsmjHiqV69WTyR4HU2 y6TjhUIhl8u1u+18kB/0+5NJNJtcSNIRF0rM5rMyYyBcLZFMxhmT/orH0/H4 zL16mXSGq3HfyWQa5yzG43Egn8RTcX7r53JBJpm5mOka+j/uZKn3K8VSt9vj KfM5PxOfvTx43my+7ndaXCTIB6lUJghyPEUyk40m0WDACGeDYS8Rn+Vyfqm8 GvBTDIajYW80yOYyv7SajebpxsZGs3WKZMPxhPngttlMmrsx1GgWpX0kOEul GT6SSTOYRDxl75PX7t7ZRZrINhGPZ5JpPs0k4zGeiYlAXskkj5zhkfXMaZ45 kY579gl/pTKp2Sy2dXMzFkXjcHI5m3U6A0bG0/MAMS/RD8c+kuLJ0xkmiqtJ mqh0PI6uJbwEcoxxGWStu6e4b3wW45hMNpPwYhqoF8/6uTgSTfs8SSKe1DjT TIKXYjLRR39h0DnPB9n3c5leu7H37Nsw/CWXjler5VyQG41GqGG3178eLI/G 4bA/rK5XJ1HoZzKFUj6b99vtRq/f4f6x1KxcLozHw8lkVFpd+eeLvfLais9x Ga2bNOojbct4MS/JQKUZDJMxSzY8jeSTzDL8a7s7W9I0PkB271YZR7k1OF/o XjLO+4hX9JRX5kc6zuPOZqX1tW6v9+LFi+JynkeNosmwN5jMmEA/l5ZOodEc b2dp0TIf8bm2chWnifr/6l6caOs5Ppsyf5yQiPvpnEZo6zybzHKWzphFaLp3 MUmia773un54cPDdbNJbR5R+6vS0PosmLJpZ5MVmsdGI96VisXRcrzPfiAnd v0xEvp+eeeEkGgWBf3bWWF8v5/O5w4P94sry65N6OpXM+QEDjlg9JqRUFtnZ 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 9Fl4vYzrdb7Hf8vyFvwvjpZFVPfvcIeEGy/juO7bx8Xdp3V9SU/yl9dPCTfi cq7Myj80tGUU11v8E8eThd73BXxLvzSIbNniqXGUFctJkcWdFo+LsiwJ44mi BdfWNbWEOXHDVjzKpmmnw0e9tNfidkmr4OvMpSiKRVFMJz3NNZrwXyvhi9Pp ZKEhFUmi9ztpOl0wlixbLPiTb3m+GXOsnDz/A49i1CJlIOt//glkNenCTBYQ lJtAUBMikIPJlST2X+sfvltkd0tVklVLxaPCb1FUFPOCMaCMT9d3CNfouaLP otfvt5JE12jexcVwxOwTSNJJoymjikejEZdC06gFTbkPsxTFlyZrVo9aWls9 hav5OE1TZqf//HT+nXgookYRifpxNIK+9dh3YPgaG78ZdmA4iJC0WgwnYyiL RZGxpovK2R+/DBML7BF4ji+1WFG99jvwY+AmOC7Ra4gbWFoPCgTlfVGFd8QO Jkf4vSZ6+f7dPuCrGbcK/O65ePG4jUnA/9bjCcsZ9Xp97pktMmi3gCWyBTfv 9XqQpsV3F9lwcMFdoJcWJjAK3GkOWsDB3oDiXN6BEHG0c3DAEPVdkSgaZRNW a1GPklicqNHwp5czzNLsxbUibtrqMAR9L7AjA/fvZZG9o5fsT/+YuB5DmJ5e a6+KiDA8VyZcyaK2fAnj0XP0GoKKJn6tDSj66bcXXzziD/w70gg1FC8A96yz ePzmntrygXzaB7qnxyCiR6PRJAydkSyYS6YdJ0bTxoQEfKhRFWJEDcaPCuOJ tXAlw/Oa20FirjIR/C3dl0v4zFysa6JoNJmMWEA/iDvw72jCavLexAxVfi+w DtdM/FOPW5W/XvwRmaAvsSTm0x9JT/NpPeq0OnWkiDdU2Oh3NwqvS/n7ljd/ xKeBL7wAb+VpxE6RpAr7IJB4zZU8JFsLFe0ATUlXRIdHh9r4RTG8GMFAcGiS aOMi/kyUYjga8mpZRzhIQMEQELvcSeJNXQWfsqZxyv/jg35fO5IZWPojMeNW nW+y0qzaaDoqFt4rpT5YLrIpMpTFayUsCPcOoqDcl8us4NNOryeaahIW/BZs b8nqOfOAOtRkAuVyvp08HKEBmBW8Vv4jSJzyYV5/r4IUxPp1uNOPfkzRIDqK Ys0F3lYe1AKanp6c9Hd2JhMxOZuHf9JeD8KVOy5bJHEyySZJJw3qSOTwlCCe FYg4yxyt5UG0sed2en3e1waxKsumWavTipIERbOIloPhUN8yV4aRw7RwHvss MD0/C209fZa2uLO2FL+h6TcapeWE+U1D0VXW6RrLcgntE+/6Bffw9JmKeRg2 Qtqa8l7Ptc6yBCxHspawekcyWu/DKa1Ygt1PYM10A80uDFG8mU2mJaRAlU+m k2zR7/d5CtSEPc/OBknaGaGmlgWK604lpJ1EOz38FMswh/DEcsnZ+OZZdl5/ f59PeenHxtlo2Ep7uqzVyqLiZHim8WRQWFSAlPpfGPQSSmSSmjABZF3TmDeT Vmfjl08/WK2q3LJai6LVUq/EZdVilfPOapnH9WZcrSbN5ipaVYqbqFpDDFR5 p9GI42qtWatElWa1xh9snDiqxK0ag4gb0SqKGtWoyt0bjajK63hVXVWr9SLP GXee5zfL2Xw+5eGVWr3VSCJuqh/+n1RXt6tbng6MaRS8fhNN59M0vV+rxnle 1JrN2SS73+1Vm805tN7dq9XjVVRZFUW7nRR5Ua9Gq5KgmgsUZV7Vm6hRiXlR K1bFatVMmtywUW3ySVRtRHEV6miXVmsQj2EMr0dczbzarVatyiy5/arZiPk3 fTdpNpLe/V6b520m1dtK1SzYrDZmWbbxi0dH0Isx8DCmCO03680sn7eqjXxV dJI0m43baTeqVCDPbDqfT+Y5S1StxTVGlhezm7guIvJptFpBWNEE2kHWKmux qsYsgMjEWKvVJu9keba52W40qtmbLGkmabfdilPzVYNVLX9XW6zX6pa5x5vt 9vlwmC3yr7769/H1hOc8f/5tls1en59fXl5OJhkDajWaLFijoQVDZ62ymzaL NM82+T3L281kNcvazQZMXq8wnFVSFQxqd7f8XPZHzhhZjKhWrzLsRpwXeVzj En7gLHFdlucNPqzBJKvxfJLNsu2tbdi/UWvC8mC81aoymU+bjdY7sBacG1Sq wEcdvTxB2iBjWyiEyaSFHuCx5RVRJ2khO6yatUuADIgiayk2tRWnN125+wyb /Sbak3+DLGGLTLh/0mKfajOV34qmbwWG7s53LcqAiklHqGVZHL53iKLnTdRU p9MThI+K4XD48vgYOcDthc6LqMP4pgv0VzRZgCVO+HQwPPnm+OJ0ODkb8tT6 ouD3+ofdDVkl8zU+S4ogYZk1w5Wkk8RMpbgm09FU2hVqIlmlh0xAqJK0YmAd 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 BHnuOY7XaARR0FhtkiDI43icr1aO7zS8qNs9TJPc8xv8kKZps+k5uS6YJ4nj OKvUyR1+4T18eMiP83m82ax8J/eCYDxOGs1o2OteX8e80nTFBYPBMM3zKGp4 jrfKU99xuoNunueXZ2dRFA0Gg5Q/Ozw8T+exfsyT09NX15dnge/nzkYDdZxh d7hxnCBq81PUPtwwUs9jtEkyyvNks0oczwv8KGp2Hce/HMdpvtrkecAzNdT8 4eCw3WvOmZTGkDMWHsqfPM9Lknmeb9rt6Oxs1O0yMIehvnz13dOTkzgZv3jx nMscf+NsdL29dM+tT548OXtztsqKd2ej/l53msw77XaWp5VKUa9X0yzzvGqR OxXHqfl1nuO47mrFYiZ+lZdTr9UZwTxd7O8PgyBiiEk6LzZ54FcXy/kkjg8O Dip3DmO6uRnnTtFutXu9Xr1eOz7az9K7Wq3+oBV5bnW+XGVZenR4yFLO03Sx WvBNfltM4gnjSaYzp8jyvKh5bs2rel7F9eq1qp8XRStqOa4X1CPfb6yLrF51 8yJln7lbulzG47hw/Fq9sbPb2hTuX8dXy9k84w9pWvPqfrXuFO5iseTWF6Or QsJxs8iWYSPM85TvD44e5plTr7tFUcziuNWKCid/9b9+KIq1w6LYlriuy8D4 utVut1036Ox1gzBM52m2Sr3Aq9e5rODKJEkYUdXx0zSLWp10lTlVNwi8sB5M p+ObOM5v81oYOI5br0eMfrFIXcd18vU4njDSvd321fjD2dlFENTZ226n9+jR kcOWFHdZxlbV6mFtcnXFQD3XrQX1n16/yfMsjKJqtZ4kyzDcjseTMEQWi6zI V4tlEPq+BhBWiyII0aSiHgaM0fNqeX6XZus0W7pulmZp1SmWC95U3BZF1a17 tfBBWI+nkxVLvF773DEvuL8f1J0qEy3CIGh32eiW41SYh9cI+r3uIpn7vrfZ sJrOZDpptrbdqjMaXcymscsskUbWUV9Z02Kr1z9Cksfjm3bUiqfTx48eMw7W eDK5yLIcgczZ1nqAKIRhy/PdxSr78GE8m8eIQ6sTVZ3qfDpdpovlMm+1Wohn upy7nhOGoesUozG65uzsdblNu91CKhdpuhu1qlWX/9in0dXo6Piw7tffvn27 TBYM6+L8otPeq/telq7qqDNinkw7+3vzm2mBuHlu2PB9xy3u2OlKUWwY23ye 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 eRuAxpMeAdJoNHj6bDoc7nQ6+7t7c3Ob0KkPHqpmQYbHTJrPyrxDEX5Nfyct KtH9v8LnExPkeYRPH9z7raNAMhxXVuGcPyTWhUZYrYgRkPasHNfOz6erRda/ e7fEsJUqQsc//qZyVRJ4q92epRNOHv7h96VVtr3VOXn9+uTNm//18H/873/9 17dnP68Qzbfjy+mkEpWi1dVqsWBKyGq9Ur17+/Z0fHa7vRVnSHK5tFqdnJyk ixQlUiEmiOufb9++27/DNOrVKtEFQo9vj8pSGFIm4FjWaib//zFKF4t2u+lq Ag1QNb3mfB27vijobygwrORZ3Y3UT8iruJvnuLRTZfjMFyjYCSRjWUn74vCg pabdXnen042zdHx89P033zx/+iTK0i6MT25ULrP40uyFeQrkVOZzkijE1XgH CD9OEsf9nZ3dbpfr3Ly3t7O/v2sE1BT0lNHf3f1Afxduy1AFOptxCikXp7zz fyH/RTnBZGatId3i5XG7GZIg83rZWv5N0uB/7DDZACaEwrt/7x7PdtqNo8MX u7JnA56HFwnIFQJ1UAJ4gsIjSgE54P+NRnU+x72TKMrJwZpmGTLCyWQ8Yrqk dT07EpSx1K3Jss8qHINsG5HczzP5t8vhisMv+tvJhvwIZ6GwUegC0ya6016s c/O3Q0oL+ReqDR06T9AFeHg7/b44ZzIhBVmdp3jrhDtff/0IUIGHwRoA6noq ljowNaYPziKxoBFp2e20h0eDI2Kk6cTMBZ4luU3Fl3gEyjK6tg8UXVv7Nf19 bjn9jVHsbjNvnxj21pjbwNk1LkARWiRT0N8wmut/Zz9yGEY4VCOBzVi8B3Ma Y+PzoMMfP/4WL/j506f93a47JYiAlcaWgIfzN0nHFO8QBqxiq9OG2ph6qICq xTVmbJ8DcTJvBlM3Z2XfBj2vsCfY+aIqaRS0yealMey/f4QRk58ck9fLW3a/ 8Yofgv9nj+JpWw5HMmnxLewtc2h+8NOnTzByOLnDweDJDz8Mh8fgiHgGBJFK NjRlMALi4ITA1Us6CZhgHHLaw9HQJo1Y+Q0Zgy9V4XGl4zY9qAPxgut5hcac e97eUew+v1Mq9w6o/7qd9Iu5n+znjZwXAhZdxvy1jr/wqHzvDOIDCQkABR5i 5IR3vx4cWgTAu9PT0YgBoCJ07nQgrVjendgdPL1OFyww6SQhF5Im7Xic4udm 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 jvt0Br7LM1CM1K/btz++eu0dOMFetzvMsg/efx+TJiaJdqddmYzbhep7P/lJ VpjARr7Lk3U69tMZ+G7OwN+EjDApjOERfECa2Lhwod1u7u3t9fv9Xq83GU8I qejv7RWybDDocn+WZd/NyTod9ekMfDdnQGyCV6Va1bv/44VRs9KoIEoMh/1K tTAZDjfv3i1Mxny1ubm5vb2N/eK7OV+noz6dge/gDCQ2kfMHzcAgy/q9rLKy 0mh2Vtr4QSaddrOztVe49cF4915nvdPptPu9/r2P7xHejRnjBZvFqf3iO0hG p0P+656BxCaqSYzQYNEwiMvMur2s34cJVJuNPuGZk2Fve3fvo7uT25vNyaTd gYV0ev3ex9ube71uYTBPBjn1pP51U8zp6L6DM2A2MSk0GifiqRAuOhVd4TpG C0VTVJpLhWpltz95//bj99/P+t1+od9sNy80O5Nettl7PICtDLByfgfn8HTI pzPwVz4DSZqY2O4Qr4pfsmviGc2G2bCANDGsFgZmAcNJv7C13b/xfnu7W8n6 g7GMF7hCelm2ubVFCMaANFMHWSxGXfyVz+Lp8E5n4K96Bv72f/7P/zmdFvb3 eysrnRhpvdn87Dc7k+loWiq8gkxRKjcrlfJoUpiOhtXp96ulo9GkUSxOth7W R5PO6+cK9XLpeNyfTtrL7Ua7eXDQe7jX5bf1chV281c9e6eDO52B78QMmE2U CvvdOZsAwerg4OjRo70CaFZTjBblUWlaGT0bDvpFmMbBpNCq9IZH9WlpsrPf f7hXrJZrb7xWflaeTqdkhdSatSl6ymhCm1l2VC7r+im/+E5Q0+kg/0pnwGxi Al8YnDmzPBvj8+elrU8/GWaTdquFElJqVsuTUfMwK02mg2Z9Opy2m83Dwigr TYvT0eDR/tH+/vr5dXyqtWppRPg3YkS5UCnVp6Px57ufP3nypFarPXv2jPe/ 0mk8HdbpDPw1z0AeXrVgm2C4+DxlnFAk1Rg7w2DIH0o1xwZBHFa/3dwuDAG9 mjQLQ4Iq+t3K1t7t997rb29zAxykMJ5kQ5wj42qlubq6iihBsBbRFmDzDhZ8 In/N83o6ttMZ+CuaAUkThemL0kStVuoeHR30Dqv11rRWmVbRP6ajbFCaHJ/B 7zHJytMKfOB5uTkqNwv11tPRtH10uP9ge9Tbf7X9ysrrr5XKyB+jKf/V+TFt 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 gz8kqWHQ2klvvT/he16+d2/z3oOmzYi+P7olhtZGzIfAKb3CI+Lze8yATn9q r7INDEuhFRt2nDG0+dbeED/j+Hq/VnVcwdS+nDzXnZXW2k9/cqdc9occ/TEz bAX0uUiDhLGczli+VzT/U3M4zGG6JrAU+V6XnnXthw+HbLHNNvc1hp3DUD5N pZJ6YnpARaOyWeKV2Ved2nH9ngyKGMuVtbX8wgLv41rxelgfa8uNpJe5/2Cz 2z1kX0XQi46FDx9+t2ZivL29u0HG4U/0SDeYX/XtNL+VCWnLv5A9IcZl9WqZ 2+rHLhL5yOl+yGobJl1u5o9//KM7d344Ww6//uLCrk1vNVtCMn758mWTr/SX Dm1AUhuXX/Bs1hzSTHXBqX7aG5L3MTsf+zj+4/T4sSpSsISNwfunqinLvIix EGu7toCZuHlt4YfXoLFok+YDtMHjHTYV5ThL5Up0sGH+5U77Rx+VD+Xi6RUm P6hB4TCvlXLyOGUp7APbpwgrF/Yt1v+020hq6bxQYvv2SvNoz/wLXJzygw/H 1zbCm9COetqb8MX5nC/+7GeP7j1shweRjs8pG+FPhY04hU2ELZ5aujQOOuMX KHekwfCe7yPHOCf8F+8Pi/0NPyK1RPkKmjbsAIsrjf/3x3d92+h9my5XeYHy s2JbiefxVEf1TpnOwDAZYd9jH2QcfN3jZHNrvLWdednkUuxBFtgC2bsYVXg+ vJXBjW8Jh814uTs2Tr9Yd81+Bxy2/PICrWcyC402O2u3e22NPk/5blsu99b2 1qNPHywvNx4+fPgdehO9Xo8tnP329MT6Dc9tCs/98e2j/vbvAdfs9bqvXrGY uzxhRbZ7baY0N/LmzZs3btw4r/NMkh4Wg1Ha3m7ibsgH6eKAcJP0DdYymm1U 3uWkZSgflXYQDib0rtjmTz1iFwplZz3Dy63VFplnt28u3Lix4Hw4R7Yzrrek +xZgjQ+iHWj48NPxh/elZclly3NWJKhNmWAr4oVTXoA8i6mrM/M1wjuY2Q6v vZP6XU/gmRk5sSz+inz+3o/zP7wZjqPPMOIanbH+0frn9/L9+1sf3t8+8Qvs NfBe/lM3thMPwt8dbWhnUdvMX5t64vE906gw9SbC1oS/msYdUws+2z6+4VNg FIii+dDGxvIdsFiZidSDSC34mXme3qTwJmwKwlZHFKn7x6fSJY651/UnOKtY iuHWFowrvaNCDdGp04mpANs4I+/sG35E2CV5cKlPlh83GvmVtXGjlm8sYBQM AHRXVtZevXx57z5zYPzw4efnuyzPBB1KIki37uL5fsdf+9HIXYwVMTlmsuEg bLJH6HuvH1PbMR0KTZXp/J7tvbGreKvS9KuhaPOjOxuYCYJQiviFSrDs7Pfy CNViFUyVy5xB9+cfZu49tFsLz1d9sbBGUOGMZaS+wNTFsWc9W89TP+JUTJFa f22ZMyQiHPeZN5HaHfAUh0T3fpz54U2+zV4DWIoc69SnSPRWwhG8CYKOnz3Y DTySv8a1aCy8tGYe1iwq8dc74ohrsK9xxjqkr0foXz4103y0iGJkcFIBj+lZ hyFJf04ttqrn3r25duf2jUOcsrh59hEcRaadRPglYhDGA6QpQmb2iXSH8Mjh U+gOCXEQKCEDyWj0uuOtHVmKVxj9IYF73IMkrtHf4uFTrBQ+3UmcOI2q6cPY OxyyC1BbXr62sXLjRmNxUZF6u1tr1AhDgBE5jIOO83ycMRNgEOiS65LO55Ha 3fM52H/xKH/KcxCwggXptgmOdpvbQ7yPV3g7TCqkesTF9BS0w+y9KDalmDF4 H5AF7965dvfutfG4x6Sbhil6E+5MGIsANPTZn/wk83BLqHFaEs/SHDLnUqxv GlmceLOe6oFN+Mgp1hBRSRqDnPL2dYYn3sTZFcYnPrxbvnPbkZFWlydQLEI9 0ZLREpY38U/3tvyW+JPvTrr/T6Ow2ecCF0hxn9mqPjF6HizHegr7yilCkaqK BopphELuXCz0k8OdPOf0hgn+m78twdm/eePatY0NXDJZJeydb44/CiZQGQoj 0ymiMSS0ISwCTUA9noEE+45qyWsr8G0VzoJzSGzY7o0fbg2JQchTaPxjFL5t DU8Mmg2jQCzCGQ7H1zMbMEvoc7979/bF2jJfhKWAo8nP+/fvM+U+/w+CjvN8 nNHCfI1Kch3FuvNKpZzXcf6QC/4vnwM357/82fSEGUnyaFBhGo3q2ur6xvrG rZs377x/++4Hd27efOf6tatr60sWaFMrnlECrMCXUucnlrBy7qOEFjBLS3XS 0lEtfgAxczgivmKS8DtkFlpretGNMztbk+b+uKL+t3BHRF/KZ6EooC4jhpU1 VEjdkQKUQIfY5a4EdwUKk9rVWVHTEWorKTuTLurSqnKthzKOKbc1tCdYLVbi YC1dXcuvLIVShzZY52udjVZCXRlQCfAXd3aauzstpUaDARGmJIZZH42id1bc jDkRqiSsp+Ck6HPwWczR1MemPEurYGljV80r71H9rvK4StCKTSvypn5xcciZ n+73rbeJkuc0LEEl0rtL8/QDK1GSQyYbxpM6QZm3JiKHctKqI1X9ux/QKtKu DVB+oEa6HZOrBDwk8COsfEnZn2Rn5uvZt+rjEd0roTCqKY871Ef9vvs5uDrW 9yU03FSz4m5MKrUe0HqcsmgUOpE1z+Tegt80HCKYnK9SVq6+dsVy+er6xh88 ec8sujNmAjr27whMnMMa+kPW/h/js3+ojTh7jt88GisfIt3C/Px77129ffvW +3duYTuuYThWFmFvDGnzNz5Am48dCJl2mLlsEVQRUvhDy0QTwLPuTMn0iF/H vaf/Rv3g1wC99KWWwEOW7usDiFqmW0DiFadA+7ZXF1VJrqwxT0R8EwnRmU10 SnHTtQbub5Sq2phXJi08N8qK52KL4ESsLyG6BGHGVZtikfKqU/esFGwcR4WM mt3aer67u2/6R7Ab1NcvBirqAGGjmOIvURfoRyZmy6SlNkLPTQjRB7TyobKJ BQP7wLUCIVjD9XmNuYjIytqwpjimjY+Jt6d+IjdADaHPKC6NovLiy709xMBZ b9HmSXwYcEf0LJBPMaPBlTXic7s6geHPSp2kgI0OpgY1waJBBOMDko6KhOUJ jHPHuQEtha7UlsrqMdvrDWxTOSfzEmEk0odBsVVYzOnP3Nw+lpouN9a7GWCH eGenU3rdQ2CTHQV1EI5BaYmow8fHa5jskwzWOayW/6KZON81dA7X8Rd+CPF1 6RNVrcwvzF+9dhVO/p07t2/e3KhKG4zpmP3yy5dJgszK6OiIolk5fFgHCGls lax91mrlde9ZD29UzQfMQaT8UASrt3PU0THl0spdk6HVF9faH1KU7ufGR9JT UM2eGmvId3BPcOaqeZlQvuCYnfAp3Ckv/Av1K52rjjL9cr2Su7qeyV8wz9w8 J235uN7seVQMQs+bkDb67NFmh2YuWudo8Msv8EqmQS9FFnzJQEKrONeOEaKE RhqZwVJlnbsUVGFK1PLaswDipDGprE6ZPV/VvTYgcMPMf7VxwC5QaCQuphnc qT9i34EVp4jAOl3yTdQUQxSsTru/svQ31VqZnm24CBywJM1rqb3rQK7QU77D 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 znrjgXQYliTK0IFUsOLDqR7ETkLEHU4jXAzZblgZnMkwsdcwzYk4T4x/Qe+F fPkiPUvp1FBu1Govt7ZwlpZX1u7+/KNzH/ATM7Gzs7u87MZ5bx5vRuC/zQjQ UuXDjz4CvmBJsjjddanspMZpSrcrTaL+whGHLUVwN1PjIZOSRiXKjDq+IAKg o6SKxyA3K6C/KEBiKnMVxiJlo6o7rw0JW3W0dKNvA+cWdSKunVNWFWgD8plN CYboIl/JP5iJcqWwDQLz+ed8/O5HH5773TsJOvb3X6tcz8rLbx5vRuCvbARY wr9SRBZN36tXr9IaDuVRGBnHR2M08QvZ8eEBgqJECWhMGTXE0ycukMZE6FyG xvcoOgNYKEdSwHxqDoVLYpZS7oDyeOlPzdGGriXtuaNK5UK9fkkayG7FXiyW LVmorblarVVq1YYkpyTn3+nTEgpeSN+an6jOWN0Dz6IrnWSMzurSFYSFCpS4 87dSfkir+wEQZrOCtuZ5kyaYCSfexNbWztra9984E39ly+PN5fxeI4CWwv37 YJ0P2ddhb4mhXVD6AxwSSPF0f9NpJ+Q0G1JQIbzezn4vv8O8jMiKhEfAg42/ sbCwtgLGiWsRnkV0nxXmaCdC4Q71L6Kxu9YjiOqOSshoIDqTARZoNBaJNeJ1 OpLzjfyp+RJu5isYHHc/PH9v4pSZ2NlZWV4uv7ETv9e0evPmv5AREN9pmtf4 baecEA1sbjVp27u1va2cpiIRrWo90eKeHWAWcaiWxF6G+pvjTBAIXGzUVlYW FpYX9EGSE/BHqVeBmyXBBhmRi4QKFX6WSa+kmKDzpbPAH2sR2VngCNIdTtNm GhdrpnIrAMFycXDSsNgfrVyjGJnvgCF5YiYebW7SFe23jeCbv78Zgf9eI4An L+bF5ta0IE17vqCKaf1YrGqgSnokUBC2TPPf340ESakbH8R0cMAttQsMLFVH sxuiX6e8TDkX+BbROtuJ0pRn8ce5GWfMxLVr194AmH+ccX/zLX9xI2DqJhUl hAS99iuITJSNVmiDEBjieWH/5mVPS1iClxnwqVfmrK70jzx6J2bi00ebP7zx xpv4I4//m6/7Sx+BdBX/pV/Gbz7//+vUn4Pp/ubxZgTejMDvPgL/Lfzv/x/o nsNx/CW6NAAAAABJRU5ErkJgggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 uafvFbKl9/bAcD/d3oEMwHd0SV1/A8RduXIlSAwz6+EPf/jLXvYyEsN4w14x zCNwmu+nt8Y9O23PoztLOQ2fuSkuek8b2Gmn0faao9b8y+f+5ZRTTy2UmjNT tenJ0sx0adfE9JYt26i9oUkVmgrVRhO1QbyXWh3XtwGoKLlANRK6++nBVHo4 nRpAmBIpYwK8I4Otw1enhgfFl2Utop9KTYIebfrWqeTYD0l+lDi+nWqtUyqR aKRCJaawdCYPkFhlqh6oZc3PzlEzc8WVl4+ODp999tn/99XvTBc61eL4ZT+f K86Uy7VrPv2v73rk41f88Kdb/+Ll/5LOnphIHIwcCCnGgcFIo7kr0plv1mYH sonx0bFjjzl48eJkJFbI5Zpyz2KQsFJq2CdwoJpWrp3naMHtWDTTaWUmdjQA 4MldNdBaLGiDNJd0tgizANgylwa9cp05McW8PWEM7pn7iwkA7KDjtW1nwRqw manJolZgdDwxMpYaGclQc+z6cTYHJQGstoWirSuP63QpI1uJh9UhN1+eJ5Ur YCNDr3SPphGycXD7mLsMNqohYypBoTPNFvCnqyRf5YvTv4i1KFY28prNzxQK ptKKlG23m5+dbW3ZMjc5MUeo3u4py6zbHA5nv+cxsztOXRoj9EgiyE+/wkqr WVuYT+u6C+VVRuyccOjQkUqpVilVmZrH1S+SxHC51Z6LRCZNg0zmc5RlZ24w fWb8c3uoytk/Ch+hBe62BQ7YHPAfsAhR6De84Q30RNqxYwe0LEShKQ4mMUyh 8I9+9CP5BxZ8BoltyAsfd9MCDNU0CjRSK96nWtJIPIPgKoIIifzRDzjx7e/8 +04kc+NNW6+7YetVV2y94caJW9fNrN8ws3HD7MREvVhKlSu4VSMJQsSQpIbo frRi0bJV40tWji1ezuvI4pUjo6uGRpYNjSymwezwSG5sLL1oJDGQiyFVYf1y GG0VOPUcsPGE1dPW9dFoAV+rNKqVDl3eRaFWQQzAhpal5JX4qFCYM8+MAtn8 jp07blm37vFPePyO7Tsv/s1ltflWvUZHwi1PfurDDjl0vNbI/sd/fHdoYGW7 nQY2pLsFNs1uPv4BKxcvau7YdjWB8EWjmXSqmc+ThBYpymp2hAvO9rM2e9KQ UKWNvhLTCrnpmalCuQQx0JQmzKO0/yU7oSX5yOYyLgapCKphiVUA29ICYJdc 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 UvZIplOyne4WbhEbBCQu1rjmqispa0Ih1bRczBu2kWZ/Hx1C5Ny7FggB+E7s 6Yle5KCRpYQFQwDQywQf/vCH/+53vyuVShqTbMYd0ED27hW6b7cWZFi9QDYY MoAXEm+5d7z7Q2ec9dhIZKCGmGMqOTPVXnfzzrl5IpGdTJZ6X/m7HrmjGx9O noZw8Ublo9DLrVSe63aqCke2s4SiWUvBy5a6M9A5GHV7PoRiWirWC8VWSxqW A9Eu5ZVK6FrPe8ZQJWhtvLM6IfrBIdDRpaWg4rEa/gj/Sj0rK7aWjYwW9ZRP Zm60JgZyiZKtTFYiR1RTWZAT7qui0OZkL8DnQgM7amikiNltrT288fRnJU47 I5fO0asOaWjwiqoVph1SfbaqKkc0JzcJpfCOquXIru3F7ZumZnbBiS41pH4l Ehb1SYpdu5S05hN0w+UTpiq1DELFKr9qjA7nsR8Fqhw6RUrDpsbkLX6ZGlYq FXaFMwxbGQ8YlZjtO7Y+6MQTnvWMp/7oh9/79YU/OeXkE4467JB6tTyYyxJP YEcijgsH7DgtsCyUIUoqKhrJ2QgeMAFVna+1J1o4F8+m94LPShkISZTNhUNF 10D1aLLTsTmLQ7CRvg22lJ23ImgLVFg8RecM2YkjUSRfvQ1grrWQN4O0XO/G IB2bXGQnYWwCxEcTrXqGEqQyHRmQN6X4So6uktBWyiRGsqXbjXVNG+F6vQil u1CdnSt7aa9aBneTzimTRFkXcpbnKaTP2e1U8vnO2Hhy6WLNalJJNSX0VsJq 0xWH6oEFmDNxHrFSpYkHDABLgjMRxf6ieTMJM+lvzhn0X3fTzXPzU81WVdMb w2DdQeJ6h4/QArstEALwXbob+B0Sfybvy/z6Xe96F66wNTxXWC8INmqo2e9F 2JXWsmm6SfzLRfMhg44IA096ygvf8MZ3T87VhkfGKo1IKheZm41cdcUtxXl8 DnQS1KjV2/oKdKmEaVQpf8FiVTCn1ixX6EDH4MlQle60MjQrZGGpJmr4ZERM MciSE9WArrhiPNqmwVwuFh/GcVF2Vglgk07sAaS1TwB3Y/WoBKKlEW3JzVQ0 kjbyF8O3XVyjUFk1i3ejEwAjtJzJ6hQicQZiBlY8PlKxwcatl5JqXlUxbLrK jNGtQw5vPOXc2Mmnor5ZgsBF4TiKUQSZeRj6LmRJewAsz6vZStQq8emdlR1b 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 EMEAMzENBmki4jjfybTl9KROxX5AGqNr69Rdykqnq3wVtKiavNv+JV9JkDAZ pBnmIylKnaQqBpkfXucszFLhQmtAsW96OtW0McXbberh6tPyROgM4UO5w0DT As0q8P6aCIhJYCpcLSEU6XWrBAXnw16TzJUUvHT3PqN+q7V0WfyQwxLLlsaz mWQ2jRiLOXijdB3FMk25WheuOvOUXiJhnIatd1tlloAsWJvT0HurSvZtDg4O FkslRE5XrVr9uCc8ZWR4DL+0DN/pyU9+8uP4eIYGC8uWDHdadWoMk7wE7PMU lMtF8Mbno4almvYZXpoKFbrOlvDj4uqehtTrTOFPItvWbo36OIFVIZqxkVVe 0HJw7aU2965l0RVNPhqtbqWYnJlrooTVlPeXD71/h6m/JsTBnu1+aRpE47WY H/uz6dFi33tkVesYFiiOT85UZ2YrnaYFSuRFpymrBqj8hA+zjXp3ZrZcq+I8 UOgnGSt2WnPtgJxgPoECaddqNDc7bffV++R1oX3sfXDxdVtvgUUA/p+/Q71M X1I7eIz9TwaKBzzgAfe9731/9atffeUrX8EIZmz69re/fTNPl1EsFSQ2j489 vNZcHc/0t7ooLKTxslGHncRNzd0Z/1CTx4XWkSijCFbyks7rSUWkJ5lNrvlg /l5X6jAxATkjVXjNzk1+V6GpxgtLM5W3TeXrJW+pr33I85fxm8Koqplx89zX kF1jReb8FQJwONZYDmvPR22yGBHBKPrBvK+Ao4AxlmhrcCk70tJpsZpVsE9O ZQGhkZ3CdQ23+p3Fp10L2kofoVIEKJq4YwCDWjuxiUS4c2sHm0Bob3JZm3vZ 2kxgys8oSsHwj2a11K0kJymvp2Lp1j7mJ1fykut8SZZEubRS/ODdjmhAaMCs v0wLS74Em+5YHEFFB3V3w+PadIFpg1G9JIKBXInnG+uXlIzXPKIzPNxeu74x PNRKkxuOSJUSY8DsUHDRNvbZhsGV5gFNehGVlFJxVuQnQMKJQkDU97WT6mZy WSoQoKy6dv2Gpz/92UODI3iN/3jxH9/5zrfPFWdWr14J+y+VaPcV8ggpZ7Pp bC7NdBNI3T/aYvedS7ZqSJjkPCPOSXQAtjjC/uNYOBn0C1QlZADYeFvgfwrf uFjNBsARaKmzOQCz0mwHtXJ6ttgqlbH1LU6hIIJujRVjEDXR9mxxE+sBnp0M CrNuyll6RR5pdV1HY1qakmPT02WyDUyCTRWTYGC4H0illeI5AsQAMEnD1g3r qVgVAG6JC03CPQBshnwIwKy6rPoiAEfP/L/av4sA/D9/x1yl0h9aDXCqLq6U X16IUz7pSU96+MMfDkf6Xve610Me8hDiwTfnjLFTh5L5oydG7l+uj8cS2SBJ DFhET0J8VopOJnWzBU0V/2KGMQ1QjcBDEBKhnZDAXGEmriStSgDYc4Xx9Fr4 z4DIMMM2DrxcoDQiyDaOjGb+dsdv7+UcY/cDh4apgZCLN/WsWBvyPF4cRn89 bKwIupGwzU1oGsv77Vx/OBxGBzXk5jxD3s58XRqzNu0VGvqh39x82jY041U2 cpNGTq7IjGBzA4SWq3JlbJiOfPhWRcqCsla50WYJJmCSQnUsOlZku9jYatMC 8weY+avzNMc/eskcSHWlNPiGj62XYvKztfPWzZTFJvsXvWWLP/jZWsKXtjRK NnFcp6rrJVq34tN9+caS5bVCnuzeDmXomWCJ9BdKgdrNDVvYZix2LHpSJtMe 6uv2FdrZFADSkl5ILIYSFu4cfNPMGmdni7v27OvP97/sFa8kue69730vEd+x 8VEsXRXExdsLFkmH0gLcYmDBfpI6o5+dO0KM7mcWKz+QgLkAWFWahHa6ROYw Cx0e9kPNmBQg4TcEVQXAILAw26sCiwnnJEE/lpdwsCrRtVoK0WZqY8Mdk2eB O6pAvflEDHitze1JsUkJhzALWE9HD4AXmL/zADw1W5uZLls2sAekuZvhxSr6 bwBcnEOxsqo4d4BXivTi2XYw4wBsNU4OsICtw0TTvkU7OHwW/kX+WQTg2+iN 0piCJqRZw5Qrf9jDHnb/+9//5z//+cc/9jGMDCb1CSrTWuZgdAFWrsdGZ+Po 2ngk/efVE6vu0WmubbXGkpkRjWyYLXKpmjkGolILqSULWBm8HsAyuHJb0Efo CFOVhmQDV5oyDNS9NzUlxgWNCT6Eheho9eSdQ2TMUCkmeVmIDvys3vYR1Jmh Isk+xxIbFZXnY4oSCwHV10PD10LJDueeayvbPUY5Rf2kt40GT8+ddSQ2C8IR 0aFIiBG2oQGnjeORR10nY5QoOSd1ki4+jK6T/LoO3u6QtH2Ejmjfndhf/Eqi XQbbGnFNQSwT+g/sWiy8F26vmx66GUS3Dod+Az4VY5CFFhZjCKcIglefuDgk 6GyFIsJHFX6wexkhmc1genlTYWRfKMFZEyGu9g8mhobbuRy53apywRFlAfuc xwhKrvVtfgAf8cGnVjZdXba0sXwi6Ms1sIadmRxekJ2ScmA77b2799WNQtjX 149rGhQEoevVGsFkfMrpTJb9y1RVyqxbtGGzOEaqaa3uEzKWYGStJknXPBpa 0r+06iZGbHNDM3xZR8J5oBQDS8W1xhBNTPI09gp7uzWRpZB7anqSegyQsOo1 5qZySjtRI9qvU7LNuWNtrbtoWQw8qqwYrppJHXrO2cLdOfg8kpMz5WJRHvpk UlW31XHmzXd+lmrUg9mZSrlCWxk/EI50UG7H9gQqEmyzq4j+0DN/RRHQvfce vuiLDp+nf4l/FgH4X+I26STxy5Ec7P4mc1ZLEcKGEHzJuDo1YPFAm4fX3asM KH1BsGli1Snd1kSzNZRMjeBSI3lSwzM2qh5amQcS8UGTVg5LI2HpNW+kOlHL eFUsuBndAs7EOzkDMxSvzFmr8jlW41YRZlyFuF7F3dWopsglIkkqCRAaXoKL nuM3HArd2GJcmy+9J4PPK/0sdBGrOq99YtRfdqn0DZVAsNGTOk4+dzDWsY9K 5gbXiajFdDlOFTbqdMocvEb1diaq/g8tacsDNfaTbFmdB+XZLT9KSkZdnMku i2FXY83W82rakK4DyQkapySw5EgYYSkkhQio/N7ezqGPd36K0POrKxFFOVd+ Mz29KhQACW10zpr6vga64YMsXDC72VwRbrVbTCE8t4hh50O2QZSfRqtVGhhK jo4ks3ksX/kwvGyitjHBEZ2D5wIJ7HDoQw5SZb5cprJqdW3Vys5wAd0Ypz1H 4dvwCo0hzA+MW8ScMp0W3MqRXG/A71IxgzI9UH2l0NevTh6LkQGfy2szRzXr Gsw7GwTUqaHEH7ifBcidNvYsXmv390a1fkV4ckUWWZHy8ZhmlfuZTIqyV8XB 20EbRvwGDkTBIkgRphkJDFpKtPEf3S9l0WjFNPwTNbeMbFzQYRkJSxd0eLZ2 C70dmOOJ2dn6LADcgIuhKiC6KlfX0Y2AgpHhcmdnqjSI+ajN7o+VO7Gd3c6M A3A0ZDvc8pfoWnYvFwE4upn/Ov8uAvBt9F5prDXXNA/qox71qB/+8IdeKpi5 O8wNnnQkbUOnmxihAhnjXPrLs3F4dgfiqSMmlh3Xbow3WwPxeB/JRnIuKnPR czsYGhkC65BUXCGvIwBTDC/cjwGqZvPSwxIAiz4kGCDPhY01oBkhiCKAAk5b l30tBUwJd5hrTOUIGSOFWJRaUi02DTghAFtC0Ly5Y2cvlSiSUSmM2NGevdpS OL3nSr0EPca0yErEO8GBUDwEFFXRw9DQtSKJNkjJrAnHWaBaVim0ZPyAEt00 0YzQfnKsikZMAZRjJF5ZmbDYhbCXBMUQeVRQORoEQ8f9guCj7UYcsgbmbzyh IkUGwFjAuXgMaLExE85UGJnmD8XzPArRq04R+q7l2QiNeCFqbxDmfGgXEYTt Gg1ILFJgRG67cToPn3xYQMEcz06UCyccFvuko5WGhrOjo8l8H3nAaiK5W0ND Dj607UdvrOp+taQRIRTGZb1uXWvtmtjYoOoYEm011DdlDPcaG0qBuw7D3q/c ZARWG7UGLK1MOgf6NOrtGdyvVXlf5XhQPlIDShf5wa26qmhTsqHVxj07x4Og wEYinctnUgk8xhWHMX8Jyg2KjYPg/mEixzUMcZsq6aUtIgeMQeW890XCHRZy JjKvkzXta7eALdfIcVcltewaRdeOFKqZlHiDC6HtXGzf0Xq7m5qbbc/MUW8U N0MIwL5nOx2pX1EbdG6WNiCmrrvGRK8bwCff3enOEGU3Vn/0jPfu+HwXCnt+ uMniP7f5FlgE4NvoLfLH0h/mY4455uMf/zjq0F/84hevvuoKfHTM+ZnTa8wl Epak1neVJ2/eG23uLxuRB/N9t+8fPKJZH260CsTm0NjR/N7ceeYklYIP03cb K6wMcIBvuScE3XP/ahzrWKKO1ziK/GZS2PASvyZg28tqk4k5TzE1/7NXMOwG GewAwaeIuRGsOu83ugABsJJR2Fu6DXjzw/3oUU6J4gp6ebptclPdSgatQ0+4 8EbmmqjR5l8M3dRiJsskFQDj2W2H9YB9sDUnrcxkoYRjpLGRTWyTy2gBTsbB Fq0sKsbgsVWO5YUIe84DGw1R62SK0LOA4+l4IAs4dBqrMd1oNuKbzzE8Q8m+ 8txld2AaBvsDG3lQzeD22Uz0YVhImAIBXo/BnPkpoS9TK8v9NXF/O4pFNM2C x8qsDI1kxscyBYQ4knIPuMNZ99FgXh1EzaEqS9ZOxnJvdPoK9XXrmuvWJsYG 4C6ICRwCsPKp3Cs+/4qi7D2wjCGfBfYwoZyZK05PFWH+UzWof7Cvv5+E4A51 OZkbLVu2AgzO5/oyqVitXpRHweAWYASSYS7hhbbnJXTFKz8qfBkvXMUSsFAJ phrrWxNFj9R4JWWudP4kLYhOKSI+8amG9M6iq9D+3eTlyiyriE9Uf9A83OY9 j4DcRN/NEBdzW1Ct6UcnNTsTzMxR87duuwmfce3TxG9gdjcbneJcrVoxAOZW yA+N3PpUuzMddCuWSrcQgOUvmQ9+h6SN2+iYtnhaN22BRQC+7fYKx2D3lWEH fOADH6C4WyoZf/e73/273/9xtjjn5cKVNWux19Df5VIXGs3FwOobOi6VWtOo DTTbhXi8AHYzatqjr/K9nmTCT2XzxTNYZrEYGtFMvc0aizyxQlxLWfF6O+7C Nd8sw7qGCa9duBCA98MhzzCOECtyPofOUcMPZyabuSlqE5FOla8z9ysWsMKv nnhj72YB6yRUwsGq7ZLfoWFUjGIdpXdPzV8qJo65mA1EhYgCRXzCGBNAe5/z UaNfOQ67HSw0NeYwFrAZhao1BH7znVUR1oUnreS7ZiTu9e0d2/Abv34I9q5I ZS5oJjqZaLJhilchALvL0QHY4u6uauKGpytjhEF6nV4Eb/OJNHYOYaSAGLxX bDTJFKCXn6doOHzp7p/3prb9yKI1AE6NjaYL/fKt4FRQzNJajL7iLmhzsOtW 6UeaxtGVgkKutmZtfc3q2EgfblV5j5XUFUVM7SiGV/byIypoImtSC3WYqhVF jvdNzezateekU06+y53v2jfYr9zleDA9PXX9NddeeOFFlOnM5/vGx4YGB2QT Em5l4miiH3ITw6BWhQTrnWZNhpM5qZxYZIEDofBofmkBcOSWD70q4Rn6dMGs dgGwwu1Oy/JW0o57vKpefNfrCZpn2qo1REd3Z3X0khWuVC8AeJpCh41SqcKc wLjZ2q/PWnT2QYJsaixgqpNR1cJzk+StCeY6ckHP0nu9O0T+ILPjvXG92/e8 YL2OuLhyG26BRQC+7d6ceVeeVV7jtWrVqsGBvtNOO23Z8pU/+MEZZ/zozGuu vUpjHdSPyAIWImsYAkFhYC0tDB7T7S5rNQbbnXws0c9AbroGcvMKUHoPLHVS Y/lYnCINPlgLUG247xnBoZXgxpkBMP5sxjdc1uHGvbqBPsRHw67rUOLpFYQ4 Z6Vnw/m4br5Kswj8V2bqORFaH4Uji51JlEpkaOdEqnmssgHIXc22qqbomYY6 kAtYCnrjLWEqWT1ds0cPOKuIDq3zsWAn5rJYYbFmEqQXioeZzZyqA3DvQnoz j9CuAsXiwvvQkBUJywtBUqWHH7qly8stYLWE08JNRYu/VfjWoFut17POw58s LLwTkrF1wpTzsZ8LKU2fJJokheQyx3ihqetDcZRWszQ4nB4dTRUK3ZTOOaQH mwFugCnMMYeqtofRZOlJLZhQ1ZUraytXtIf7GljAihxgtYUO4dDjrN+GpzcP wCAQnmEAmO6xb2oO2ZnnPOf5hx52GDRiqgyT5Ds9M7lv3x5QFgY1pvC5555/ 7TVXjAzlBofy6RRXJLe2uNMSYRb/nNNRz45sbkckx2AHOphmOg01ZuiC9o3D d5v/WSxHVq2MXSVucTvEEHCQnn+FDCx6rZhlBs4LxbDknDZ16B51S9Zwu5ue m0lMTdeLcxW80JKctECya83aScZRNIGEVSkzXfApl9O8y53ObCAuNFF2h1r3 NjsAL3g0FgG49/z/K6wsAvBt9y75mGVTY1ErPWrlN2z1mjUPe9gjHvTghyIc /ZOf/NAfx54FbAE7oHQoFl+XKxzbbi3tdga73UI3kWE0YT8qWWOuWk/elZNW 9KucxVyVubHQ4dkbOp326Q5SQCWIS3jB5CsUYXUSddSanlxkL8Egtp1jcGQm RggXIYE0lRZYSzoB4zpJ5THc1QLDNrThBF1RDUQdWT75eDetgLSPmD3VaSkW WaScYVqhXJQrcGCyQbyl+LQlEFvlmwgqIv+/rlf6WbJCLAZMKNuSngBgcdbY 5X4AHDqQbYD0BrBMJPN4m29WrvhsOB3R124Be0PpNGyIXxADNqq2JiOkIdlk wm+HN6w29cG419hKLBN4M/qH2VmakdmedXVuTvs8JpwGef5ru1UeGEoMDyfy eWKr+My50hSqIeaEYLpl29vB3AXdIuuXb5qxbLq8fHllxfLWUIEUdmxZSAbS kHasijqPAXdkAYtcLRIWLwS4mG+Bc4nLr7zyox/7JOjbqFYv/dMlX//616+7 7hrSmdiIo5KDd8zt71AszX71y5+h16FbOTQ0wD3lQOmUFQqLsqitTcPD9dbd RLWUOBh3YlX1mlEn5sLc4RnrHwBYjnGJiqoXRVdhWQdigxsZbcEFmocZnhc+ bkGp0sDMuR3FvP2G8WSlZufiMzOEvStIbYC1th/9ULdSjRyv11oz09XiXF1J xR3RIEyWvNaGBd3d6wCsG6i3HgDbpDPkQoe9Y/Gff4kWWJSivI3eJrchfETW w2UrYo/YozczO3P++Rd89atfW7ly5fXXX4PyrtzRvUdTm2SD2HAqtTKZ2NRu LUkkxoJYfzfIQoMCopLJXNDBEWpjutSjWHiGKQshtlRPhcPGHVlR4RTf83od Y1xH3iOr8tsZB9kk+eRMNnF/sZRNRc9tcg39nrkr9rJUBW0PEobEEWkZvRJi 5EOvueR7EMtabjfpHpv6sZjPVm+YVBmXaVRJCTP42InJe8mYlhyjVx2WNKML UrIN0VwozQbNZt2Ci+LSYg3riK6maSa1Mae9UDEfAjYYvlKUJDUnBDavAqBr C5OavJKx8ZZV1dgYxBKtdM6XZSJZBVhLlbUhlFurcw5HUs+9UTNZLrUFayMr 1iPBggnZ8cYH0rqI3NpeFyGznvZExlLB4xA4FEfwo5n4pd01Fw21hRMw+NfY Xc9lYrlcN5ninAWuEqtQaQ4dwOHNuoMLhBrtXC2Hv7pR6KsW8q1MSu1jXDMt 8xMFBwx7OXC4I1eikrh6O/FKuVqaK1artbvc6c7UQTrnl+e8+z3v7svn1q1f s2rlyoGBvomJpbigzz77rJHBgcc85tFXX33Nli3XZ7M5J3bZ3NRJzyGGRuaq DmTa0UI4vbwokkuJRS9zDvde6GtqG9faJDmed2M3iySh3bhCpr05pIuKhWmr 7ZHjFNvavcpqI9vGz8kC7fyZhC6IxDQUaz2wkPPIKRQXIlBBZFTC8B4EzCfw sbMx2Q20mQUmNMelq5Dyx51yLwKvnqaNkQMWhD9uo4Pa4mndpAUWAfjW6xRh voENRiFW9qyZm5yFP8O9l/8pDBalSAYxjzMxpC1btsTjDAwhAzr8DQQmMW6G hgaPCjobOsHKTqcvFi/E4lnzMCuwatqQmpQrlQSDyUg2Um3Wi90I3lBN0hKr dGO1VrsUS9aCOBoIc914leqlJH02G1UVGpfxKxhQXSEZiIAi2Ur8kHfgE6UF g0kpKhtkgo4GrsTyxG+yD0PBZNKc5HQ1IWX3dQsmXSLB3kOZxnZMeVRW5AAz QeiPS9lgVTarYT9YoaK3dnpiZrcIn0NmJrYs3aW0Lt9Ku9rLGs4FfGXfuDvY IpamEMkoi5wkv/UiS3wn36BPjTzhesGd1FQjCimb4WkHiGrqsAt4WBpnLW3b yFs2nppmZwRehiY6QTfArKBg9K00VEycWLFW5iWtdl0yV/gg2vLnKqu3xd1B clnO43Qq7bV60hlcKTjSlUdqcwVBETBhBj0TplYq0yEdN5WG+aNIhZ2bzF/9 Zw5/qX35KK/fmhMbmy7V6O9v9vd3silyW2Uwex6sd9feKzLuw45v+GSkAmMU oIJVLldmZqaPOvaYL3zms0DcwZs2piBYKfsunUmlRkeGc9nMZZdddtXVVz/+ iU+emZrZcv0Wzquvb8CJcxbBsDsn8p9mgpAGrZaCwKlu6pWaG2LEqo7hfE5R hKVhxEQK1+0YOVGk5kkB2ySvjdKsOC47Fl6rILGVJdZ3kq0GpM2gB7BJdnJA 14ds44tv32oH1XqnWm3VqqQecG7h8Gv9QO2mHqUbncYnXa9ZKSb8EAbAxg6g MIMr4aj97Dn1l+3nFgVgH6O8oaLJU5QxtWBccl/CAYPVgu8XV/9GCywC8K3a RXr5DOE49JcB+K+cFlo+PNF6XAPY0KQqkaGhhzGT4bnV+KLRIj0UtCdGRm5X rY632wMkzOBkNkKKMMbsUR4sGUwsTMqVyqIHyYZNMzG7cC/tW60HzRTZQ51q q1nMkkTDT1A/iFnlV/gjFkdTSm3PrPTKByGCmrixmW7KahRGmhPbgM3MTROh VF08L2Cgwd2MZr0LzCxa6dN+nyDYJ+5gVr6TGb46c43qRssy6Sec7bJa/KKw ljRA1mtYovlcDkBidMWKMh8uY4ghqw3WGux0BFegsk/NUQh6yyj0U9CYGFXN 07qwyqO8OiUfscJTtpiukYF8rDRqGyDqV9KzLJ3hHLmgjfxlW4SsrpDgtnBi YPcKb2ccNBe3SGeLFcan2WSmUW+AasBttc5sSVYizNqU6uwa5c5Trn3k9Jve aaA+mcnG6EvKA9ZVuFILEz41snm7ZcV5vFwRUqlQk7NU7+9v9Pd1c2lS5lTM wCsJHzDLjGaQHnN1VWcpdEh7NZGq1WuZVPqKKy8/7OBDkunkZX+6JJ/PIlGZ zkhtxpqX4HlyYHBg+87dF198yWMf/djrrrt+anKaW1XI96HLoaS10LZ2C9uu kpBqE9VoTSPkcpHGHMo2LaC9d4PsDvfmCnaDCNO45KQVgbDsMRmpdrds9uIT M70iiStlIhne2m80YdErBGN9DkVLMiMUWghIMQKDVfQ3LF8p69r9KD5dQKa9 VmvJQS2yv+V/i6aI/xsAlmPa+tJCSddbHoB9/HH05Z3Hx615H8H8W9+A180u EtP7/f/5lUUAvpW6QGQB2Dzdx95/CH3laVKpMj0VyVSG59hGMw2jQl8s3ExO uYotcHJ1Pruu3uhD/9myfoBVYaqeYVk8fMJ6DSkrPjdvsOQtvOQt1q1q+2jx WrzEqUilrIK+rRZjQzOf668W8XYqG1jjsxaHRUPJUI7LENS9oLLY7K8QV3zg 93FEoSwrQswQY2r/1jiOu4p6msiFLaETMwJgSywyVLZBUV7wRCap8jFyhcON ZgqPVy/NGEqjMRBn8llAuYrEEfZ6Kkl9+FQiK7tduGiWnt7NNg1Z4m6cyLBi zWHFxm4PIpob2sYou0pZz3ZuIcXJBndF2nvZRHCpbDcQkr0b+JZOvHL4X+ht duzRyzBAx7Weo6HPkRM5qWwm26jVsHLTUjkWBarZqGH4QtAli8XbNm3lhgw9 nazucxpdk0fuue/pDCLMCWDYLtMVv4F3wzFrYUG2tbVOW8RoZjsAsFnAfe1c Gg+BTbDsfA0F57lLCp7op84SMAy3YIXkPtptJpIFFKEbzYsu+u3jHvuYK6+4 ct/kXu4XKXbY9UCX2YBY/HH6/O69k/irH/PYR1O1c25uFj9PNpdX6lHYjgaT 8tnqBmWyuX2T08hOMfngdrNVNpeTGJYgNpwAeUvo/ukjNYjmF5q9CYBELFDb OzE+CqLbzTIEUuqRJRlhLBN6t9BASJ5XgV/PRvamEHGxEavX2ywm2iESHMex MLQHDtS+7ZYiwVjAILElGlhfk+QZE2LjPfjMdf51ywNwz12HmKjPljia15r0 EWy/GcyiEfyPwsgiAP+jLXfzf6fhM6on6MlF/4DrJp2UR5HIESPt6lUbGOVq tXImE2AWi3wTSzBa2dDQn81uyqRW1Vrk3YoPEijt1aOn4hOZt5Y/a2aAym42 v7QNNDJDVQwgRAVl8XbxBiYSDArTWY6ViCMimE33q7RPWCtNNkeEChbIDKvQ O07IALYhLHxsfezXErJte+it33pxX0cIR5toz74eOUJtJap4qPFIWa4CQSWI OoHbLFLK5ZWZwTN+NRsV8kaT6USaJoMrAzYLWLWR309b01FMdt+NDE+RwsFu 8VBNUHwTG+XDzS2TKjTK3Znp46OcvTovBWhD4JQshtlq4bdhOSmfY5ihaWHd BVFbI45Zk0QTkHms4WpAF1SeLG2aW4rzuYMwBRL/FpuoctNJllUUtImKiK46 7HVyKfu6XUW3nc7g743jglbSM/av/tMFG0459co5t9ZIxg4zC7jZ19coSAsa rwyLvDKRndSbr/gk0a9a1y2jT/7cLrIaHE8spFgMh8rMzMwf/vCH0577HJC4 VC7hqM1mVKQL5Q3OAjQl+EzZ4D/+4Y8nnninE084/qyzfo4/w+Z3boz2uPe6 h9w5orkIb3E+03PFbDavaoloqciqNtqi5nvhT3RVjsqauun0zPtsf5ubvtdJ fMpi6ebhNMgzkSyf3vpTlIvl07cQvO0Rox4ol0K0WIQucwZF0xQVCNEF4MBp xWQlVzhZfq9ph3VR4090mSvzwEpL2nusz9us7y6E5OjLf/RfzgS5Pd6doa3D cHcjOU//pKcm9g+MY//oef1v+90iAN96d5TH0ochJpUMKPRa1CV7/fvvPA9G BIZilxoYHVnyyU984qijD7nmmqv37J5WmV+zVeKZDLTnXHpzKrMcOT0CbcaO EQvJquu4wJGbmKCych5lAsEfFkfXCUo4hBVrVjBUys+xZrMWj9VSKWyPKbJc MJIoq4dVrHxQsZ96yGRMH6s163xpjQwL/vMAaYit+i4ckt3MDEPZBkHm+rWx xSOOIfI5k8hRzcoPC9v8oHKEtzuZIA7N2Ar+BWRykDhUTWJRlPf19ydbLdI5 ZCEzdUAMQcUnehCuH3idGw2uNhS7V9DznoFAlaWz+LRl4rhZEt42i6qaaRIS jN0uN5Fgq5HsjCqfG9ksRPcp/DwitVmRJKZH2olrnoQULbsjdtWhHzg0g8yM TTdVIyeJO51MV+Ya6TTEKFQ4KvXGdDxR7xvMUhYBeYdCdrhWa6oqUi9fOfRB 2+DebWFtZjIx3lWT0gZceQ7cWHZcCm0+bx/PYEXYsQUA9xW6FGNQfpcuTZMf E7XWyOxLWKY3dLoa+0sQJ9OK3aaYVkLTz/cV+vt27Nx50R9+/6SnPGlqenrL DTfg1yEDmBqCRFeL5Wo8kZorV27cuvW+97vfQZs2Xn7FFcW5mVxBEKurcZgP nedCQyldtruzc0XSfipllWbKpLM2v1CJQS5Sj5L4UNzUeV1uzYPM7NMF2L02 Cz7qq+6bkXNHT5Fjs/mc56UoLRbvLh8PZVj/Vv9MksPM0+8A7NatPYpK67IZ AfMmuaBrVVqH76zmmJVEtImgUbEUM4ruRxhIXhgS/jvHkr+2Gafllw8MO9MN uKVNfMURt2cK3wLH+7+6i0UAvpXuvBc48r7rHZqwCv7Dm3t4UxQOp9STU7M/ ++lPn/+CZz/0oQ9+0AMfnM7mt1y/tYEvkoJq3b7Bvtt1g7FGS6gcOjLDkCrP OxLC2OCsKP7qwaeY8obds+oEYPtQ5i9+ZmzueidAjmdnPDmdiANjpY6qu+Mc BE05ISAwMlVDHQlhpIOZRUVtPJrPKvY5e89hy0aiLketoWHcLC03O3qL79PB 3mWeHHrDdUa9RLqg9MtWJRGrpRMQafY0atuxfzJZRPC3Bd1SoZBstup4azMZ uaPNgyzFBeQWo51LJdPXxZ2Wja79Ezy2JvOjO4VKRqeHeMMrjQziHlyJUK1E LYdwc+2qyIFiiuYA8MZ3i9Za3hyYZmqbo0LbqFyRj/PGgneRY/2ED20ih2+Q qs8iUmVy2Pszs8UbW+297c5kvTHJhIkOl8nlU8kcWCQamVdn0nEj3S8Rz5pY wCJhpYgrWAE+y9ex8rZi2liv8JeMcSO1ixKXSrbMBU0MmC6lD42EZWz0yE0q 12o06zAwixKuhHxBqVzBbE6ls+IQdzujY2OlUukPf/jjXe96l82bD778iiuv uuZqJe3ASG4H12/Zumv37kc/8tF3u/spHASK1rm/+uWSJVQa1i0L+3kUp+QW UlwIE27Hjl2lSnn3nn2EJorlCjhn9GO5kYyZLnCzvDLzseu88XyLDy2DNCR1 e5uH87PeY2smryhgCvEqm0h3nt2GMxbvwy5hpgbBAg6YSUh8XRZvD8Xtdrjv XPPOBEESXNBWXUn+EqNnWFKUQkhlm5n5A+S5f71n7eYOJ39te/dCu83AwMXV 6Urtk4VclsUA8H+n0RcB+L/Tejfjt96PyV489dRT73nPe6JptXfvXs//uxl7 8Ycuclol4/lypXz6d7926aWX/PQnPz/11Hu97GWvOPzI2+2dmd25vTw8dPtm fajdSncxYVUjyOg/qiufjrdRgCLxV/acjDYFX9ktiUl8y2ayt8xHrbHJkKIe xKcb9evThV0PecQdjzpmWSc2NT1zY7NV7cSzUs4SMIRxUBtzZCFFXmb+JseJ nqboGvtyZWEzDJzlhGEg4yM0lkLkNY9tOCr52LRwYSxsmWMbm9WWyC+tOBtW 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 KUCFgIYtMMSo4rBwsW0CSF5szwnMr0Ni1TxAUlyVblBtx2qdeJ2lGzfEtdEL +wDdjXaQ8kVKTgnCmHKGAphUeCL0ZgHjbr0lv/rQcPyQw1fVqzem0rNy5cmV iER2DjkmliBG0rC/Z6IVfNS+QLXNxnHMaknzTlFCVmJxLWT42Ie+ENRkQWGC r1BUJrWWjXm3b5PZZCqXSOWSKbJuWZ9/T6QySTQJ0/ZtOg9PLJnOspLK4DrO p7KsZ1MZvlqwJPsSif5kijJZeaylRBxr3vJ3e5aQiVL1+grmmdypZGKRNIwg BUs6w596T5kClvyhVguCW2WMXKK0rRaGI1M63JLJdhP2e0ozPC0xFjy7qgIZ U+Vm/MkslNVTxrMq6cJ1IjuZqgmy+13ie+E70GiGlrY0t4f7eOLiLnN37eeZ TG50dHzt2vWbNh28fPnKFStWLVu6gk/YbOsN26684uq9e/ft2b2vWCxdd+2W yy67fM+evbt379m+bQeAOjs7Czp6TFqcMiOmkxS8efPm3bt379oFo2v3zp07 J/fum56cnN4nPJ7cN43NjV8K03lqZpYFK3xutkTd4rm5uWIRNl+5OGdLsagP S2WIXf7uK76wGScAZ7tYqQLV5ZqqEOqFbxurX0Fm8bGiuLgFyOWjwbGLY0OL ghK6FZogSqjVU/v2u58LpuBhxehbaMBa3M2t0gKLAHyrNPOCgzgAazZsmRny 4xk7umf4+mDxV1+9DRhl5wVxzD/mkCyLSOMn4NoFdOe6wSzQ6zAZYmSAjQsu oncHskZDrh5+S3o1XpbFxORLC6UELPYcMX7tQLIUNUCAlBaIkgFnCSrGVDIe CjFTzA6EG0RCsRVb772HH1oZQfl1LbyKopIkG610AQsrGcoVS5aPFCM8xizx viBOcSeWwW5sMIgPxeNDrMRiQ/HUUCwx3An6IO1YJUPmF9LqzGTzzHVQ4h0Y JJeZmGmRaHE8no/H+1kSicFEnP0MsM9YYjCWYCcDrPBhPMnSn+Q9NRBP9ceS BV/iqT5/t4Wveu9a0TYJ8mf6E6m+RHqQlWRmKJUeSmUH09nBZGaQ9WRmIJUZ SPIh71oG+ZYlwza5oWx2mPdcbjiTH9Z6diSbG9Ln/p4dyWSGM6mhbHo4m9ZP iO+m0jmBfZhIHfYTdTlReUHedJptsgPp3EAmO5QOD9fP3lLZfvtzABq5TjjV l0wXkql8KjWQSvazpFlSrID0A6ykk4MprihRSCUxQwmkDvT3DQ/0D/cVBm3p 7+8b6u/jQ73zCdSqvj695/P9+XzB33O5fIHEoz6q/+q99yLuC5JTApjPWcfM Zaoqea0gpiIM/UNLliytlGs7d+6+973v+6EPfeTLX/r617/xrW99+7tf//o3 P/Lhjz39ac9euXI1oHnj9p0yz6HvEsGVc9n0v8wbzJ6xemXKFkugKBALmMK+ Ls3yx9zsbJEFRCfqySZlvAD1OvqRWPtatGKvagNM7S3Y9Bj3c7OV6dnyzHRp akbL7ExZy1yFz2eLpTlZ0GXBcLOmFCmcDI0astNKXcChT/eURyAqrCSnt9L5 bIps9R/1gBst8gDms1c3uYX8z39r/Fn8/hZrgcUY8C3WlH/PjogBH0bBtQWv L33pS4973ON6HzBWehzrL+zN7QNePdqFcgR94zC0SmA4vmlw6Kh2a0WrlW21 RdFyGpTMFKssJyaNgjuWUeMlz2SXIJiFKSm2lNV/lUPb5Ad53HECb03Grrvw gk/e7qiVfrjnvuANH/rI54NOX5BcnQw2U/oQGpfVsTM5JBGxXEUL5y4JTtg3 FhezlzSjjJ4TvstxyuDCX6LXoinBdhJMliUX1kbU0JOACGtEGKVRwZyC0IRv Uq0hE0pGGIwziDb8jFIz24LYVUcelT73nLclgloCKUPLmGTPd77zg3/7u2tb raFs4dBk+nZBfFkiVlDLcNby7+HNxifsI5oi4hKdxpBO4G3Ge+zZQaqGJIZq r6yTrmo/c8SbV5pikqeQUKVHVt2qMyJPbyLFunkvIniwghPyeDOBEXFc3HE7 YNhuSgDy1CeLG/LGn3hyAYqtlcolr/6Px5/2zHt6Rs1Pf/rrBz/s8a1O/+DQ xlxhXS63UVMKspYUrWAHHgbm1SRwjrQaecCuvWRiJl4zsXeimloZNU2Fjtms 3Shns7VVK5KrVyeJBGeydWaW4iCFLOgw+quwbuR0jRQ5rBhDo82dRksEcCUA vDDvxSemLu4oA9k0hy0Q3QW8sCR37dp5x+NPeNzjH4tjwDtVraxkX1RH0ihx Nmq/+MUvPvKRj+3dN1mqVn71q/P6Bwawtjk3o0l33vSmN77vfe/O5zIT4yNL xkdzmQTTAfzH7MeATogHh0sdAX8BMWCvmGVt7oxAV+bszaGBY7CVd1GT9FA6 PSsk9LGxxXg1DUCLo1Un50p8PvUQzZblh7am1s+SiXStHOzeUW6pEJSYDpJ2 51tlvfMk7g7a+LEUkzYRdW5yb1hw0sAt8FoYA77uuuvWrVvnO12MAd8Cjbtg F3/T2LplD/d/d28HDEm9huCp6zmfPaPuZkpz3OR5EyTk2k1Q3Mqc6aGXnobQ t2vE3QALKSsCFyZmF3drNh5gUxZYglghHhtmCbpDsdhwLDYITzgeQ/Gqz5hK jALwd5z/ZcMyCBRTCWH2QDlhtonH+7SrIA+kJWL9sKPjQV+c99hAPD4AA8gX /kwEvA9p3T63dzbrT2LC8h4fwiTVr/iQrxJDiTinxFdaEsFgLI6xy3tfMl7A 9ZpK4Plk4E+l47l0PJ9KYLexT8xlph2crGYYJFb6mWN4kWHJOQedXDIxlGJJ DaWSFI9ifTCZHE6mOPoQK/bnINskEgOJJMtQMjVoK/32PiBj0VbiiX4WWylo HctYnxTwD8tFnOxLJgdkBPPO9vqEFd61JLSZPMmJJAYlZ66NMTrtfQBDU5/g ZE7ot/YervOhTNUEV8GCCzor6rJCwcSfe5Rj4ZcAFYzD+83hdM59WLTap52S HwKLPJ0ZZsHC1pIezqQHspn+TLqvt2C7az3F5wMpVrID2axM2+HhsTEoTWNL xscnWLBQFy7+ycTEst4SfbtkbHTJqL2gU7kdzDsvWFe88/n4+DhUiQGKIvFV X9/w4PCKFSv5kAtas2YNDvnSzNwN117/lje+8SUveSnw8MQnPpnXO97xLuLK L3jRCw+/3ZFs7KjvD5pSnlvCrT7sbDwqXPDA4JIlnPn46MgQRxweHuZkOOIg oD0w0N+vE7MV/WkrepmVj3Hfj34IGl7ZjJHIqLJNnAbnUrOlGHq9Wa6GcfE5 3NE4pQmBY1bLGS1b1wqhmEyZKUdLH9o80VKTjV7zxBEhNLMAL0zpz+Hi61+7 BRYB+Fa6f6ElERYqD9PbfY7fiwH7Ngsh+SYn5zPckDFrgVjfpDcFZh1bsL/d yau2oGofDSGZFXTHYsFYrDsWD8bjZOBoGY8FE/FgItZdondbSQRLY8ESlkSM r8YT8SXx2AiLALILBoOsYHD44GtYtyKGiH4wmsUC3vvj3X6D2KFYd4DTiAHe gCUgygYd1gfCBS5uDKjWr2wbfc5OAr3z1SC/Yre2TYFMIQvQ5plYdMmVUroU WlfKHTLaVC2Gj72zr9Pe1WnvjsMz6tQkpyuxjLRKNLnFTKQ3Ha/B5dL5U/Vu gAxp4E2TErm4teDlZmEFGqpdKV5xhDy1onVbbHuzy7VPVsJPrOCxPrEfysfu m0k0WWUwSJWmnAWHQBLTP0yzZ196H1Izg0gqi7hTcgOwJFUWXsa9/BP+LTMn 28aPzogvp0VvmO6RDNwC42XcPAsHsCsIQB32kFH2tuwqO3+SwpmsyORlwa+g 5rWj6EAxyGxUIxYpWq2kxuFP5ESsUA+fy0LER5ylnoKmQfIVez1CL2Rg2km9 Fc2T7GU1G/QFgXQWsFCXZ3F1lgL0OeIZCLm1SFqPZwhWm3QG+8QCBgVB5csv u4yrw5P8spe9DKYu2Hn44Yff7na3O+igg3Apf/e73/3EJz5Bvc4VK1dzHp4z Y5UoEN4CK2Vwc3xc3FQdHh0eGRKhegTwZRUMtpLDQ4ND/UwMOFz45/DQ4LDW QWgH6X7ehgZ59yXf35frgzeWz+b7srlCBmDO855ngeaNL10HJu6ehAqQJGEu xUJcX6F9X4jNE4xPuyKo0+rEHVNyMO3h6Qw81KJt7v+6xWzfW2lAXDxMNHAv tsSt0QI9APZBJGSFYKNFDjSPCvsk3QeLv/C6qYtJ6GsZgV5jh6GzLya8zCTi gBbrQ0EXPBuKC95kR7II5+xPQqeEUS0OyvtgIobBKmuYFUKt7IH9sNj4Gwr3 +4mF5EzJVTIu4C5mOGYcR9+DYdrRyDNlvfQhg4gHdHuLChKbL1fbm7M3gi4S lw3JgBbxiS3DSmV1HfNs0iHpqoBCh0Wgt93Z1u5c22le0Wxe1mpdVWtc02xs 77an4xCAxW3W0OVZm+Kby81NDK/igqCqkSMpQksFEXfaPlGxVn1inFU2YCFE hzuBdwT99bkttgKzzPi7YtVIvUFEMy1QXhV7Fp/J6iLDQlfyD+tWSFYZLxxR h1BpRW0DT5t8FikatvHl4sEgfllrNbGV6ohMWkUdJJQQ8jfdfzucCVvonZMz f6inyngn0bvhsdRCnOwTXp1+aCk3Ohn93PnHNhs0Bq85iOUjNoFFvamcnvQ0 UJvAuNQSrofVdknrxeTjiJyAHypk/tq6O5O9k/de/NnjD8se9AJ+9nJfrsM2 HxKIZUv2TNwV7MaGzGYzV1111Z4d2yFGUeVq9erVy5YtwwwHF4FP0magWWHU /vKXv0Q7wp3YYkxw3vaQeKCHDzG1JR2eFh7nwUwiz6BnPivDtk+Ba/+TTwl0 +0r4Ds4WSG7SSwYx+cgGxoOG1cOjIyNjo1oQE4le/Am89w0MadeF/rysZ4Lc WrKZPKRu1KozuSxzGZhyxCksNiT0Ndz1h8InfA7AvaEgWrlF5aBvjWHx//wx Fi3gW7UL8MD35CfdLdajaDpCM9bYHDn12Mc+9r3vfe/zn/98RhPPj4wG04UP Xu/kLXfXTSI8rBmMXaxVNA0Qsscpal7ThDzJ8jMHed7NVwyVKdPtYgyhuo55 Z4BnlWclzahAmCSdRcgUFAlmwtizWd5O3QrTYu1EZFtaWoVFEbHQXGJJCU5h aWEYzrGmLazYemALBVglpYiUCCFGrbC0VAyRozd8S3x1zpFW6hGB7Vip1dwT i+2LBVuCzhWrV8299N/v/p+vvfcJJ5LR8Zta/Q/p5O6gNdVtVJSmaaxtwbbB dzdejyXrTUtnsvSnuXZ7tt2ea3dmSXnqdpT41GkX263ZTnu2A3OtU7QNILKR bVWxbbSwTbRgghc7nVkt8x/ybfgnRZTbrTne9a3lVrW1//AT+7bYbM6w0mzO NlvTrPh6ozGjT5qz2sZ+u/9StgmBpe+0cXlWgWdVilwQCPQ4pVQghJrwkNAq LVNWstUqsbRbZd6bTS6QUyq3+bBZbNTnWk0OxJW6JxVmEGDM/0hTaDbgYAnc OkhXazhXZ2eKM2XxgmdJz6HiMouyiKjaUQM7tc4KKUx8y8KWJejDsIT5g6oL JXhJgL3kq6y2LkhsWTvRuoLdTGqMG1GrV8h5gj/HKf2///e+8SVjGzasm56e ZIc0BUeBWkyuMOeJhQr2gdZ0SiZKwl2rxOAPmseqSRpyKQk3iJVMjCQ627lV TnQW/72Vb1b83R4NSxySdSq2AfvQBoLwXA54zvX15wewm4cHBoYHhkeHRsdH WMaWjLIwIZhYsoy34eFR0BcxVBYUZMVsxzhGV5P/obuL+o5kdd6qQIiBKHks CP1xgDmvWbXiPgcM3c6I/Ke8ej6Vf8re/2/vdBGAb737zxPOIIThxSF9FGBg 7PGfjaQaZiJ95zvf+fznP/+iF70IDD733HOZ1/uWC56EP28H29SY+npYvXni u+JVOSfKTEBX6hDTCUC1sgGGss1Wt9HiPRAj2jOAFxKk3Z5zvZ4FFGiHXKON sBN/GX/Fc3CFnR1T+SAzWIwWKzystF3/cOHieVBhNpTnRJkqljSdTX2e2YCD vYtDGde6XclnUTaeqRSvO+mu68/95dtf/eqT/v2ld/z+D17wmtc8IpvdMTvz p3ZzL3p5/C6Nz9Xvc6hTrcN5pi8Xa7nFVUu4InEZ1Km2OzDXqL2qRalceLm1 kApVa3donBpFaXQt1lzkMfMJUynl1OrMyYG2n5CjRSZYB0lfNqsDZtpY76yz AQQbWpWiCySZ8M7PG0EcC5Kfq61Q7jrw3baRfLe298wxZwtJjcTELS0JzblK +738Mbe7r/ZUIpmSws06Z0U7RNm70+DqKAxs3aABw6rbRttSRFwvuqdm10+k m+g1+CSBTEVMz9gV1gpoPSFWQlf27q8/vy4OcLixpwOHVnpUC8HN6N67LGm8 0s0mqT08LCMjQ9u2bfviFz9P6JesoX379oG1fA6o+3643tDRHT07WPFgK02x 0EaX1a+XrsL9DcZGZqmTuuZfaUrRsMVf0Qp4b4tSgWFcI67J3AHvhDz3wLmK lkCrBNpFrjSWgvz1ylKTwJZohnowVR/FSxSHOu/h/ZK/RxPrjpxD8hIROEA6 xh5zkbBuncHLbYPF1z+jBRYB+J/Rqn9mn+529im8gMD+7MXt8GrxIQMBD+3T n/70u9/97s4I5cNDDjnk1a9+NbDtI9FNdx3FZH2ElaKk6EVB1iKaeG4bnXil G0e0maXSiZfIDGbpJCqI4rXjRZYuC7m/sZlOMNcOZjuWB4xIPoAhnUvBBpBj JY96Lx2VYzEoMH4YmrKBoFcpEzByVczHFBw9kdHUP7TEuiz1BQugZR/6O8JI evcVQUs4kobyzKbfJDIpIprkEZFAsquvr/PBD7x0YEAsZ6K/CDe98AX3XrM6 kcuW0slqMoab2qo9haRjLGlRqV2tWVeEvSiYJKEZBOLMKXIsNLUz5E87H8BV n7OE12UrVthRe1ApIVv0oaY3YRoXJPD5z3sf0kpRITple9k2/IoVSS7gpraF 44KRCtiGi5Wm0gZmzPqHnKHEPebbWbjYK3bklF11i1BxOOIzS9tB9Qd55xC+ T12FNzLNw7dyjEthO9ybZnF+tjSll7oyVRBz1JuqFfV9eggq/zafRJ55sYvM jY9/Xsk2vu6ec0dnIyGZA1++cYN260sHvPM3GMmJAWTY0Fioy5ZP/PrX5//s Zz955jOfPjW1b+vWLaT1mo0uLCSdF3duKpXBQSCFK7OArT3MKWAOeUv+Mc97 NEvwVKDwQ7P4XeUqekUYvOAjx2bOTeAtZ35TsiV1dEaqLCQr1ZD0sPdwqmrq Y4o3mKXPsXQulvUXhhIizIMTDRXeuFdhCMZCNi4QHd7eW2kIWzzMP6EFFgH4 n9Cof26XPF3uXuZLTXijZF+ebT7xOTtzY57G448/HkYLQ0DP3kVHnoe9V30z 3P2BGWSOzYwvIs5IVzJU33XDBSPGrcwQDkMrDVARiQlDpxpnGylYyXqzdxlh mFxmAIUOrnAu7MkYxv2JsoF70KjT8FJ0bm76AG2Wq2yvEJJ7VcrNlnKLyu1m DfRh+qOJDxsSm5IU+Afg+Tq2VyOZ6mTSAc68JRMYOrRqNZVopWONvnxw5BHr 8AZXqlP1BsO0yUvo1SOqeCw5TPyIhrF5tcgoZ8ZOSXJFoVwzf0qK0vN/VHvC ath4eaBegrQlm9o24Wxpgd9iPu/IWzJ0HEQq0O4rts/93Q4evkzHMSwgqJhu tAeh4AFZocp42q8TWjCY81HsmYNZnUd/d51IHVRHVLUnvxavNmHFIWzxplAJ B58DhVUaNZXUhcwzv6LT/bP/+kkt/Mpyuua7cu8r36x3EdF6h5koxqjPXHlk iL8uXbr0d7/73RlnnPGMZzwDX9GOHTvMGp7CKiUejFkMS8vdS2GxS/M/9ea+ avIoaN0LTs+foWYjdlvmX/NBbp8Q+wa94LaF5Zk+7LdXmz3rG/cEROF2D3jb RCQ0tRWGV6Dar90UrqN77Q4MzZpcAvqfqn61X/dZ/OOf1gKLAPxPa9o/t2Mv rulPlz+9cEB8Q0YWnj1M4SuuuMKhGlT2LVHz8W1sdFygbKQnMhrTQkUOGcFR ZqeNrTqSAFFDrA24YbUhqwLgI31YZ8js2bDmj22qwdE1f13gXqN2NFaG1lRY Zd7PbeEVh+N4r1JftIEdS5p74bJfiaP5M4nOSrZgQr5WZgkNcmqZJZgaVwNh JQKKmBnTU7OEeIkh429vWx5ztUb5uR1Gt+n4jAcWUaSrDKokYm3KQyGRZaWf LKljoQYTXDNsDltc7c8Z5uFi5ytackhUDlWeQ8aynPwRa0zcMaXMhgokhmem ax2+S4TZ/mQlYk1bJd2IaxNqTTu7zZnVtiUFM0IaNn96O5u8tr/sPLXn8G+7 c15B2adEVr7Jay1rS6Nb6zxZlCluTDffJtpMIG0/VxfwuvFe2EiQ7FnfVqpH 3lQZ0n92AfqjxQrR26LcVmYLWrxD9Fa8Wi5LbyVUJlephiTzUS7cdChrLpK1 e/feT33qMw99xCOf9NSnkTi0Z8++Sy750yUXXwodmrizYyRWpDpFaAdH7bOf tnbUiEb8ix4tKa6JPiCVGC0KCONcdqkvWzEH8n7VMg6YVdjjozaLXBQ2AzJv hx/FjX4LDVkesnsylDPlnhV3q/hcgH0rVr3gcVscxheOPf9K64t37ta7W0zD CVl5SoY/kLwzgvgZODkL0P3a175GKIt1wJhpO0QVIsFuHM8jwZ8xf90SUvaN 2TWacZs9ZWZfWG7IjUuBK8OhPJNWBtdLlTpxyko6yNupKm1WDwiJDEV/2V6m T0TP1gkYx8rki12p2BarJ79Apqc3EkUeUTdDe0tkvYWFB4T6jv1uW8vR2jsf i9raZWogyuT6h0eXNVqJD3zgTMn3SZ1DyvV/vOTq3/3hYsFcnKKJ0+Z+9tRJ YYyhjhWDsstxG1fNZfvs3Zdo2qHRzkfIaDgODR4fCxf0Hjthv62SgO5t7zZm GCZ3T6O/+2v/3c5/st/nfnKC1QXVdcKzDX3rsnoNyniPzmrB0y2nsZrarjTs e+GJuRVsjSAHtOLutm7vCx8Pc06YJW2GrxUJ9pfa1jwFrukRXkXv6no78U/m r9ow2FvjgOewt58DVlCcdu10n7/CWuJh4YFasWIF3OO3v/3t1193w2mnPfe/ /uu/Xve618FkpI7eHe5wB3fz6pZH+QU6rs+D/ZQsKqEVE0gxQ9PNzbDWpAt8 ekZ1NGOzqhLm5ZFiirlCrGX06sWzndQdvUIHT+Q3UtEmp6OHE7mw51jtKX8a 3dkQ1izxhrKCHAe+FkfymzTJv8IHi7ftVr1L5Cb2xhp3KYOsmtDauuvtXXvt tXe5y13YkkqFZ5555hOe8ISf//zn/it78MIB10YLP/mFeOYl3DV0OsFK6Kj4 onDRTE9WpMFj5phFGT3Q6EOQ2crhuCzSjQ/KDrSyO20RhcXeVcpQ4VKRjyiD g8o/NCIN9BJyCsWlldgjSLaSvb7y55ZQxtJpPtG7awVR2Y4MEkob6FItq0gI igRxoxGfK3aSidE3vOFDr3/tV6+8rHbFlfs++rEvP+rRjyvNTcGmyfcVduzC EtqpX6i5+K2VN+cPoREFg622OYXeQrY2NGyfUpjnXBxsTGtp8LKBLeHpeQFE 08yKlog75iFSc/jbu6jdvKtxbcV2wofsXOFWsbtZEF0OP2foxp4XP7zVoVqd aQLbCos+78TDd0WyHSDNBjX8M8eyrYeXqVmBdw9D07B2smhfUg/V+di8LVzX tRhl3TZQwMIN39BANqNQewvF18L6UWCSgpRSLrPySguXA/wH7mno+RvcjbzA vx1GK/bv0vPdm2vgGQGDEc5CIFrlImjdWCKf74tLzjq7ds36X/7ynDe98c0/ OuPHq1aupvb2Mcccs2HDhsv/dJn7Qkj95t01KQ+AsflJgAXBrT3n6yDooTCl ZkX8vT6yJrEqfSJHgAO2THgLoHOR4kZ7FlWYBu0pzlGE3nA7FN3SvEdFJ6M5 qO6iPCkiWjtVUAuVM6JYg525PYN69dwzt+pQtniwW6QFFgH4FmnGv2snjDXf +973mLAzGfen3SfmPKI+MSc+5OkQf/rTnx7ykIdQf+2+970vjOhexU2NVuYJ jl6KBrlT2pUTlQQMC1pORT6KRq6Q+usVdZzjY5RmG0yN+WGGINVGPQQrsJBT UdNx8XdECPK9AwOGxLyHY7FHUkO2jhOCjDTrZrfPANyAdmCL3N2AtAi97oi2 MZ0NjA8c1kb14BdfCIFsGJKcoeGKLhU2KSkgyCNTLyeVWvX+93/jiCPuc+yx D3rRi960/cZSEBsl0bnezBbLwWc/9x1znkdtFtmcYZUhnZAMffO9uwfeXe72 G7tevwqRy2g6TWi8KGG0PfUeWTQeG4nJXaVCPEdrVTpy94BgSlAZel29Ra2h PGysz3uzH20MmVZEMIXhe6m9YdvatMl24HR6xwwztcOgu3cAqUqai9pkOI0j HUVwfaph9PJegMAv3sEgxGbH4PAVOWYhJ1vGs8U13RNgXTp0LN/Efg3tafs8 dAZEe/T+6923F+bs3YUQJsOIhguoShw15iQJ9oYjmlQmWMWk1Oez2bWrV6F4 ccYPf/D85z33P/7jP77yxS/98pyzv/6Nr3JrYFfRGDxysJL9HntlCEtwdw+z CXNGGT6SIO1NcqMYsOXnRdfwFwx3eecj8rYHh6MGUQaTWtvjOz2I5pm0zHK7 F+ZgMG4BmG3naXCr3mjzqrAstCf9qwdEHW7hjerdscWV23QLLALw37g9PbbU /BgUEVx6M+ibbnPTnbqNu3Xr1ne/+90H7OqAn9uwIr8cTmlPVXR4Vv6ShkWf C9vzKOYvi3u0fa+5fHas3gRGEowBLsGvZ9Q8XewYTVvI1+KsRlE3s5ewsVrE T1FVktwwx6BuOKYnOlBNqGGcAMxVKTpR2EYTfZVsYOhKJ6TmmCGkGrRRu3el ZQ84Y7EyLEAnUeoRNKhmsyKXmkqb4v4lewWOMQFdyVwY7ZbMy06rUaQYYsIq zGPjplN51WTtVFJ51KIokUSGCd9hHMiIQZZZtqkUmoY73VWdzvp0ZlO9vqTT nECbOoitC1IHpVKrE8mJL3zhR1deRrKQAIkhTkMb4V9SP/G+E09V/FOeRBtU jR/N6bCZtRzhYlX3s2mB+DAdxm4wsSGYo9SDEkwQ3SKzFmoYFwYFO82CoogF HNWw5EuxEckzSYZ6sq2pxUtRWuQ/O6lYR0LTxqOW0cQnCYoTCy0BVw7DV4C9 vAs4/+kSohGZU5SmbTcb2XROZ06Vp2aNqQjqimnpLMWarQp6zuYp1jyJorOm pkLuSqgAo+xWi7fabIBiiApk0iNymT6KAiS6SVJRHTPIhUUWixvjjH07AZqO HO1GPCHV6AQFoOOuImK2Nt1M/VKSF2pvbDg7mKZ9JsWtVNokwE6wPkhmVLRZ 122eF7fgNReyPFsPVCOKFdPttvveDfP0dLcou6sc3Bhn2KzXaCyESlAy4Xak kwlErdatWbV+7epCNjU9sw8C8tk/++mZP/kRVZo4E26EIxzZQhjTLejbLTwM KJRRsgnNNamUN9oq4UxnJymL3kDnjsh3If3NcvnUXaA9I2xlER9NfVQPmK9I ZwA7heS0gRKRPDqgK4pTdVgQS4KSnnSLhfMJR8mkAs6fh0sFtONpfqU5WYv2 Mn1L9SYxAEQFYCXIJBIugq05HD/kqriRB7x6AS//nD97uY69LX0e8FfGwYWu Ah/Hetv7YBWOTtHnvv2BpNG/coD/w18tAvDfuPl6Nmzo8W7nTrOFfdfgLfzE 7Yc/+7KRS/n+BHQFVDyykcq85yZ5n/Z0I771P8Fgdu6yeaGCx37RHz3SvQ98 qGuovlkznWqns4yh6LnPkMCaSsBzrrQaU83aZLszHU9UYp0iZb0l3BibIw2J YoWkIcH36gYzQWwmmwEgpRSRTnfqtRlqpWdSGaLATfCUYSWhIBwlYNtYIdLK AyfIryhTc4k9BAE1g+ea9b2xOJBZTnAsSvkm0XWqMl63JENR42pIiraEn5pS Y9vVSnkyn0fVkETNuVSKDJZSubI7lUJLIV6cvqFW29XpztTq+/py8UZpOhGn AO1sMkHiSAl9IgArnx3utDL9fcviqfFkYkm+f00+t6zdAsL7pvc1P/mpr4jO wshug68cD42K7macA811utNBd7qDmCULBc99ae1tt/Y1W8hsTQax2US8HItV Y11SPYsq5YtN3CGJtVxH6CMuKJLbNkxbEm3bAuGeg0RJ2r3ZFEVup2rlPZ3m XCbZbjXJPIZTBnKQ2qtFZq4MSmUMq4yV0oUtIcrKKkPwzmcTU/t2ZtOxDFDb nE0mKT2wi5NPJipG7KvQtpXqTKuNUBTXOq8lLAOxSrBAEsVNlDcQANEy12nN tJD+aEJhkzxIIt6olmdy2QRiW1PT+6zDg0/1SrVITUXWYSe4hwZ0AeTIEqbO B2nTaEFyZ8uVaQrxNajwE2bskIejrGBXsMJow/GD+rGZhrL8+JByQ5QdAINF VVAtYqZlvnsRgXkE2BVrqjdsmQL8itp/Ogd8Nc32bEnaH+zWecVWt1iFikkH Yhc8Xjxu+KuRx2JOCh36m1/7KjshH5kdkVSEYgi4wylxGlNTM3NziJN0Z0to sMTJlELYmd7ByXPhygyucY/C6HXoitYMRbYt6GsKI2WFN6hpZrpqyFlx/x13 uQjOihmtnNUENDrCY00YuEikoJn6MrFQ2oKg3YcaZnI0ijaOmAQeP+oNOypu HM/ig/BZt5hcHcJJFm3wT+zlXV2HsHXnkXiuYy/m5WPRASPYAWOiQ6y/fLDq 4a472P2GEoP3Y/nwxbHc7b/4+istcNNg/mJz7dcCsJR5frxP804Pox+7jI77 wRZu3euXf6kRfSd4lR/wgAf43qiGRJTXt3eEptf2dmsRL40+voJULJijTd0/ Kocze1R6j4nv8xivHh48rhusKVUwTKrwveDKiKWp8cM8n5pAKAXTJt8KsspO 6tE6YhoQEzGq0A3UynU8vApyidZLDdPpVOLGi373iSOOQFla0+4X/dvbPvax r9Tr2Cij8WAFNRKowttz33EtZFYwUtdqLQrnIcKFtiVjZhyNWwr4WkgYu9kC ujKNk+RIgzTuDsX4Nq1g2gfb0SbU5J/kakwbOul8brDaqKczsVp9Lp+L1apz 0KS7zUoux34klUWlgdJcsq9vBExiwpHNlPsHKtdf+zVZWzKdg7vf/VG/Ov8P HZQ4E2Op5IRKDcaTliYqz4FZyvaHvezoosBa5DLg7mTS+VY702xhlnCeaCow T6qiVKwBVFaOhlH5oy3vK5mkOvsc8Ml9QqVqcGB8rtjIZYakE6aMkjAQIOdz BxjnptgAJ4MJFJduiTmEacw0ioeIPXRa+BLq6C5xV2CB85NUiuJ9gwBbKtme LV4XdK5/2Sse94LnPJzRst2In3PORafe6+H5/iXZfH+jlS9kV8kglkkFyHHj QVdiFimznjp59iQbutXfP0S2reoEJ+PIVfGprGQl0zaRbEJvy7LWS83GTCYF Dzk2MtQdHGgVCkygutQctDloYJUEU55Xg4yj92QpT6F0nE6DndKbZA6HTDdF f8WAsI5qwVYcIAJgAwzYiKzLwmM2h9xFGwAFSUm65aJFPDS3vN7NbiZA4DxE pzB0pmfnSEzavn37b37zW/KUfJ76qU9+8uMf/yj+oEMPPRis27JlC4rQKEBj VafkJVJRL/S0SCamK2Kjc8o6rTD7y4l1eieHmdNjdskzW2s2yhUpaFogSd6C Hrapi5tTQRYwSmw1NDWxoJPOszDQkkfdAIw7kK+U2pP75irFdhMBGPnJOZxU OOzpoCQXsmjbmDWmUsREmKlYmjAdTFZ4+LrpWOT92af+vQHqgM3ceHUnf+99 YTWkpz3taZ/5zGfcLHFg9hX8/9xN9r/wq0Us+ZstsAjAf7OJtIF3MstBFFf5 gNdCyPwr0NsD73e+851oTLok1le+8pXHPOYxrCzcuWO878rnrTbOGjD37pi5 oB2AGe4tbsUYsaSQP7TTWqY6tel2BXDy2WsbOSu5tuQcNk8r5dUI6EqXOJxl C2kEn7i7cPeRqNNO5fJDOKatEH1QL88lkrsuuOAjRx05wUOKw/NFL339Bz/w 0XjcayhR2qHPlSw9iGWDjyYF2exArYb8zzBV3PsGl1bqU0RMfWDCB4vRoGe+ 04wn0TsopdIdgAyzEuNaTc7QImu7DZAjZZjOjTaqQSa7hOEQ+d90ngDoDFwq ig8i+0yED5hAg7DdSeeyy8sVEVvyuW6jtjebnbvxhp/2D5iLvBWcco8H/vo3 F9cbiVzf0k6b0gJIhhmJSdE2vPDhyevEqKYgJykjfwqpwUQa2U6pAwYdhIBH 0PJkzNUVcNH40jXF8Sgde2O4xYQtp9K1UmlXG4UQvNlBIpuh0pFqA0tNkIIK HvO1n1DwUBUZrdkMnGnGmuLiXhwwkQehUETBim00p4NWtVnH2E2iYogjHXFv ihSVyrOpJPVtL3/jG5/3zKc9EK8+wPSzn5/70Ic+voaDOt+fTg90W5Sc4pKd H2Acgm6aTpCiWPHoCM2OGnIskQMeEFOjfhKmKSCq4D+1LdEtb7dq9RIAzGl0 upVWezadrAz2g7UdTEH6DhM4zE32xvXQpZlHZbMSTHYEcsGZSqXGtTBYz05N qq4hwBJPUG6Bqg7eMWiBOshH1YJ0GjPUVbv5Ah1LoI6SulTpbWI/MsFoIium ehAApo6gSQU3kOtSu9KyIji02yQjkRD885+ffcSRR7IrDv2RD3/4C1/4wujQ 4Cl3O/luJ5+EfuRvf/ubH/zgB9PTU9RvQENDcGh+ZrE0ElTbShkA9xgEYSdH tJkPq/DBrPhYuYqKlqxA7lhk/WO+Ms2QSol85gk8GDhSuKupdKaPAhjcXlmK insockwxjHQ826h3p6cx8SvtmqWKyUlv/medFABc7HR3x7qzeEpsPEBVK8Xc iKtWtYkIGn304N2JJj0ztyc43yOX+AO7cOz6SwD8xCc+EZtB12LWwl8aCR2P /56B8e8af//3brQIwH/j3nrHPaC39cIbrKDVTFk0siBY0Vz4L5Ty9emku4Do xCeddJKem3jcAbg38eSTBz3oQQi485BgfDNw4Nhheg57a7/uzn0TAPN0sWbJ RSoaS5XZ0YG+Td3OSKmC8YS52V42MbR8+cTaVWuGx0axMBiPeKCxfQnsiQ7E qBZ2AZvzB/EGWn3J7DWX33Dhby6uVEhHHo5nhuslyqxmKET66ws+cfjh48Am w+ZXv/nDn511loBL+NPXVVkkCjboWZYVEk8RY9u+ffeZP/pFIj2USS1t1Ea7 sXyHwJ8GSSLBFlaU5gVu9kq7WUT7tlabCjozzCswcKkOt2nTJirDLV+6FGMX CKxWWj/96QU7tpUpC4hFkkwBBtuXLSvc4x7H5+CPAyTtdiafnSvWLvrtNTds 3VMsV6ip06jM9g00r7/2V8ODotQwar/7Pe+7fsuNtUYsmx0y+89rvWr0Vhau DUaI9IIT9Vqb6unbbtxz7bVbKKueTGVjqSzQm0wMW+Gmvngip3B0y2DYYt8W wOR+4HOsIQbSqG1FG3HN2qV3OPYo5jFn/vjsYpFJBng5EksUVOIixGyGVzG+ NA5Cihcqca/Qs5Sws50eKMvdorjt3nSmunL5wAnHH4tVd/4Fv8FRmkiMZjLD zBVaSFK3d/3Hfzzrec99ME3M3b7sT5d/9KOfLdUauEKYUSlsDz45c9fM/VY9 1mh2fnbWL4qlGoCe7x+lLGMnoF7hCPUz5INAIwwFEjovhhuedpH1qrX6bBAn 7lDMFzob1k5sXL9qdGQwm0nsndyHJvP27Tv37NnF0zEw2Ee9AYZjihTIacR8 Kp0GojzTvVouxtpMnoRYdE6cHrShpKAw+tIZ1B35CTYowo+M5swVZ4tzsoAB 424s15ez4objFF8guIvatFu9mkbKY6F3+iL92blLGNwve9krUO3wx/Cd73w7 82CuixqEG9evu8Nxxxx33LFHHXXU6aef/sUvfjGZTk1MTNRbEtjkt9k8sWEN FAtQygFYefnmbu3K+V1v4S4vl6pcHZ2Hk6eUA/tZvgzxZ6pbKvq7a9fuHTt2 bb1hx9ws/h6IhFkmK+lslkxiCBZeKFpcDLTo5qrFmVIHAgDECQ8oS+md4+IT KnWDyaA9jZOD6RHBIHCdCYDYBq0Grc1l4ntftWoVUtg4D1AEwweAwAArrrrF yS9Ex9740xsN/xIAU2Dq/PPPd2vEDH29PEzGbxn9WIdDet555y2i798zbVgE 4L/dSj30ddz12d+RRx4JRRmwRCqSCb7vpRdu+Us77c0c2YNcyqnUpz/9abQn +ZMHA5fdC17wAoQnAfIeYLsnFmno5z73uZ4fPP+QhBkIsGAMiMUDWpLJTLRa udvf/vYPe/R97nXPE9euHctTyshi/UqWBWMtwyHMJPT7b3NfHnGwgHAuB+nL Beede/0THvf0HbvKzWY2U1jSqjIEz/zh91889IglBvmJaiOWTDOE24/NfAyJ YL19MlrXg+c//y2f+uw3ui2KuN1hZqYW5KgAiGWRhaUin5mqCxAzBtsIBs/l 8q1jjzvkUY9+0MmnnDgxQX0Y8Xfh+eLmVfpHEFx88dT97/uUyclGOjNYKe0a XZb/1bnfXb8O12VQLwX5XFBrBVRyw4C74/GPv+Kqa2nGfBazdXb7jb/ty0HA UfSaZBs5FaWe1YuyWY6S30Q7fwZeeShwvtdkT/HnBedf8eMzf/6N0783OYWb Eer1eDaNp2Gg06GATR+wwa+URS37g7/guhdb7b2ZxK4XvOgJz3n2Q7Pw1drB rt3Nu93toVOTrULf6mRmmCLEHWlxmMdWfgpvRrmyw0qL3BCjy3L5mQx9Bv/B zMGbR7/y1bfkrCLOth3VF77wP37+s9/n+5amUxQhbs/NbX3961942rMfKMVK c3lQ0y+VVRqX2zh+f0I+s0UT6o3gS1/50av+43UdkqsLY53uYCI13m5ZQS0C Eik8ETMJxE+IRLTLxblJBEoP2rTq7qfe6b73O+Xww9YX8oZ15rIhmulxx717 95599s+ZODLucxf68v1YlghDgkMIZVgL1/ElB81y3LyvsjGVpSNSPkCKoiM1 hkBc+jyTId737t4DRB1yxJEn3uXOJ598MlNeD+jIzLVHUke/SYJs75HkcOlM DquZiRtbvvKVr3zf+95DBSPKJ8Bdo5NQ73DFimWvetWr2fId73wnfMn+ocFU BtGPGvlsEMfMqWOPmrWd/rBCJZYinOJMp6dncNfTk6i1QFyJ/GNeQ/0MDqYT 5yw1ebNi+/bOnHPOuV/7xrfPO/9CJhXxJHQqyj9QnKGP2RczV/GhMZTLNYII ejTVKxRlVueQ6nip29obS1a7LUXHIAPSn2kBqjE+93mnHXHEYawwmPQiKd6x aUMEan7yk5989rOfveiii/iE8aenQ+Db+OsAR/RCFzTfgrI9uO1J+9EYfju8 ZR73uMd9+ctfXrjPxfU/2wKLAPy3OwZwaHSM8HXCCSe84hWvuMc97uH+tIW9 3FHzr+zRn0DvtT40ILvxqEc9quc1Ovvss0kCDkcW2xtPCFNanoGNGzdqKkAG qXlS7Sje48OMQEyIbqtw/HF3f+Ur/vN+979dvRkk0/AqbQtTIRT0+i8OOEcf mO2dUZShDD8tqHP1VfuOO/7UUhUvGfWAsRRnfvvbLxxxuxWWoBJnVOdaNez1 XuzBDQXlbySIVnO4b3373Ec+8qnx5IpE96B2dyzIDirK3M1TtjDoUpNnXyI5 lUkjN7L9MY+933Oe89jjjl/j9ov2A/Sa7JDmBgqDxSvV4Kgj73PNNfuCAJsv fYcTNvz0Z+81X6r8sI1aJ53BRRxU68ErXvW+D3/k022KIje6w6O5rVvPLWQ1 yWjXW7g7JcpPc3nL+Wl7m/QENCxbFLopVoURuNQmbDNV7nzwg5/+5jfOvOGG cl9+XSa7olpJDQwuE73GHBLWIBRgmK039rTbNz7rGae+7rWPNce0zX5iwYl3 esRVV02lkstz+dXZ/DLKUsG/9SZUeM5dipIbJJaJU5HkMbG0qZWDrGajsWdu 9prX/Ocznv2su1mcMyBOyUzm1Hs+/ZKLt2Tyw0T9W63p17/uxc942n2McGbT FsdHLjahi7IuIWgOe4G19bbtxaOPOb5cTQwOrcnmViVTE93OUDKRI9Ta15eY m9kCEw1WWml2x1FHHfxvL33BKfe4fcZJuIbl5kHQukLpcqBrFHZQxGD65je/ Cd7Qq1euWM1stZCjlj3x7Dr+j3ZtDh4326cTckrLPFVAkxpYcA8SUzMzmLC7 du2ifxx71LHPPO3Zmw49DPNUB7K4jHtT/+xz52ApjQtKHhFCT+Fph08cdtg3 vuEN73jH22BEj1IzcGSEQkSVcpETwIr9t3/7tzuecPzrXvefl191JbY1CM17 Og+z3aYH4Z1yMFYuPdy2ZqOLFNfszNy6dRse/7gnP+tZp8m7Y3qR5msQE158 LpWCyDqDRF91g0suufzTn/3iJz/12WQiX67CNs+lM4wqSXW9IElpSjmqjFWu VDlhME8WpDYogcVWfbKvL4O/gdM4+aS7MaU4+W6ncF/tWPuNSww1tDYeNZEq 4NCl04wzb3vb23784x8zFvWyIsPbaf/8JQu4d/ILm93b3y0KHwA/9KEPPe95 zzvArb1w/4vr4bOz2BB/swV66Et1MxR2kMV44AMf2EPfnhNGUjt/FX09EkMf 7WG2l1lxuPX9oL9hHi292BsbgL6s8+6PSgS6ftYeyfMnBgsp9d73vPPcc795 7/vcjicWk8tIphoyFOsjYcf9q4bHB76iABBeQoZ+uSZjwZrVY49/wsOg/LQ7 sHYRo1ZaIjFWrzZvcTbbneNTODJpHauLQyiwFQuu23I96SN4vKkmmEr2JShI HAwnOnmrAUxNhTJDX/9A6ydnfvUjH37lCSeusT0x7af+AYFqF83QKalBGMLw llIdQYkTJMjkLr34+uuvVeDLVZkyePI0zgW5FHlNQatSkmmVzivPBD6ytVaC 0kj4/iBoAUgh6IZXYRHDsCH4hrhaCoiwq6PpNJtJBSND8df8x9NOP/1TD3ng iaXi9fXK9nSK8ohVbhCOgmx6KJ0dzGQGk2lqzDHmx57/vMdyTgpzd2rcDkZR iOXQlZ1uk071Z7Kjuex4Poe9vySfX5LLjebzY7n8mL8XCuNacmOp1GA+N5TP DVCXlpwTC+DiyWhlSWuqN57/nKeIhd6ppFMdLlxpZtENDV0HVqbDo612Ouqq rinhr23bthqpNk5hLHAX27dvYDiRyg0PjuADJvjbbc9k0+U3veUlP/zhZ+53 v9vnCGGH8xZPdA53RdKQzyzFwpOvuMuE9S1vecub3/xmgik4Qt0FSpx4yZKl y5ctW7F86fKly1YuX758xVKMWl4YyrzEXi7k8c7ygBDcYQ/v+9CHDj38cALD HsfxjBpZoZEg8wFdWl4FseF0hdwJbiPo63LQXLU/WVjkwBIvpgUclLPAefux j33sc5/73Lvf/d7jjjsOOxLzd+Wq5WNjI2Njw2Pjw6NjQyOjgyMjwyy8mEmw HxKRQTUISt/5znef97zn2MxADqd20+ohSYZaJGfQ1x5GQ18Rv+u3O/KQt73l tWf++LvLlo5kUpCzKBAJNZIG5fecJxENKnkpAzAKlFj2OQHjZjOZyTEvoTjx Zz/76e99//RT73U3fPyOvm6P9kxSVpxMKle/0TlxITD158XJ9xKTFv7kL42K vrHfWR/ueqr1zkv1iRGxs0X0/ZvIwgb7GTB/zw/+F2/TS3HzR9en8D7L5mnh +WTCCPT2vC5CPXthpOJw2717NyEWXj7Z7PV+j5SwsY8a/nj4hJGH4dJLL8U+ 8A954RqizDhubUYrfuXdnY2Rg/7ABz4gCNctc9xTOVJhAzSabrBy1bKzz/7F A+5/HzCaHzHQM+KbrASa0s19k7O7dk/t3TM9V6RkbDeBioU/nozCpi3LCn5Z ZZjqVMgDxv7QFH7X3rnvfPsMGEPK+k10nvH0R04sHdZMPBbbu7d1ww37pqZq +yark5Ml3qf2NSYna/umZib3ze7bOzc5Wf3lOZe84U3vmisixJHLZNe3moOZ 1LIGaasMRRk4rjtanW33us+Rp3/7g0ccMQCWuLVHiFKXGUuUyp29u2d37eTM Z4ul+jXXb333ez589i9+224ROh0lEIsY1ve/9+OxsYl+SqEPZaCkKm9aKbjB z3520a8vvLRDqDHZl06l/u0lT4DnyyVDHxNI4O2VqWzXa2CmVV0Xs5/Y1FT1 hht2T06XCdQ12/FcFqZ32PFdPmx4MHuf+9xlfHTinHN+WS5DhlIBjHgyl0wV iLSSqxQkENef2Xzw+LOedmdDPDBJR4JK8+lPf3nPnlIQH8pkJzKZJcnUUCIF bZjSVWS2go+knGELZhJkghJsh1fGSgKoIKWK6RRpPZMnnnjYsXdYZ/lnSsiG EU0W1ic/+TlqAkOOJpHp5FNOOOaYzTCAGb8b1eYVV15fq8V275qbKzb3UTiX NKPJ0tRkaWamMj1d3b1rZtv2qde+7m3XbdlZLScHR1an02OFvgk4bblsrt2o kLBULm4dGml/6Uv/db/7nYiHX4QnpZ8pHVo3rN2dmpqVCUiaEOxwzSzkDJCT 3wZpPtmwYf3JJ5/0p8v+dO111wCisIaoXo/fN5dJ5DJpONJ0dbAOPNCzkUyU maTMzuybnBwbH3//+/9rw8aD8LHCUmKn/jSJq9Xu7Nm9Z+eOnUiCT01OqtAf NC5FF8IN/PEkNpskn5hkL634AxX84he/uPDC3/A8jo2NLhkfxywvMMEZGsrl C9DtcDhdf/31L3rJi66+5qpSeW5gsNA3kB8c6uOCmOYCujiLs0lYEd1KmRKW yv99/etff9qznpM3BjgPpoBWvUkugbli+cYd2/ftnazVG5lsn2UAq/ngsmGC A1srVix97OMet/XGrX/8/cX4yeWPT2QJpybiGTgayG2Sr0SjSsSWFCV+11Yw Hor/EYcfdvrp37rPfe6tgcVqgqgX26yK4WVychKWgI9INBpt63N6O0MIdik8 1Uh1XnDBBWzmoS42W+hMdoilLiot4w8AAx3O+bm5OUht7J+dMzSxzjsDIJ+z AW37ute9ztLJQibp/2LU+G9e2qILOmzAXsIPXdA7Ih3UOy5/ImgHQxI+hT/5 9nTFmeX96Ec/gkV1ySWX0Pm8Fql3bmI///mf/4mb2s3iXvDY4bwXsuJhIFLC xNl7ao+2wAqmwLe//W1YIY7TV1999e1udzvmsAScBJEAWi4D70Ohwm5wxJGH n3HGD5YvWw0nNE1eiZk1e/buPPusX37tG2dcevHVN2zbJmZ1s1OrlYdHRw85 dNO73vnWw484pC/PPEApM5ms3L5OWJFpywrZNY3gy1/74TOe/YpWjcd1NNYp X3jhV488EpkL7f8FL3rLRz7xWXF77ZSMh21J+opRiY3KwAHHpDSH9x6m0vKg s7aQO7Rag6oDz5bi7X/M900+9GHHvO89zx8a1o/J9iKIy+z/hhu2f/f7Z3zj az+47vodM9MlK5dHQkg9mSHLJd6uMYYuj8VWFQoT/GqutLXQN5NI7334w076 xMfe7qK5vF7+qve/+/2fbLcY3ody2dh11/1okOgzFrBjrQYqM9btWmh+DzOf 8eNzP/yhj59/wUU4Fc32hbibXbV62R2PP/YBD7zXKSefmEV0hDPQRApSWPD9 7/3uFa96/57JoH9oQxAbS6UJxPar8FV7qta47vDDc2d866XKrVG0GQa7FEfu etIDf/u7ben0uqHBwwv9m1JgsLzQikybqph4rlbxnf+bsJKUp4XpigUfJ8/1 xtnZP73kxQ997nPviUKI0pGtUuyWLcVj73hKs5XsG+gHgF/zmn972lMelLGp 2jnnnPeIhz0BV3yzCWM3DVsWw8wkHTTFonPS96yOIDRaMn8yK1cdTnw6nhos FEZJG+tU97WaO9etz3/ik29eOpHIZE1gHLpfN16pBT/9yc+/8c2vXXPVZTMz 07DY+wcKtXoT9tzq1atPPuWu97znPenGJGr5U8MjQyLvq171qiuvuJoBfWLJ kjWrlvWlgnwaGRDIRBn6J4FgwGbH7l2k5N6w7cZDDzv8Na95jbSfmATXG3El QbfheZ3987O+//3vM1Vl7otTlXxhZis8kw9+4AOf8axnrV23zu+vgggkBIv8 Be3bSO6y2NrMaj74Xx9461vfTALSypUr1qxatWTJGLMBJdIImFLAybVbrn/m s59x9NFHvvyVL1u1emlhMIcaqk+mSceiw5Rny7Ta9FR5Zmb2HW9/19FHH5OM Z3DQYG3zLRnzO/fsJuHwG9/4Bl6aiiol60EeH1l+9O1v98THPfbkU+7U35+z fHHvsKnZYu1d7/zg29/+X61GMt8/noALLeo3X2tmZi7vJrnv9fr04GC6OLPz mNsf+qUvfmrDxlWWVcilKRt9emoSOwHT9sILL8Tf4PYo38LrhLYCZ+XBD34w hn7Pgc+3XCwh2x/+8IecRC/nwi0Qf18YA0Ze+1vf+hYDY8/bzCDmFBbnynAf 3SZxLF+0g/86QkcT+/8mjv/r/7zHMfYew3ihhEWbFW7evPnrX/866OsMZ+9V +KLxUEFgpuPSQUFfrF6NZaQD1mqQAB/xiEfArrrsssvwYDsL0SMxXljQc4vd He2mtsGAOrFDPsznT37yk3zopQnxfnsGFCdndFH2UGcyzvO5ft3aH/3wjBXL VjI8gL5gDAHrT33qq/e4xwMf/4Tnfec7F1x5dbFWHSgVB2qN0Vhi9cxs7rwL rr3HPR//yle/+ze/2wqIM+5NzzVnZslYDWZK3clpBJGCYqm7Y+fUu9//vlat jLQlDz9eW+WJSNNP91tZmi00njLNdr7ZGmg3h9utUZZme0xLcxj2TGmO8x0L 4uOZAnOXDOG9bAbznDSSKzOFuVPve9C73//8oRGxcplG5LPBvn3NV738XUcf dY8Xv/At551/zfYba+VSf6Uy2O4sj8XX1itj7ebSIL6KAHAiNdZo9rVao32F TYnkirm51Fe/fsYlf7pOY6xKGfFOnAwWMXkaqifj5ojiaKRukNVc61QawZ6p 8tRcY990o1jp/OTnv3vwQ5/+yEc/88yfXDQ7l67W+pvt8W5seanS/8dL9n70 49956tNfdbdTH/OLX1zSacuRCHM7l+88/JG3f/d7XpTJ7i6WLkuk9qLgEYsh PKL8VfoPJpprVxuL1fQONUNRYwK3pCyr4nKnJkULK73cQdSiA9FJsmUqnYvY BelVLKhBRHmiBAdJfjUlJsbmcAJt0V4sQrQdJOwE/Yq8Xb3QQEEAA9IYST1p fCqDrfZg0BnvsHTHWt1hliAxnkgu6QbDzB6WTGzGIpcGYqc9N7uv2Zis1LaO jnU+8IE3rFwJ+up4TdXCiH/yk9+5y53v//CHPe2HPzjn8iu2lorVwaECshn4 bOmZf/zjJe9/3389/GGPfOtb3j45PcU5e68eGOgjtrpq9Yobt+E8kS3FgwNZ nRtG7VyiC6hu7J2apojujTt2rFu/4ZWv/A/mCUyaeKjiqUx5pvi+97zrEQ9/ 6L+9+IUX/vr8mal9NXy/hE+zWP44CuJf+dIXn/j4x37iox/ecv21pdlpbkIV OnK1WpybMSF0/B9o1DAHi+G8BYd4qHkSMeB4PIsl3BJdgkJU2ULolNuHPbd5 88F3v8cp1FDh6dMN1eTDJFYV68YJNAnx6l3vfM8djrljkpSDDh6INIliM8W5 N731LXc56a4vffG//fFPl+3eN1utd/uGxmut2I49U2f+7JcPfvij73TS3b9/ xk9x+Cvi0oLCTe519rWv+7fnPPcZ/QP5ZgP1FFThQj6Uq79hVzca1UIhO7Nv x8EHH4znbMOGNbisPVd9anrqve9936GHHvqUpzwFLjd8K87ZzVAGEOLoP/vZ zyBy8kPmQFwaWMtIxU8JB5Dai7XAcLQwsv5nB3W87j4QsVsXZmH48uCaupsp crBbRi1utxvQi6+/0gKLDTTfOD0+wsI0XNxN5557Lj7hXoDkhhtuePSjH42v uJdx1KNJey/06Jfvly7IZN9ni/RX9nbve9/7ox/9aO+oJCO6EIeDvcO/G83M VTGvfed79uzBqjjAUGbL0dHhn/70pxjKNgLL+7r1xqnTnv2CH//op6JxBP1B AGl5QOn/4jFxZaywv0rQqcXTsIKbeBRzVOeTipNpgLS7zCSK01OsM3Sh/d9k eEwNxjrEOFu/vuBLRxyxBnoQCbov/ve3fOiDn4vFB4NuX5w0JIkdKrPZ6yNh bSFqJC8CKajxPL5WRvxYd6DFQJos1lt/OvL2hR+c8b4l44zpxFCRcMz/4qzf P/Wpz7vuhh1YzOnMGHSYRGoimRywDBOSJjMIBCrfKoGORH+7MQjvNxlLN+qT jdaWZHpns33VJX/80WGbJ6xEROLlr3rze977Wai8mdQYIcxt234eT9QwhwHA G7fuedJTn4VjlgggaIFrDhd9ZaYYSw+S3oJ4RqYwToAZy1LeUBmwzWptFpEp RpVkrPb85z3+tf/5HOZFtDYaR9ls4V3v+8prXvf+dHZdKrmhkF+FagiVlSuV a2531OiZ33+FhlGLPTIc8X7XUx7w699ck06vHRg6uFA4KJ0aj8WhEUtFBA9j W+Ik7kjgftVJ2HVGmqzVoFaubp2ZufTlL3vUc55zb1S0EppbwK6Ob91aOvrY OyE5le/HBdp+/ete9synP0R2fjf48Y9/8eQnPbdYYeozlswMxOKZWCJDAD5K fzIjh1ToTF+13pGgmKQo+9LZTLE0TUn7eHv7t7750U2biUALzvHiTk9Wnvu8 l5199m9rdQydZjadGB3PDg+nOHJ/Xz6bG5ibLZFWK5Jzu7V7905sL4oUHX/H O3AVoB29C+Uppqf0wtHBvjXLlg7150aGRun5UueoVPbNzG7bsT2Zybz3v/4f gQX3J/O66Ne/fcXLXn7dddfQgQlTpDOSzOwnHzvXl8mmctkCehuE7SlNuW/v FH6EQq6PWIAyieuaFjz72c9+2EMfQVzZrbc3v/mNiMJu3rTxnvc8tZDLXH31 lTt3bZdoF8GDVieTz/FMvejFLx5fMjw1s+/lr3hJppDKFwAVw5talxyhUgnv /eQbXv/mk046hdvFDZKXo9394x//dNpznssURMEhQgiqEpER/U59Kc39ZGVu VsVCyOZ7wuMf9YEPvjfDc9hiXk7RSWa0wX3v/bizzj4/myPCwtNPPAIWiCZF QQd3dymeqA4NpM875+wN60doFiZwuEe2bd/+2Mc99YLzf4NN74OJU0ncXdcb i3ru5SVLlkBQP/bYY93MZQNm/FQix5Pnfri/ZAE/+clPhkTN/t134sfqWS8H ULp8J4sA/FdaYNECnm+c3jzOiYJulb7nPe854ogjwC06NLN1vM2wlH/zm984 xPK5k6Q0Ytocnw7nX9EX8ca4h8cjxKww5SfvCKaV/wRIdjkOPUg2l+xRSzgH eF7eg91itniWvGiQLkl8cePnPe95HyOFsiSlehFcceWW446/04/P/CVyePHY UkzDILYsCMa78QlCsAz6zfaSdpMRf3U8ua7bWdWojpVn8vv2pmamc5P7krt2 NCf3Bdu24P/L7ZuMVao5SgoFseEg1p9IFQg3w4mt1cuYmGQF52A6YQuhYQXA x5amYmuS8TWJ+Np4YkM8vrHdWtNprogFq1Op9dn0unptoNsmitlOJee63W2F /un3vv+lS8aR5CjhOoRq+pUvf//+93/k1hsng2AwkVjeqBNPPTgIVraaK1OZ Q5OpTZ3O2kzy4HT20GRiQ6ezNJVbituSJZ2BxLQ0mRyLx4fgunqzKEgeCYzI Oa4kjYB0S8ZWvvv3l7/+3F9dsntX84brysw0du6AfDyaKqwnrox2dLZ/Q6M5 HIstT6ZXJVKrg/iKRGptvm8z7uJsfgPr73jnF5/8lH8vkYoZpAgEMMK85MWP fvCD7lScurzV2t6o72g3pxJBpduuwO9VTquxfuaVBK3CsvmUmfSwgRZ0KE2K EpcyC3m3GFv2eRuxC1nJGM0oYGAZe6+z7BcZ++5Ot4sNiyPJxS4StbGiYsHQ 8CgmJhQ4co7JFR4YWD3Yv254aOPI0EGDQxsHBtf1D63jHfN3dGR9PD6QTpHS 3a5VJmMBao/Xv/IVTz/sUENfc9Tv3jlzj3s+4PTTfzI714bF3FdYOjy6dqh/ 5bKJjQdtPHz1mo3jY8uOOOLo1avWTyxZsXRixfr1B1Wrjec+9/mwk9iDV7/G q/+2t71lcnIvniGij7PF8tQ0GqjxUrk6h6DlXJEvXvrvLyfBNxy+O7Hvnf59 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 gtuUJGojL1GsVKdLZTJ59pUrM6Uyyxwkar0Xye7RC1YQlQnQW/7WtyQ74w1y 2GGH4RlmG+jKyGej/Aw7d/XatXytiE6z+b3vfJsTo4dAuRoZGh5fMoptnc/l 0kkIPiYep0mZW182lFm7uSdA/gO1CYnUC7rF/o+r44TSe1WIWO8ci8lmowkd bCZFlcR0nGrAzH5EBCElIJWm7jAZSXe6013cv8IcYPfuyS9+8fMqMWJk/VQa U38IZz855yZbZWnc6LdoFX+UfWbSqpqEaRKQpPgi97Zcb5GDTmUq/Alc0eBA 9qS73hXopS4z3iNiEGjZ3PkuJzK/kARKp/2d079F+JzKjIwPEdfkz/em/S96 v7/cUw2xuScKfeKJJ+Kx16UtePmfvK9duxavNTel54X+Kztf/OpvtsAiAM83 kVuobt1C3aAUj3/Hn0jT9SZ3tyD62kik0aEHuj2XUe/DnoUd2SuSM6T+0vIV qxgCOi2Gqu63vnm6IsgM9Eg3pGrIXHRjezqJHUFiV7ezK2hTuWxn0NkZ6+6I BaDF9qBLMdEbY8E2LV2WHb4EnRtnS39qx25otW4YGmOPezrtvUGsmM2Apo1M SgxUnbM1Cxzt5z3nmXhjmUzbPJ2822a8g21NCVN4vKzwZ4vS7QCzkXu12THH HjkwLBuaV6XS+e53v493jmgRcet4DBc376gTkK2REs5ZmNOK7OolqJADU3Fo AAA/nqhLFNpLphpVzIt0k/zlv/4Kh2IDK2MOey1BH6xtMSUujsg4aKBrKKYS R7YQmkREM0taLd7XfG5k147Zc846r3fMu93tZDOUYfChTqAf0KdwPeC84D5/ 4EMf/s1vf1+ptlLZETy3yRRedzKCgHwscpmriW4y3smwxNDZ1oe6cDsNSkfh W8D9TpGiwXYz+/nPfmvXLuw/fuWRP+e48obch4o9223C1UwCdOehD7vv7Y85 nLLE5NlybpoYWPjZVNXUIiCvmkISTQLleqNMetshm1fKvm4FxFa/8bUzcKik 4iqh0WlQIaBYr+6rVHdVKjsqpd2zM9un9m7bs/PGXTtv3LN76+5dW3btuJ5l x04tO/lzzw2T+3biQUH96ayf/wjwoNFVFyGTOO6Ox4J90KGBYXy8CHcgDul2 KpBw5pk/dTNrcGS40N9HrpHqGBL0UVHrtgoAmjwYi9rXnxC7gVycil+HolNm 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 xNwf+7Efo1YSZAwNU8GQtBuhdrZ7yAs8zNN45+20KQHPG/R54t2CgHTMZv1T WcN9+n1omPxZq7yQw7KZmuXYbbSQsscmuQrataB6iJeUWJ0Ntapkrbj7qJas K2XYyNBhXKxexOEJVQmyc4Niz5g6ekxfbTQ2Ur9o5ERGnwXJRqts+ttKpw3O rorvVMTNsbWRpuyf7cNh0h5vLtCSn52Ai+Ub0/WEw5rjLF/tklRSMUUmFjsP mwO1YPeAZ1pukq2XCr793mon4LutErN1ogvs/laie72s+0LA9Q6Y1ei7W266 7FQ2IOmWqcfw4Q9/+B73uMfVV1+NARhv5+9///uCCGEXOfi888478MADoWFI 95vf/Oa//uu/2t8Abgb+WlJgJgEvqcu9BCYr4igyIRxM0STe5indG1DOYSU5 LKmqNOPO0giP5gVShObGUyk8iUZpydL7e+v2MSEC9mpL9q+TQaWrETtrHOW6 3y6ud+Io+7lxrXKJdjYCtrM0dmsnuXrGzT7ITEvc9e892HjCMbVzkIYX/ZFY MNCkuv49n0n1LVfqSjjTnqLFYzyeLUbALgzRhZc2sk6K4sHCl0o5KSd+10kg +6J2xr15emb1sNh6SSrp6fs1fk6lOOZO/A0C1t4wVC+Be37PmGJbKvhTn/rU 4x73OKj3h3/4h/nT+Ju/+RtKBRP1qzsW3n3iE59IjujVq1dTJBgXrQsvvBCV 9Z4xjzkdRcYBzyncebLdjADPelOHWrJBYzjUxTy1VQmHNzrMDUOe7OaJ5HGu kvMU8urKUI/3scd8eb6X4FH/6o/1knjDk07pPdrYnvtDbMx6m8wH07uAWGVr 82suUrisnhbuLF/usbcvDXxGlmZLDbxliW11Sb0k0PaMUq7+Lc3KsSHQWw8+ 30hI4sG+jRbaL03MVKzMLCw82t6FNZULxbJkWD4yn6aKIvjELR1HRaZA1GnI rQfLX+aaf9fku/jrpR8xxpMshWu0ZtjDu+rOmeEdMzN3DId3ua1XMd9N5hA3 vpcL1d1SQqCsp7rA8d18z2X3QkAKZGiYDfJhHX300b/6q7/6J3/yJzfccMOv /MqvvPKVr2Qxx/a6deuQg6nN8P73vx9r8THHHPPMZz4T56yrrrpqrMDwUgA2 JeClcJUX4RzNqWcWbVUp9uB84DmVOhWl2AsXLd77Ig1PDUwanp5Zjho6ZFYJ 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 zs6RNuD8a1pkCDT2zp2dWXSljkyiQuDzACPecNKyKctwabktSXJJrGq/txch M9h9XdSUpRYPr+KBJVuwqhQrcYELCx7UU/4QpdR1lW+E1ug3o70YTzewEsHc OV51Rrg6ZpNuvYOSKsG3J7R6CuVxzbhJyRZ761OYWVWrG8nxCoW8u62ZYnnD wFJibaKW8NBCuVQjAZuf54wsiusi8jZ7tvWqqKwsD25CVlBd/su//Muhhx5K +qSTTz6ZwnY/93M/h2vPRRddxGNdywl0n5s22fPazj0zMzVl9QDYVP075qcO l2bO4W0FfVe0i3srlNLUBv6DP/iDxz/+8Ui9ZIfWVZBeGsPwy172sp/4iZ+A rQ8++GACgp/+9KeTt9IvqGXqWNx1gpOAd8Udl30sGQQsnLgIXctgXKfhlZbu yioe7oWCetDH6wqnLdPTFlRqamjRrYvF4ajlwTvhtGWK4HCSEuXXz66kYKFS dV7TcRUzbUiEdSP+wEtuDRddi+NVk6gDBylotXC8HqCe/sJTXDmbmgrdArTQ YxPLi/p3LaZxONjDec1eXi27+rqzLzn1OINaBn95Zr3zne9805vexNT++Z// +T3vec9P//RPn3TSSTD0u9/97rHCdnpq6wlOP3zFCcgm5ebJnR1cHr/NCOhC sPQB9p/92Z8966yzuJqvetWrvvzlL7duVocddtgznvGMY445htzRFGl473vf y6/wNFdQTtHbfMIF1jAJeIFdsBzu/CIgAlZKj8qOomE+CcNwzbORliVeNsm4 t5/XZbII2VI01wjYQ2o9TNdJzhq4OloxUaFWbf88O8/niaQT8XjyA3Hd8mBK 7zNkZXVV6KcENTWVnSb9XGxpgOm6v8YDed3ty3yYGR6kiDuViFZv+ZcZT++q qyNpld5UWZbT/8zP/Mzxxx9PyMrznvc8vKNPO+20W265BUq+z33u89znPhcO vu2222jP474l71Z+UnKltmbArhpt9jMrAmPLHRyvWA+xZnr1q1+NHPxXf/VX WBZ0oNJd0UAXXVFMbOiSLWJH6HTCyr+dRGD7EZASWoZbefx2hR88whXesroC ZDbeMGMeVeQ3thwUM/31luhjQJispURW1i2kMvS6VpqP5JieXdkVwZZaw9Td SrTlaTDs06yu+rRWXnbClcZxlLFwKRbhOm73VjbrsipHuNnZNugd9rdTM37U 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 hthkM6YZ26SvImroW9/6FmZj+TBDgXAqDlN4dSkTCKRLe/yn0GBTJFE6aigW /oZu4W+2yZtBXknEZRyv6BC3Lwj+2muvJQJKY0D2Re9NSFKkp2anfmI8swZA txNZMBcmB5oIJAKJQCKwiBFopcPJ4CVFOjF9PiPtZUQ6CZYgPOiW3tAhy5lZ zM0eqhIRDRysrN4w5SLj4q6M6zLcCZXi24wT1rOf/Wxka+iWwGJaEr+EWpv4 otWrV+MFpjMqp2awb6jHY4NfpfSO9UFMZBFfypxaIpAIJAKJwMJDoHXCaqsR i7fGCgUGs4pK+ZT7NBuh79WBYncRIdkw6Kcth3DQQQeRxIq8GcKLxsjNEDBG 3+9+97v4Wsd5oXA01crAFa/WsXmMg6VRbxurwRL0hR5BYeHdmDniRCARSAQS gblCYHNm2uFwOFdDyPMkAolAIpAIJAKJQCKQCCQCiUAikAgkAolAIpAIJAKJ QCKQCCQCiUAikAgkAolAIpAIJAKJQCKQCCQCiUAikAgkAolAIpAIJAKJQCKQ CCQCiUAikAgkAolAIpAIJAKJQCKQCCQCiUAikAgkAolAIpAIJAKJQCKQCCQC iUAikAgkAolAIpAIJAKJQCKQCCQCiUAikAgkAolAIpAIJAKJQCKQCCQCiUAi kAgkAolAIpAIJAKJQCKQCCQCiUAikAgkAolAIpAIJAKJQCKQCCQCiUAikAgk AolAIpAIJAKJQCKQCCQCiUAikAgkAolAIpAIJAKJQCKQCCQCiUAikAgkAolA IpAIJAKJQCKQCCQCiUAikAgkAolAIpAIJAKJQCKQCCQCiUAikAgkAolAIpAI JAKJQCKQCCQCiUAikAgkAolAIpAIJAKJQCKQCCQCiUAikAgkAolAIpAIJAKJ QCKQCCQCiUAikAgkAolAIpAIJAKJQCKQCCQCiUAikAgkAolAIpAIJAKJQCKQ CCQCiUAikAgkAonAno3A/wclAiiEhM1JDgAAAABJRU5ErkJgggAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAGoEGwASAAEACwEPAAcABgAGAAYAAAAEAAgAAACYAAAAngAAAJ4AAACe AAAAngAAAJ4AAACeAAAAngAAAJ4AAAA2BgAANgYAADYGAAA2BgAANgYAADYG AAA2BgAANgYAADYGAAB2AgAAdgIAAHYCAAB2AgAAdgIAAHYCAAB2AgAAdgIA AHYCAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA+AgAANgYAADYGAAA2BgAA NgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2 BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYG AAA2BgAAqAAAADYGAAA2BgAAFgAAADYGAAA2BgAANgYAADYGAAA2BgAANgYA ADYGAAA2BgAAuAAAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAA NgYAADYGAAA2BgAANgYAAAgAAAAIAAAANgYAADYGAAA2BgAANgYAADYGAAA2 BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYG AAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYA ADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAA NgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2 BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYG AAA2BgAANgYAADYGAACwAwAANgYAADIGAAAYAAAAwAMAANADAADgAwAA8AMA AAAEAAAQBAAAIAQAADAEAABABAAAUAQAAGAEAABwBAAAgAQAAJAEAADAAwAA 0AMAAOADAADwAwAAAAQAABAEAAAyBgAAKAIAANgBAADoAQAAIAQAADAEAABA BAAAUAQAAGAEAABwBAAAgAQAAJAEAADAAwAA0AMAAOADAADwAwAAAAQAABAE AAAgBAAAMAQAAEAEAABQBAAAYAQAAHAEAACABAAAkAQAAMADAADQAwAA4AMA APADAAAABAAAEAQAACAEAAAwBAAAQAQAAFAEAABgBAAAcAQAAIAEAACQBAAA wAMAANADAADgAwAA8AMAAAAEAAAQBAAAIAQAADAEAABABAAAUAQAAGAEAABw BAAAgAQAAJAEAADAAwAA0AMAAOADAADwAwAAAAQAABAEAAAgBAAAMAQAAEAE AABQBAAAYAQAAHAEAACABAAAkAQAAMADAADQAwAA4AMAAPADAAAABAAAEAQA ACAEAAAwBAAAQAQAAFAEAABgBAAAcAQAAIAEAACQBAAAOAEAAFgBAAD4AQAA CAIAABgCAABWAgAAfgIAACAAAABPSgYAUEoGAFFKBgBfSAEEbUgJBG5ICQRz SAkEdEgJBAAAAABKAABg8f8CAEoADBAAACQlPwAAAAYATgBvAHIAbQBhAGwA AAAMAAAAEmQUAQEAFKTIABgAQ0oWAF9IAQRhShYAbUgJBHNICQR0SAkEaAAB AAEAAgBoAAwUGQBycqUAkAAJAEgAZQBhAGQAaQBuAGcAIAAxAAAAEwABAAUk AQYkAROk4AEUpAAAQCYAACcANQiBQioHQ0ocAE9KBwBQSgAAUUoHAFwIgV5K AABhShwAcGg2X5EAAGgAAgABAAIAaAAMHBoAcnKlAJAACQBIAGUAYQBkAGkA bgBnACAAMgAAABMAAgAFJAEGJAETpMgAFKQAAEAmAQAnADUIgUIqB0NKGgBP SgcAUEoAAFFKBwBcCIFeSgAAYUoaAHBoT4G9AAAAAAAAAAAAAAAAAAAAAEQA QWDy/6EARAAMDQAAAAAAABAAFgBEAGUAZgBhAHUAbAB0ACAAUABhAHIAYQBn AHIAYQBwAGgAIABGAG8AbgB0AAAAAABSAGlA8/+zAFIADB0AAAAAAAAwBgwA VABhAGIAbABlACAATgBvAHIAbQBhAGwAAAAcABf2AwAANNYGAAEKA2wANNYG AAEFAwAAYfYDAAACAAsAAAAoAGsg9P/BACgAAA0AAAAAAAAwBgcATgBvACAA TABpAHMAdAAAAAIADAAAAAAAUgCZAAEA8gBSAAwJEACDTVgAMAYMAEIAYQBs AGwAbwBvAG4AIABUAGUAeAB0AAAADAAPABJk8AABABSkAAAUAENKEABPSggA UUoIAF5KCABhShAATgD+D6IAAQFOAAwBDwCDTVgAMAYRAEIAYQBsAGwAbwBv AG4AIABUAGUAeAB0ACAAQwBoAGEAcgAAABQAQ0oQAE9KCABRSggAXkoIAGFK EAA2AFVAogARATYADAgAAINNWAAwBgkASAB5AHAAZQByAGwAaQBuAGsAAAAM AD4qAUIqAnBoAAD/AD4AH0ABACIBPgAMCRMA5igcADAGBgBIAGUAYQBkAGUA cgAAABcAEgASZPAAAQAUpAAAFcYIAAJIEpAkAQIAAAAuAP4PogAxAS4ADAES AOYoHAAwBgsASABlAGEAZABlAHIAIABDAGgAYQByAAAAAAA+ACAAAQBCAT4A DAkVAOYoHAAwBgYARgBvAG8AdABlAHIAAAAXABQAEmTwAAEAFKQAABXGCAAC SBKQJAECAAAALgD+D6IAUQEuAAwBFADmKBwAMAYLAEYAbwBvAHQAZQByACAA QwBoAGEAcgAAAAAALgBYAKIAYQEuAAwQAABqTf4AAAAIAEUAbQBwAGgAYQBz AGkAcwAAAAYANgiBXQiBKgBXQKIAcQEqAAwQAABqTf4AAAAGAFMAdAByAG8A bgBnAAAABgA1CIFcCIFIAJ1g8f+CAUgADBQAAHJypQAQAAoATgBvACAAUwBw AGEAYwBpAG4AZwAAAAIAGAAYAENKFgBfSAEEYUoWAG1ICQRzSAkEdEgJBFwA /g+iAJEBXAAMAAEAcnKlAJAADgBIAGUAYQBkAGkAbgBnACAAMQAgAEMAaABh AHIAAAAnADUIAUIqB0NKHABPSgcAUEoAAFFKBwBcCAFeSgAAYUocAHBoNl+R AABcAP4PogChAVwADAACAHJypQCQAA4ASABlAGEAZABpAG4AZwAgADIAIABD AGgAYQByAAAAJwA1CAFCKgdDShoAT0oHAFBKAABRSgcAXAgBXkoAAGFKGgBw aE+BvQAAUEsDBBQABgAIAAAAIQCCirwT+gAAABwCAAATAAAAW0NvbnRlbnRf VHlwZXNdLnhtbKyRy2rDMBBF94X+g9C22HK6KKXYzqJJd30s0g8Y5LEtao+E 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 AAgAAAAhAKXWp+fAAAAANgEAAAsAAAAAAAAAAAAAAAAAKwEAAF9yZWxzLy5y ZWxzUEsBAi0AFAAGAAgAAAAhAGt5lhaDAAAAigAAABwAAAAAAAAAAAAAAAAA FAIAAHRoZW1lL3RoZW1lL3RoZW1lTWFuYWdlci54bWxQSwECLQAUAAYACAAA ACEAlrWt4pYGAABQGwAAFgAAAAAAAAAAAAAAAADRAgAAdGhlbWUvdGhlbWUv dGhlbWUxLnhtbFBLAQItABQABgAIAAAAIQAN0ZCftgAAABsBAAAnAAAAAAAA AAAAAAAAAJsJAAB0aGVtZS90aGVtZS9fcmVscy90aGVtZU1hbmFnZXIueG1s LnJlbHNQSwUGAAAAAAUABQBdAQAAlgoAAAAAPD94bWwgdmVyc2lvbj0iMS4w IiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pg0KPGE6Y2xy TWFwIHhtbG5zOmE9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9y Zy9kcmF3aW5nbWwvMjAwNi9tYWluIiBiZzE9Imx0MSIgdHgxPSJkazEiIGJn Mj0ibHQyIiB0eDI9ImRrMiIgYWNjZW50MT0iYWNjZW50MSIgYWNjZW50Mj0i YWNjZW50MiIgYWNjZW50Mz0iYWNjZW50MyIgYWNjZW50ND0iYWNjZW50NCIg YWNjZW50NT0iYWNjZW50NSIgYWNjZW50Nj0iYWNjZW50NiIgaGxpbms9Imhs aW5rIiBmb2xIbGluaz0iZm9sSGxpbmsiLz4AAAAAUxYAAAwAAFgAAAAA//// /wAAAAADAAAABgAAAAYAAAAJAAAADAAAAAwAAAAPAAAAEgAAABIAAAASAAAA FQAAABUAAAAYAAAAAAgAALkIAAD6CQAAjgoAABcNAACOEQAAmhIAAMEVAAA8 FgAAgBoAAIUdAABIHgAAUx4AABAAAAASAAAAEwAAABQAAAAVAAAAFgAAABcA AAAZAAAAGgAAABwAAAAeAAAAKwAAAAAIAABoFAAA4hYAAGwdAACZHQAAqR0A AL0dAADJHQAA1R0AAOMdAAD3HQAABx4AAB0eAAAwHgAAOB4AAEceAABTHgAA EQAAABgAAAAbAAAAHQAAAB8AAAAgAAAAIQAAACIAAAAjAAAAJAAAACUAAAAm AAAAJwAAACgAAAApAAAAKgAAABUVAABCFQAAWhUAAFMWAAATWBT/FYAPAADw AAMAAAAABvAwAAAAAhQAAAUAAAAmAAAAAgAAAAIAAAAjAAAAAAAAAAAAAAAA AAAAAAAAAAEAAAAEAAAA/wAB8JQCAABiAAfwJAAAAAYGzUbDZ1qb99ZW1t8S EUi+eP8AxIEAAAQAAAA0WAAAAAAAAGIAB/AkAAAABgZzN7sW72q1HtiZy72g xiBJ/wCBKQAAAAAAAP////8AAAAAMgAH8CQAAAADBL3Ng+HqxJIPXMcu2T5R AUL/AFGjAAAEAAAA+NkAAAAAAAAyAAfwJAAAAAMEvorT5QOAQOM2grtepEW6 OP8AX6IAAAEAAABJfQEAAAAAAGIAB/AkAAAABgbMEhh1VEVU9eiGc0RSYMif /wAGKgAAAQAAAKgfAgAAAAAAYgAH8CQAAAAGBiSAQrdC3oHS7kZk/Z2Ai6v/ ANboAAABAAAArkkCAAAAAABiAAfwJAAAAAYGJ1X7A1Kf2VbbyeCl+3vrof8A OkQAAAEAAACEMgMAAAAAAGIAB/AkAAAABgbMnhaehgbP0oRoeVfabHQl/wCn UAAAAQAAAL52AwAAAAAAYgAH8CQAAAAGBrTS01bPOl9oNO6oLJyiGPz/ACB0 AAABAAAAZccDAAAAAABiAAfwJAAAAAYG++yR70443k2zrsMizmite/8AGU0A AAEAAACFOwQAAAAAAGIAB/AkAAAABgYtzCGhGtZraOGGBLPr4NmC/wBiPQAA AQAAAJ6IBAAAAAAAYgAH8CQAAAAGBgHqSfVwR7phFOMQ/Vt0o/3/AG0KAAAA AAAA/////wAAAABiAAfwJAAAAAYGvuzA14Dcmqj4HpzT49k42v8A4SwEAAAA AAD/////AAAAAGIAB/AkAAAABgYJL4hCNgAzUogvg55bI4qE/wA6CwAAAQAA AADGBAAAAAAAYgAH8CQAAAAGBl3wwHAfqh/L/07yr6sYPwP/AKRMAQABAAAA OtEEAAAAAAAjAAvwDAAAAIZBAAAAAMVBAAAAAEAAHvEQAAAA//8AAAAA/wCA gIAA9wAAEAAPAALwOhQAACAACPAIAAAAEwAAACIEAAAPAAPwshMAAA8ABPAo AAAAAQAJ8BAAAAAAAAAAAAAAAAAAAAAAAAAAAgAK8AgAAAAABAAABQAAAA8A BPCKAAAAsgQK8AgAAAAdBAAAAAoAAIMAC/BGAAAAvwAEAAQABEEPAAAABcEC AAAAPwEAAAYAvwEAABAA/wEAAAgAgMMUAAAAvwMgACIAAABQAGkAYwB0AHUA cgBlACAANQAAACMAIvEMAAAAvwMAggCCPwUAAAEAAAAQ8AQAAAAAAAAAAAAR 8AQAAAABAAAADwAE8JYAAACyBArwCAAAAAgEAAAACgAAowAL8FIAAAC/AAQA BAAEQQMAAAAFwQIAAAAIAc1MAAAJAZpZAAA/AQAABgC/AQAAEAD/AQAACACA wxQAAAC/AyAAIgAAAFAAaQBjAHQAdQByAGUAIAAzAAAAIwAi8QwAAAC/AwCC AII/BQAAAQAAABDwBAAAABAAAAAAABHwBAAAAAEAAAAPAATwjgEAALIECvAI AAAAHAQAAAAKAACTAAvwSgEAAL8ABAAEAARBAwAAAAXBAgAAAD8BAAAGAL8B AAAQAP8BAAAIAIDDFAAAAIPD/gAAAL8DIAAiAAAAUABpAGMAdAB1AHIAZQAg ADYAAAAfACAACAApJAAAAAAAAOAgAACbBQAA4CAAAPgIAAADFwAAdQ0AAGIE AAA6GQAAYgQAAHkbAAAAAAAA4SMAAHT////WQwAAMQIAAMNHAAB7BQAAw0cA AAcGAACJUwAAKEwAAIlTAAC0TAAAiVMAAM1NAABLUQAAzU0AALtQAAD+TwAA w0cAAEdTAAAJQQAAYFQAAEM1AACKUAAANzAAAHJPAADaLAAAR1MAAB8mAABH UwAA4SMAAIpQAAC3HQAAck8AAFoaAABLQgAAQhAAABQ6AABVDAAAHi8AAPgI AABPMQAAKwYAAKsvAAA+AgAA5iYAAAAAAAApJAAAAAAAACMAIvEMAAAAvwMA ggCCPwUAAAEAAAAQ8AQAAAABAAAAAAAR8AQAAAABAAAADwAE8L4AAACyBArw CAAAABsEAAAACgAAkwAL8HoAAAC/AAQABAAEQQ4AAAAFwQIAAAA/AQAABgC/ AQAAEAD/AQAACACAwxQAAACDwy4AAAC/AyAAIgAAAFAAaQBjAHQAdQByAGUA IAA3AAAABQAIAAgAy/7//wAAAADL/v//W1AAAGBUAABbUAAAYFQAAAAAAADL /v//AAAAACMAIvEMAAAAvwMAggCCPwUAAAEAAAAQ8AQAAAACAAAAAAAR8AQA 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 cgBlACAAMwAAACMAIvEMAAAAvwMAggCCPwUAAAEAAAAQ8AQAAAARAAAAAAAR 8AQAAAABAAAADwAE8JYAAACyBArwCAAAAA0EAAAACgAAowAL8FIAAAC/AAQA BAAEQQMAAAAFwQIAAAAIAc1MAAAJAZpZAAA/AQAABgC/AQAAEAD/AQAACACA wxQAAAC/AyAAIgAAAFAAaQBjAHQAdQByAGUAIAAzAAAAIwAi8QwAAAC/AwCC AII/BQAAAQAAABDwBAAAAA0AAAAAABHwBAAAAAEAAAAPAATw7AEAALIECvAI AAAAHwQAAAAKAABzAAvwqAEAAARBAQAAAAgBzUwAAAkBmlkAAD8BAAACAP8B AAAIAIPDfgEAAL8DIAAgAC8AMAAIAH8kAAAAAAAAUiMAAGoAAADAIQAAjQQA AMAhAACeBgAA5xkAADwNAABfFgAAEA4AAOAQAAAzEgAA4BAAANoTAABrCQAA 7BUAAH8FAABnGAAAGgUAAIocAAB/BQAAmx4AABAHAAAXIQAAWwIAAFQiAAAA AAAA0CQAAGQAAAC1JwAAiAMAAFMuAADJAAAA4DIAAGQAAABIPwAAyQAAABJF AACIAwAAy0gAAOMFAADLSAAA4wUAAHtRAAAQBwAA9lMAAD4IAAD2UwAACEcA APZTAACQSgAA9lMAABlOAAB7UQAAGU4AAMtIAADOUgAALUIAAGBUAADFNQAA zlIAAB00AADYUAAAODEAALRNAABTLgAAoVEAALUnAADOUgAAviIAAA9QAAAX IQAA4U4AADsZAAAsSgAAKRcAAO5BAACdEgAAXEAAAIsQAABCOwAAPA0AAEUw AACeBgAADjEAACMEAACzLgAAewIAAHYmAAAAAAAAfyQAAAAAAAAjACLxDAAA AL8BAABgAD8FAAABAAAAEPAEAAAAAwAAAAAAEfAEAAAAAQAAAA8ABPDsAQAA sgQK8AgAAAAgBAAAAAoAAHMAC/CoAQAABEEBAAAACAHNTAAACQGaWQAAPwEA AAIA/wEAAAgAg8N+AQAAvwMgACAALwAwAAgAfyQAAAAAAABSIwAAagAAAMAh AACNBAAAwCEAAJ4GAADnGQAAPA0AAF8WAAAQDgAA4BAAADMSAADgEAAA2hMA AGsJAADsFQAAfwUAAGcYAAAaBQAAihwAAH8FAACbHgAAEAcAABchAABbAgAA VCIAAAAAAADQJAAAZAAAALUnAACIAwAAUy4AAMkAAADgMgAAZAAAAEg/AADJ AAAAEkUAAIgDAADLSAAA4wUAAMtIAADjBQAAe1EAABAHAAD2UwAAPggAAPZT AAAIRwAA9lMAAJBKAAD2UwAAGU4AAHtRAAAZTgAAy0gAAM5SAAAtQgAAYFQA AMU1AADOUgAAHTQAANhQAAA4MQAAtE0AAFMuAAChUQAAtScAAM5SAAC+IgAA D1AAABchAADhTgAAOxkAACxKAAApFwAA7kEAAJ0SAABcQAAAixAAAEI7AAA8 DQAARTAAAJ4GAAAOMQAAIwQAALMuAAB7AgAAdiYAAAAAAAB/JAAAAAAAACMA IvEMAAAAvwEAAGAAPwUAAAEAAAAQ8AQAAAAEAAAAAAAR8AQAAAABAAAADwAE 8DwCAACyBArwCAAAACEEAAAACgAAcwAL8PgBAAAEQQEAAAAIAc1MAAAJAZpZ AAA/AQAAAgD/AQAACACDw84BAAC/AyAAIAA5ADwACACvJAAAAAAAAEYjAADc AAAAbSIAAJMCAAAlIgAAJwkAAPYZAAAoDQAAbBcAALsNAAA3EQAAKREAADcR AABOEgAALwgAAOIWAAAUBQAAdRsAABQFAADjHAAADgcAAAkgAABCAgAAnCIA AJAAAADBIwAAkAAAAC8lAADZAAAAMCkAAKsDAADDLQAA2QAAAOkyAACxAQAA fjsAAEgAAADIPwAA2QAAAIFFAABdBQAAOEkAAJ8HAADMTQAANQYAABZQAADt BQAAX1IAAJ8HAAAXVAAAdwgAABdUAADURgAAF1QAAKdJAAAXVAAACk0AADtT AADiTQAApUQAAJRPAAClRAAA91IAAH9BAAD3UgAAfjsAAGBUAAA0NwAAYFQA AA82AAAeUgAAVzIAAFJNAADDLQAAjlEAADApAABmUgAALyUAAB5SAACcJAAA P1MAAHcjAABmUgAAUiIAAJRPAAAJIAAAA08AAFAaAAAQSwAAdBcAAM5IAADi FgAAfj8AALsPAACLOwAAKA0AAHA4AABMDAAAsS8AAEsIAAD5LwAAlAYAAEcu AACUBAAA+S8AAG8DAABHLgAAkwIAABkmAAAAAAAAryQAAAAAAAAjACLxDAAA AL8BAABgAD8FAAABAAAAEPAEAAAADgAAAAAAEfAEAAAAAQAAAA8ABPDsAQAA sgQK8AgAAAAiBAAAAAoAAHMAC/CoAQAABEEBAAAACAHNTAAACQGaWQAAPwEA AAIA/wEAAAgAg8N+AQAAvwMgACAALwAwAAgAfyQAAAAAAABSIwAAagAAAMAh AACNBAAAwCEAAJ4GAADnGQAAPA0AAF8WAAAQDgAA4BAAADMSAADgEAAA2hMA AGsJAADsFQAAfwUAAGcYAAAaBQAAihwAAH8FAACbHgAAEAcAABchAABbAgAA VCIAAAAAAADQJAAAZAAAALUnAACIAwAAUy4AAMkAAADgMgAAZAAAAEg/AADJ AAAAEkUAAIgDAADLSAAA4wUAAMtIAADjBQAAe1EAABAHAAD2UwAAPggAAPZT AAAIRwAA9lMAAJBKAAD2UwAAGU4AAHtRAAAZTgAAy0gAAM5SAAAtQgAAYFQA AMU1AADOUgAAHTQAANhQAAA4MQAAtE0AAFMuAAChUQAAtScAAM5SAAC+IgAA D1AAABchAADhTgAAOxkAACxKAAApFwAA7kEAAJ0SAABcQAAAixAAAEI7AAA8 DQAARTAAAJ4GAAAOMQAAIwQAALMuAAB7AgAAdiYAAAAAAAB/JAAAAAAAACMA IvEMAAAAvwEAAGAAPwUAAAEAAAAQ8AQAAAAFAAAAAAAR8AQAAAABAAAADwAE 8GgAAAASAArwCAAAAAEEAAAADgAAkwAL8DYAAACAAQcAAACBAWeSxQCDAdvl 8QCMAc7///+/ARAAEADLAQAAAAD/AQAACAAEAwkAAAA/AwEAAQATACLxBgAA AL8BAAAgAAAAEfAEAAAAAQAAAAEPAALwkAMAABAACPAIAAAABAAAAAMQAAAP AAPweAMAAA8ABPAoAAAAAQAJ8BAAAAAAAAAAAAAAAAAAAAAAAAAAAgAK8AgA AAAAEAAABQAAAA8ABPAQAQAAgggK8AgAAAABEAAAAAoAALMAC/C0AAAABAAA ADsBwMAgAAAAwwAAAAEAxcAQAAAA/wAAQIDAgQH/00cAggEAgAAAvwEQABAA /wEAAAgAgMNCAAAAvwMgACAAQwBPAE4ARwBSAEEAVABVAEwAQQBUAEkATwBO AFMAAABDAGEAbABpAGIAcgBpAAAAUABvAHcAZQByAFAAbAB1AHMAVwBhAHQA ZQByAE0AYQByAGsATwBiAGoAZQBjAHQAMQAwADEANgA0ADEANQAxAAAAYwAi 8SQAAACPAwIAAACQAwAAAACRAwIAAACSAwAAAAC/AwAAAIA/BQAAAQAAABDw BAAAAAIAAAAAABHwBAAAAAEAAAAPAATwEAEAAIIICvAIAAAAAhAAAAAKAACz AAvwtAAAAAQAAAA7AcDAIAAAAMMAAAABAMXAEAAAAP8AAECAwIEB/9NHAIIB AIAAAL8BEAAQAP8BAAAIAIDDQgAAAL8DIAAgAEMATwBOAEcAUgBBAFQAVQBM AEEAVABJAE8ATgBTAAAAQwBhAGwAaQBiAHIAaQAAAFAAbwB3AGUAcgBQAGwA dQBzAFcAYQB0AGUAcgBNAGEAcgBrAE8AYgBqAGUAYwB0ADEAMAAxADYANAAx ADUAMgAAAGMAIvEkAAAAjwMCAAAAkAMAAAAAkQMCAAAAkgMAAAAAvwMAAACA PwUAAAEAAAAQ8AQAAAAAAAAAAAAR8AQAAAABAAAADwAE8BABAACCCArwCAAA AAMQAAAACgAAswAL8LQAAAAEAAAAOwHAwCAAAADDAAAAAQDFwBAAAAD/AABA gMCBAf/TRwCCAQCAAAC/ARAAEAD/AQAACACAw0IAAAC/AyAAIABDAE8ATgBH AFIAQQBUAFUATABBAFQASQBPAE4AUwAAAEMAYQBsAGkAYgByAGkAAABQAG8A dwBlAHIAUABsAHUAcwBXAGEAdABlAHIATQBhAHIAawBPAGIAagBlAGMAdAAx ADAAMQA2ADQAMQA1ADMAAABjACLxJAAAAI8DAgAAAJADAAAAAJEDAgAAAJID AAAAAL8DAAAAgD8FAAABAAAAEPAEAAAAAQAAAAAAEfAEAAAAAQAAAAAAAAAB AAAAFQAAAGECAAAYBQAAFwoAAL8NAADADQAAwQ0AAMINAADDDQAAxA0AAMUN AADeDQAAgBIAAG4VAACSFQAA9BUAAFMWAAAdBAAAgwgAAB/9//9BHQAA8woA AHRAAAAAABwEAADy/v//H/3///4QAADCDgAAtEAAAAAAGwQAAPMPAABaCgAA JxgAANAMAAC0QAAAAAAfBAAAxxoAALcAAAAvKwAAuQ0AAHRAAAAAACAEAABc /v//5wYAAMQOAADpEwAAdEAAAAAAIgQAAGAYAACuAQAAyCgAALAOAAB0QAAA AAAPBAAAzSMAAAL////VKgAASAQAALQAAAAAABAEAACIHQAAAv///80jAABm BAAAtAAAAAAAEwQAALoYAABP/f//iB0AAJMEAAC0AAAAAAASBAAA0RAAAAP+ //+6GAAAhAQAALQAAAAAABEEAADWCwAAA/7//9EQAACTBAAAtAAAAAAADgQA AAL+//8S/v//5goAAL0HAAC0AAAAAAAUBAAAZAUAAP0AAADJCQAA5gQAALQA AAAAAA0EAACY/v//dgAAANEQAABXEAAAdEAAAAAAIQQAACMZAAAfAQAAqCoA AGgSAAB0QAAAAAAJBAAAKCMAALT8//+nKwAAYgMAALQAAAAAAAgEAAAeAAAA FQAAAFcSAAD2DwAAdEAAAAAABwQAAPoGAAByAAAAMxkAAFMQAAB0QAAAAAAM AAAADwAAABIAAAAYAAAAAhAAAAAAAAAAAAAAvjAAAL8JAAB0AAAAAAADEAAA HQAAAEPj///bMAAAAu3//3QAAAAAAAEQAAAAAAAAAAAAAL4wAAC/CQAAdAAA AAAAAAAAAA0VAABbFQAAcRUAAIUVAAA7FgAAPBYAAD4WAAA/FgAAQRYAAEIW AABEFgAARRYAAEcWAABIFgAAURYAAFQWAAAHAAMABwADAAcAAgAHAAIABwAC AAcAAgAHAAIABwACAAAAAAAaDQAAeQ0AAH0NAACHDQAA+A0AAAgOAACSDgAA 0g4AANQOAADhDgAAQQ8AAEUPAAA8FgAAPhYAAD8WAABBFgAAQhYAAEQWAABF FgAARxYAAEgWAABRFgAAVBYAAAcAMwAHADMABwAzAAcAMwAHADMABwAzAAcA BwACAAcAAgAHAAIABwACAAcAAgAAAAAAsAEAALMBAADHAQAAyQEAAM4BAADQ AQAA5AEAAOcBAAD6AQAA+wEAAFMJAABWCQAAWQkAAFsJAACNCQAAjwkAAPEJ AADyCQAAkgoAAJUKAACYCgAAmgoAAMgNAAD4DQAAKw4AACwOAABODgAAkg4A ANIOAAD7FAAAFRUAAFsVAABqFQAAahUAAGsVAABtFQAAgxUAAIUVAACMFQAA qxUAALcVAAC/FQAAxRUAAAwWAAAqFgAALBYAADIWAAA0FgAAORYAADoWAAA7 FgAAPBYAADwWAAA+FgAAPxYAAD8WAABBFgAAQhYAAEQWAABFFgAARxYAAEgW AABRFgAAVBYAAAcABAAHAAQABwAEAAcABAAHAAQABwAEAAcABAAHAAUABwAE AAcABAAHAAQABwAFAAgABwAFAAcACAAHAAUABAAFAAQABQAHAAUABAAFAAcA BQAHAAUABwAFAAcABQAHAAUABwAEAAIABAAHAAIABAAHAAIABwACAAcAAgAH AAIAAAAAAL4AAAC+AAAAsAEAALMBAADHAQAAyQEAAM4BAADQAQAA5AEAAOcB AAD6AQAA+wEAAFMJAABWCQAAWQkAAFsJAADxCQAA8gkAAJIKAACVCgAAmAoA AJoKAADIDQAAyA0AANgNAADYDQAALA4AACwOAACRDgAAkQ4AAEYTAABGEwAA FRUAAFsVAABqFQAAahUAAGsVAABrFQAAbBUAAGwVAACDFQAAhRUAAIwVAACM FQAAMhYAADIWAAA5FgAAORYAADoWAAA7FgAAPBYAADwWAAA/FgAAPxYAAEkW AABJFgAASxYAAEsWAABMFgAATBYAAE8WAABPFgAAVBYAAAMABAADAAQAAwAE AAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQA AwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAAC AAQAAgAEAAIABAACAAQAAgAEAAIABAACAAIAAAABAAkEBgACAEAAAAAJCAYA AgBAAAUAzlxmATkUiXsAAAAAAwAIAMASAADCAQAAWy8oC44S4lUAAAAAAACX G9FUWy8oCwAAAAAAAI4S4lUAAAAAAAAAAAABAgACADkUiXuXG9FUAAAAAAEA BABA7f//WgAAAAQAAAAIAAAA5QAAAAAAAABLAAAA4WECAFcmEwDmKBwA+HQh AGRgJQBaeSUAJF0nAPgrLwD5fzAA8iAyADMSMwDXTTMAfDI0APEXOgAeYj0A JCU/AIwuQQC7L0IAjgJDANhnSQC/P04A/1BOAJw3TwAwTVAAc3BUAINNWADK W1gAd3BaAEgfXQAdd10AAwNfANFXYQCRHmQA3h9lABxpZQAICmcAsBdnADso aQAwbm4AwUlzAKIJfQC1GH8A7AyAAMIZgQDLYoMA2A2FAD4EhgB1FYoAMDyM AI8ckQAVaJEAY0WSAGBWlABSdJQARmaWAHEblwATN5kAkU2hAHJypQDrJqYA hxuqAB8nsgCqVbgA+GG4AKpDugD0HMAAMjnAANBFwgArR8QAUwTFAJw8xgD/ VsYAhAbNAGk/zgAZVNYA4CLXAD9I2QCXf9sAclncAEU+4gCqPuUAIjLpAG1P 6gA8fO8A7DLwAAZk8QAsYfUA8Rb2AIQH+QBqTf4AAAAAADwWAAA+FgAAAAAA AAEAAAD/QACAAQAAAAAAAAAAAABoyAIBAAEAAAAAAAAAAAAAAAAAAAAAAAIQ AAAAAAAAAFMWAABgAAAQAEAAAP//AQAAAAcAVQBuAGsAbgBvAHcAbgD//wEA CAAAAAAAAAAAAAAA//8BAAAAAAD//wAAAgD//wAAAAD//wAAAgD//wAAAAAK AAAARx6QAQAAAgIGAwUEBQIDBP8qAOBBeADACQAAAAAAAAD/AQAAAAAAAFQA aQBtAGUAcwAgAE4AZQB3ACAAUgBvAG0AYQBuAAAANR6QAQIABQUBAgEHBgIF BwAAAAAAAAAQAAAAAAAAAAAAAACAAAAAAFMAeQBtAGIAbwBsAAAAMy6QAQAA AgsGBAICAgICBP8qAOBDeADACQAAAAAAAAD/AQAAAAAAAEEAcgBpAGEAbAAA AEMekAEAAAIHBwQHBQUCAwMDAAAAAAAAAAAAAAAAAAAAAQAAAAAAAABNAG8A ZABlAHIAbgAgAE4AbwAuACAAMgAwAAAASU4AAAAAAwEBAQECAQEBAYcCAAAA AAAAAAAAAAAAAACfAAAAAAAAAE0AbwBuAG8AdAB5AHAAZQAgAEMAbwByAHMA aQB2AGEAAABLHiwBAAACBQYEBQUFAgIEhwIAAAAAAAAAAAAAAAAAAJ8AAAAA AAAAQgBvAG8AawBtAGEAbgAgAE8AbABkACAAUwB0AHkAbABlAAAANy6QAQAA Ag8FAgICBAMCBP8CAOH/rABACQAAAAAAAACfAQAAAAAAAEMAYQBsAGkAYgBy AGkAAAA3HpABAAACBAUDBQQGAwIE7wIAoEsAAEAAAAAAAAAAAJ8BAAAAAAAA QwBhAG0AYgByAGkAYQAAADUukAEAAAILBgQDBQQEAgT/LgDhW2AAwCkAAAAA AAAA/wEBAAAAAABUAGEAaABvAG0AYQAAAEEekAEAAAIEBQMFBAYDAgTvAgCg 6yAAQgAAAAAAAAAAnwEAAAAAAABDAGEAbQBiAHIAaQBhACAATQBhAHQAaAAA ACIABAAxCIgYAPDQAgAAaAEAAAAAp7LsZqey7Gao7OsmAgAAAAAAUQMAAOsS AAAFAAsAAAAEAAOQKAAAAFEDAADrEgAABQALAAAAKAAAAAAAAAAhAwDwEAAA AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAwAA tAC0AIGBMjAAABAAGQBkAAAAGQAAADEWAAAxFgAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AgAAAAAAAAAAAAg/g1EA8BAACAD8/QEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAISFAAAAAACfD/DwAJJFAAAOQEAAD///9/////f////3////9/////f/// /3////9/SB9dAAAEAACyAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQQAAAAAAAAA AAAAAAAAAAAAAAAQHAAACQAAAAAAAAAAAHgAAAB4AAAAAAAAAAAAAACgBQAA //8SAAAAAAAAAAAAAAAAAAAABAB0AGUAbQBwAAUAYQBkAG0AaQBuAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7/AAAGAQIAAAAAAAAAAAAAAAAA AAAAAAEAAADghZ/y+U9oEKuRCAArJ7PZMAAAACwBAAAOAAAAAQAAAHgAAAAE AAAAgAAAAAcAAACQAAAACAAAAKAAAAAJAAAAsAAAABIAAAC8AAAACgAAANwA AAALAAAA6AAAAAwAAAD0AAAADQAAAAABAAAOAAAADAEAAA8AAAAUAQAAEAAA ABwBAAATAAAAJAEAAAIAAADkBAAAHgAAAAgAAAB0ZW1wAAAAAB4AAAAIAAAA Tm9ybWFsAAAeAAAACAAAAGFkbWluAAAAHgAAAAQAAAAyAAAAHgAAABgAAABN aWNyb3NvZnQgT2ZmaWNlIFdvcmQAAABAAAAAAAAAAAAAAABAAAAAAKipNf2P ywFAAAAAAGJD08yhywFAAAAAAGJD08yhywEDAAAABQAAAAMAAABRAwAAAwAA AOsSAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/wAABgECAAAAAAAAAAAAAAAA AAAAAAACAAAAAtXN1ZwuGxCTlwgAKyz5rkQAAAAF1c3VnC4bEJOXCAArLPmu LAEAAOgAAAAMAAAAAQAAAGgAAAAPAAAAcAAAAAUAAAB8AAAABgAAAIQAAAAR AAAAjAAAABcAAACUAAAACwAAAJwAAAAQAAAApAAAABMAAACsAAAAFgAAALQA AAANAAAAvAAAAAwAAADJAAAAAgAAAOQEAAAeAAAABAAAAEhQAAADAAAAKAAA AAMAAAALAAAAAwAAADEWAAADAAAAAAAMAAsAAAAAAAAACwAAAAAAAAALAAAA AAAAAAsAAAAAAAAAHhAAAAEAAAABAAAAAAwQAAACAAAAHgAAAAYAAABUaXRs ZQADAAAAAQAAAADAAAAAAwAAAAAAAAAgAAAAAQAAADgAAAACAAAAQAAAAAEA AAACAAAADAAAAF9QSURfSExJTktTAAIAAADkBAAAQQAAAHgAAAAGAAAAAwAA ADcADgADAAAAAAAAAAMAAAAAAAAAAwAAAAUAAAAfAAAAHwAAAG0AYQBpAGwA dABvADoAUwBsAGkAZgB5AG0AYQBuAGEAZwBlAHIANAA1AEAAcwBpAGYAeQAu AGMAbwBtAAAAAAAfAAAAAQAAAAAA9wcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAADAAAABAAAAAUA AAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAA ABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAA HAAAAB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAAn AAAAKAAAACkAAAAqAAAAKwAAACwAAAAtAAAALgAAAC8AAAAwAAAAMQAAADIA AAAzAAAANAAAADUAAAA2AAAANwAAADgAAAA5AAAAOgAAADsAAAA8AAAAPQAA AD4AAAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABFAAAARgAAAEcAAABIAAAA SQAAAEoAAABLAAAATAAAAE0AAABOAAAATwAAAFAAAABRAAAAUgAAAFMAAABU AAAAVQAAAFYAAABXAAAAWAAAAFkAAABaAAAAWwAAAFwAAABdAAAAXgAAAF8A AABgAAAAYQAAAGIAAABjAAAAZAAAAGUAAABmAAAAZwAAAGgAAABpAAAAagAA AGsAAABsAAAAbQAAAG4AAABvAAAAcAAAAHEAAAByAAAAcwAAAHQAAAB1AAAA dgAAAHcAAAB4AAAAeQAAAHoAAAB7AAAAfAAAAH0AAAB+AAAAfwAAAIAAAACB AAAAggAAAIMAAACEAAAAhQAAAIYAAACHAAAAiAAAAIkAAACKAAAAiwAAAIwA AACNAAAAjgAAAI8AAACQAAAAkQAAAJIAAACTAAAAlAAAAJUAAACWAAAAlwAA AJgAAACZAAAAmgAAAJsAAACcAAAAnQAAAJ4AAACfAAAAoAAAAKEAAACiAAAA owAAAKQAAAClAAAApgAAAKcAAACoAAAAqQAAAKoAAACrAAAArAAAAK0AAACu AAAArwAAALAAAACxAAAAsgAAALMAAAC0AAAAtQAAALYAAAC3AAAAuAAAALkA AAC6AAAAuwAAALwAAAC9AAAAvgAAAL8AAADAAAAAwQAAAMIAAADDAAAAxAAA AMUAAADGAAAAxwAAAMgAAADJAAAAygAAAMsAAADMAAAAzQAAAM4AAADPAAAA 0AAAANEAAADSAAAA0wAAANQAAADVAAAA1gAAANcAAADYAAAA2QAAANoAAADb AAAA3AAAAN0AAADeAAAA3wAAAOAAAADhAAAA4gAAAOMAAADkAAAA5QAAAOYA AADnAAAA6AAAAOkAAADqAAAA6wAAAOwAAADtAAAA7gAAAO8AAADwAAAA8QAA APIAAADzAAAA9AAAAPUAAAD2AAAA9wAAAPgAAAD5AAAA+gAAAPsAAAD8AAAA /QAAAP4AAAD/AAAAAAEAAAEBAAACAQAAAwEAAAQBAAAFAQAABgEAAAcBAAAI AQAACQEAAAoBAAALAQAADAEAAA0BAAAOAQAADwEAABABAAARAQAAEgEAABMB AAAUAQAAFQEAABYBAAAXAQAAGAEAABkBAAAaAQAAGwEAABwBAAAdAQAAHgEA AB8BAAAgAQAAIQEAACIBAAAjAQAAJAEAACUBAAAmAQAAJwEAACgBAAApAQAA KgEAACsBAAAsAQAALQEAAC4BAAAvAQAAMAEAADEBAAAyAQAAMwEAADQBAAA1 AQAANgEAADcBAAA4AQAAOQEAADoBAAA7AQAAPAEAAD0BAAA+AQAAPwEAAEAB AABBAQAAQgEAAEMBAABEAQAARQEAAEYBAABHAQAASAEAAEkBAABKAQAASwEA AEwBAABNAQAATgEAAE8BAABQAQAAUQEAAFIBAABTAQAAVAEAAFUBAABWAQAA VwEAAFgBAABZAQAAWgEAAFsBAABcAQAAXQEAAF4BAABfAQAAYAEAAGEBAABi AQAAYwEAAGQBAABlAQAAZgEAAGcBAABoAQAAaQEAAGoBAABrAQAAbAEAAG0B AABuAQAAbwEAAHABAABxAQAAcgEAAHMBAAB0AQAAdQEAAHYBAAB3AQAAeAEA AHkBAAB6AQAAewEAAHwBAAB9AQAAfgEAAH8BAACAAQAAgQEAAIIBAACDAQAA hAEAAIUBAACGAQAAhwEAAIgBAACJAQAAigEAAIsBAACMAQAAjQEAAI4BAACP AQAAkAEAAJEBAACSAQAAkwEAAJQBAACVAQAAlgEAAJcBAACYAQAAmQEAAJoB AACbAQAAnAEAAJ0BAACeAQAAnwEAAKABAAChAQAAogEAAKMBAACkAQAApQEA AKYBAACnAQAAqAEAAKkBAACqAQAAqwEAAKwBAACtAQAArgEAAK8BAACwAQAA sQEAALIBAACzAQAAtAEAALUBAAC2AQAAtwEAALgBAAC5AQAAugEAALsBAAC8 AQAAvQEAAL4BAAC/AQAAwAEAAMEBAADCAQAAwwEAAMQBAADFAQAAxgEAAMcB AADIAQAAyQEAAMoBAADLAQAAzAEAAM0BAADOAQAAzwEAANABAADRAQAA0gEA ANMBAADUAQAA1QEAANYBAADXAQAA2AEAANkBAADaAQAA2wEAANwBAADdAQAA 3gEAAN8BAADgAQAA4QEAAOIBAADjAQAA5AEAAOUBAADmAQAA5wEAAOgBAADp AQAA6gEAAOsBAADsAQAA7QEAAO4BAADvAQAA8AEAAPEBAADyAQAA8wEAAPQB AAD1AQAA9gEAAPcBAAD4AQAA+QEAAPoBAAD7AQAA/AEAAP0BAAD+AQAA/wEA AAACAAABAgAAAgIAAAMCAAAEAgAABQIAAAYCAAAHAgAACAIAAAkCAAAKAgAA CwIAAAwCAAANAgAADgIAAA8CAAAQAgAAEQIAABICAAATAgAAFAIAABUCAAAW AgAAFwIAABgCAAAZAgAAGgIAABsCAAAcAgAAHQIAAB4CAAAfAgAAIAIAACEC AAAiAgAAIwIAACQCAAAlAgAAJgIAACcCAAAoAgAAKQIAACoCAAArAgAALAIA AC0CAAAuAgAALwIAADACAAAxAgAAMgIAADMCAAA0AgAANQIAADYCAAA3AgAA OAIAADkCAAA6AgAAOwIAADwCAAA9AgAAPgIAAD8CAABAAgAAQQIAAEICAABD AgAARAIAAEUCAABGAgAARwIAAEgCAABJAgAASgIAAEsCAABMAgAATQIAAE4C AABPAgAAUAIAAFECAABSAgAAUwIAAFQCAABVAgAAVgIAAFcCAABYAgAAWQIA AFoCAABbAgAAXAIAAF0CAABeAgAAXwIAAGACAABhAgAAYgIAAGMCAABkAgAA ZQIAAGYCAABnAgAAaAIAAGkCAABqAgAAawIAAGwCAABtAgAAbgIAAG8CAABw AgAAcQIAAHICAABzAgAAdAIAAHUCAAB2AgAAdwIAAHgCAAB5AgAAegIAAHsC AAB8AgAAfQIAAH4CAAB/AgAAgAIAAIECAACCAgAAgwIAAIQCAACFAgAAhgIA AIcCAACIAgAAiQIAAIoCAACLAgAAjAIAAI0CAACOAgAAjwIAAJACAACRAgAA kgIAAJMCAACUAgAAlQIAAJYCAACXAgAAmAIAAJkCAACaAgAAmwIAAJwCAACd AgAAngIAAJ8CAACgAgAAoQIAAKICAACjAgAApAIAAKUCAACmAgAApwIAAKgC AACpAgAAqgIAAKsCAACsAgAArQIAAK4CAACvAgAAsAIAALECAACyAgAAswIA ALQCAAC1AgAAtgIAALcCAAC4AgAAuQIAALoCAAC7AgAAvAIAAL0CAAC+AgAA vwIAAMACAADBAgAAwgIAAMMCAADEAgAAxQIAAMYCAADHAgAAyAIAAMkCAADK AgAAywIAAMwCAADNAgAAzgIAAM8CAADQAgAA0QIAANICAADTAgAA1AIAANUC AADWAgAA1wIAANgCAADZAgAA2gIAANsCAADcAgAA3QIAAN4CAADfAgAA4AIA AOECAADiAgAA4wIAAOQCAADlAgAA5gIAAOcCAADoAgAA6QIAAOoCAADrAgAA 7AIAAO0CAADuAgAA7wIAAPACAADxAgAA8gIAAPMCAAD0AgAA9QIAAPYCAAD3 AgAA+AIAAPkCAAD6AgAA+wIAAPwCAAD9AgAA/gIAAP8CAAAAAwAAAQMAAAID AAADAwAABAMAAAUDAAAGAwAABwMAAAgDAAAJAwAACgMAAAsDAAAMAwAADQMA AA4DAAD+////EAMAABEDAAASAwAAEwMAABQDAAAVAwAAFgMAABcDAAAYAwAA GQMAABoDAAAbAwAAHAMAAB0DAAAeAwAAHwMAACADAAAhAwAAIgMAACMDAAAk AwAAJQMAACYDAAAnAwAAKAMAACkDAAAqAwAAKwMAACwDAAAtAwAALgMAAC8D AAAwAwAAMQMAADIDAAAzAwAANAMAADUDAAA2AwAANwMAADgDAAA5AwAAOgMA ADsDAAA8AwAAPQMAAD4DAAA/AwAAQAMAAEEDAABCAwAAQwMAAEQDAABFAwAA RgMAAEcDAABIAwAASQMAAEoDAABLAwAATAMAAE0DAABOAwAATwMAAFADAABR AwAAUgMAAFMDAABUAwAAVQMAAFYDAABXAwAAWAMAAFkDAABaAwAAWwMAAFwD AABdAwAAXgMAAF8DAABgAwAAYQMAAGIDAABjAwAAZAMAAGUDAABmAwAAZwMA AGgDAABpAwAAagMAAGsDAABsAwAAbQMAAG4DAABvAwAAcAMAAHEDAAByAwAA cwMAAHQDAAB1AwAAdgMAAHcDAAB4AwAAeQMAAHoDAAB7AwAAfAMAAH0DAAB+ AwAAfwMAAIADAACBAwAAggMAAIMDAACEAwAAhQMAAIYDAACHAwAAiAMAAIkD AACKAwAAiwMAAIwDAACNAwAAjgMAAI8DAACQAwAAkQMAAJIDAACTAwAAlAMA AJUDAACWAwAAlwMAAJgDAACZAwAAmgMAAJsDAACcAwAAnQMAAJ4DAACfAwAA oAMAAKEDAACiAwAAowMAAKQDAAClAwAApgMAAKcDAACoAwAAqQMAAKoDAACr AwAArAMAAK0DAACuAwAArwMAALADAACxAwAAsgMAALMDAAC0AwAAtQMAALYD AAC3AwAAuAMAALkDAAC6AwAAuwMAALwDAAC9AwAAvgMAAL8DAADAAwAAwQMA AMIDAADDAwAAxAMAAMUDAADGAwAAxwMAAMgDAADJAwAAygMAAMsDAADMAwAA zQMAAM4DAADPAwAA0AMAANEDAADSAwAA0wMAANQDAADVAwAA1gMAANcDAADY AwAA2QMAANoDAADbAwAA3AMAAN0DAADeAwAA3wMAAOADAADhAwAA4gMAAOMD AADkAwAA5QMAAOYDAADnAwAA6AMAAOkDAADqAwAA6wMAAOwDAADtAwAA7gMA AO8DAADwAwAA8QMAAPIDAADzAwAA9AMAAPUDAAD2AwAA9wMAAPgDAAD5AwAA +gMAAPsDAAD8AwAA/QMAAP4DAAD/AwAAAAQAAAEEAAACBAAAAwQAAAQEAAAF BAAABgQAAAcEAAAIBAAACQQAAAoEAAALBAAADAQAAA0EAAAOBAAADwQAABAE AAARBAAAEgQAABMEAAAUBAAAFQQAABYEAAAXBAAAGAQAABkEAAAaBAAAGwQA ABwEAAAdBAAAHgQAAB8EAAAgBAAAIQQAACIEAAAjBAAAJAQAACUEAAAmBAAA JwQAACgEAAApBAAAKgQAACsEAAAsBAAALQQAAC4EAAAvBAAAMAQAADEEAAAy BAAAMwQAADQEAAA1BAAANgQAADcEAAA4BAAAOQQAADoEAAA7BAAAPAQAAD0E AAA+BAAAPwQAAEAEAABBBAAAQgQAAEMEAABEBAAARQQAAEYEAABHBAAASAQA AEkEAABKBAAASwQAAEwEAABNBAAATgQAAE8EAABQBAAAUQQAAFIEAABTBAAA VAQAAFUEAABWBAAAVwQAAFgEAABZBAAAWgQAAFsEAABcBAAAXQQAAF4EAABf BAAAYAQAAGEEAABiBAAAYwQAAGQEAABlBAAAZgQAAGcEAABoBAAAaQQAAGoE AABrBAAAbAQAAG0EAABuBAAAbwQAAHAEAABxBAAAcgQAAHMEAAB0BAAAdQQA AHYEAAB3BAAAeAQAAHkEAAB6BAAAewQAAHwEAAB9BAAAfgQAAH8EAACABAAA gQQAAIIEAACDBAAA/v///4UEAACGBAAAhwQAAIgEAACJBAAAigQAAIsEAACM BAAAjQQAAI4EAACPBAAAkAQAAJEEAACSBAAAkwQAAJQEAACVBAAAlgQAAJcE AACYBAAAmQQAAJoEAACbBAAAnAQAAJ0EAACeBAAAnwQAAKAEAAChBAAAogQA AKMEAACkBAAA/v///6YEAACnBAAAqAQAAKkEAACqBAAAqwQAAKwEAAD+//// rgQAAK8EAACwBAAAsQQAALIEAACzBAAAtAQAAP7////9/////f////3////9 /////f////3////9/////f////3////9////wAQAAMEEAAD+/////v///8QE AAD+//////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////9SAG8AbwB0ACAARQBuAHQAcgB5AAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAFAf////// ////AwAAAAYJAgAAAAAAwAAAAAAAAEYAAAAAAAAAAAAAAABw4grkzKHLAcME AAAAAwAAAAAAAEQAYQB0AGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAIB//////////////// AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwMAALnoAgAA AAAAMQBUAGEAYgBsAGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAgABAAAA//////////8AAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEBAAAQkEAAAAAAABXAG8A cgBkAEQAbwBjAHUAbQBlAG4AdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAGgACAQoAAAAFAAAA/////wAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeHQYAAAAAAAUAUwB1AG0AbQBh AHIAeQBJAG4AZgBvAHIAbQBhAHQAaQBvAG4AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAoAAIB////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAApQQAAAAQAAAAAAAABQBEAG8AYwB1AG0AZQBuAHQA UwB1AG0AbQBhAHIAeQBJAG4AZgBvAHIAbQBhAHQAaQBvAG4AAAAAAAAAAAAA ADgAAgEEAAAA//////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAACtBAAAABAAAAAAAABNAHMAbwBEAGEAdABhAFMAdABvAHIAZQAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgABAP// ////////BwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIJ7g48yhywEQpQLkzKHL AQAAAAAAAAAAAAAAAMEAWABCANcASgAzANUA1gBZAEUAUwDeANYA2QDCAFEA zQBLAN0A2ABNANAAPQA9AAAAAAAAAAAAAAAAAAAAAAAyAAEB//////////8I AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgnuDjzKHLARClAuTMocsBAAAAAAAA AAAAAAAASQB0AGUAbQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAgH/////CQAAAP////8AAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAAAAAABQ AHIAbwBwAGUAcgB0AGkAZQBzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAFgACAP///////////////wAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABVAQAAAAAAAAEAQwBvAG0A cABPAGIAagAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAASAAIBAgAAAAYAAAD/////AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAACgAAAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAD///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAD+////BQAAAAYA AAAHAAAACAAAAAkAAAD+////CwAAAP7///////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// /////////////////////////////////////////////////////zxiOlNv dXJjZXMgU2VsZWN0ZWRTdHlsZT0iXEFQQS5YU0wiIFN0eWxlTmFtZT0iQVBB IiB4bWxuczpiPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcv b2ZmaWNlRG9jdW1lbnQvMjAwNi9iaWJsaW9ncmFwaHkiIHhtbG5zPSJodHRw Oi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQv MjAwNi9iaWJsaW9ncmFwaHkiPjwvYjpTb3VyY2VzPg0KAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8P3htbCB2ZXJzaW9uPSIxLjAi IGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4NCjxkczpkYXRh c3RvcmVJdGVtIGRzOml0ZW1JRD0iezI1Nzc3MDg1LTc2REQtNDQ2MC1CRURC LTk4OTBCNEFGNzgzM30iIHhtbG5zOmRzPSJodHRwOi8vc2NoZW1hcy5vcGVu eG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9jdXN0b21YbWwi PjxkczpzY2hlbWFSZWZzPjxkczpzY2hlbWFSZWYgZHM6dXJpPSJodHRwOi8v c2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAw Ni9iaWJsaW9ncmFwaHkiLz48L2RzOnNjaGVtYVJlZnM+PC9kczpkYXRhc3Rv cmVJdGVtPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAABAP7/AwoAAP////8GCQIAAAAAAMAAAAAAAABGJwAAAE1pY3Jvc29m dCBPZmZpY2UgV29yZCA5Ny0yMDAzIERvY3VtZW50AAoAAABNU1dvcmREb2MA EAAAAFdvcmQuRG9jdW1lbnQuOAD0ObJxAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= ------=_NextPart_000_0018_01C2A9A6.18EFFA2A-- From eflorac@intellique.com Wed Dec 22 18:25:09 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBN0P984055368 for ; Wed, 22 Dec 2010 18:25:09 -0600 X-ASG-Debug-ID: 1293064021-0ea200b00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3A7DC219A10 for ; Wed, 22 Dec 2010 16:27:05 -0800 (PST) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id 3uARyPfx79Dg0KbK for ; Wed, 22 Dec 2010 16:27:05 -0800 (PST) Received: from galadriel.home (unknown [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP id 75189A616C; Thu, 23 Dec 2010 01:26:57 +0100 (CET) Date: Thu, 23 Dec 2010 01:26:55 +0100 From: Emmanuel Florac To: Eric Sandeen Cc: Justin Piszcz , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? Message-ID: <20101223012655.2681c596@galadriel.home> In-Reply-To: <4D124B71.9030401@sandeen.net> References: <20101222175611.1c7d5190@harpe.intellique.com> <4D124B71.9030401@sandeen.net> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.20.1; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1293064027 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50217 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Wed, 22 Dec 2010 13:03:13 -0600 vous =E9criviez: > http://xfs.org/index.php/XFS_FAQ#Q:_I_want_to_tune_my_XFS_filesystems_for= _.3Csomething.3E >=20 > which mentions getting your geometry right if it's hardware raid > that can't be detected automatically. Just as a side note : I tried several times to manually set the filesystem layout to precisely match the underlying hardware RAID with sunit and swidth but didn't find that it made a noticeable difference. On my 39.9 TB systems, the default agcount is 39, while the optimum would be (theorically at least) 42.=20 --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From jpiszcz@lucidpixels.com Wed Dec 22 18:26:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBN0QWnX055537 for ; Wed, 22 Dec 2010 18:26:32 -0600 X-ASG-Debug-ID: 1293064110-021201420000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lucidpixels.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 83B56219A1B for ; Wed, 22 Dec 2010 16:28:30 -0800 (PST) Received: from lucidpixels.com (lucidpixels.com [75.144.35.66]) by cuda.sgi.com with ESMTP id bijORHcX1h5Jc8jF for ; Wed, 22 Dec 2010 16:28:30 -0800 (PST) Received: by lucidpixels.com (Postfix, from userid 1001) id AF3251204B5; Wed, 22 Dec 2010 19:28:29 -0500 (EST) Date: Wed, 22 Dec 2010 19:28:29 -0500 (EST) From: Justin Piszcz To: Emmanuel Florac cc: Eric Sandeen , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? In-Reply-To: <20101223012655.2681c596@galadriel.home> Message-ID: References: <20101222175611.1c7d5190@harpe.intellique.com> <4D124B71.9030401@sandeen.net> <20101223012655.2681c596@galadriel.home> User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="655872-2018785734-1293064109=:7452" X-Barracuda-Connect: lucidpixels.com[75.144.35.66] X-Barracuda-Start-Time: 1293064110 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50217 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. --655872-2018785734-1293064109=:7452 Content-Type: TEXT/PLAIN; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: QUOTED-PRINTABLE On Thu, 23 Dec 2010, Emmanuel Florac wrote: > Le Wed, 22 Dec 2010 13:03:13 -0600 vous =E9criviez: > >> http://xfs.org/index.php/XFS_FAQ#Q:_I_want_to_tune_my_XFS_filesystems_fo= r_.3Csomething.3E >> >> which mentions getting your geometry right if it's hardware raid >> that can't be detected automatically. > > Just as a side note : I tried several times to manually set the > filesystem layout to precisely match the underlying hardware RAID > with sunit and swidth but didn't find that it made a noticeable > difference. On my 39.9 TB systems, the default agcount is 39, while the > optimum would be (theorically at least) 42. > > --=20 > ------------------------------------------------------------------------ > Emmanuel Florac | Direction technique > | Intellique > |=09 > | +33 1 78 94 84 02 > ------------------------------------------------------------------------ > Hi, I concur, for hardware raid (at least on 3ware cards) I have found it= =20 makes no difference, thanks for confirming. Which RAID cards did you use? Justin. --655872-2018785734-1293064109=:7452-- From SRS0+02w5+26+fromorbit.com=david@internode.on.net Wed Dec 22 18:54:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBN0sat7059916 for ; Wed, 22 Dec 2010 18:54:36 -0600 X-ASG-Debug-ID: 1293065792-420803880000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7385114786DA for ; Wed, 22 Dec 2010 16:56:33 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id iB6kPX4sjxpANmeK for ; Wed, 22 Dec 2010 16:56:33 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50789429-1927428 for multiple; Thu, 23 Dec 2010 11:26:32 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PVZTq-0004gH-6S; Thu, 23 Dec 2010 11:56:30 +1100 Date: Thu, 23 Dec 2010 11:56:30 +1100 From: Dave Chinner To: Justin Piszcz Cc: Emmanuel Florac , Eric Sandeen , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? Message-ID: <20101223005630.GJ4907@dastard> References: <20101222175611.1c7d5190@harpe.intellique.com> <4D124B71.9030401@sandeen.net> <20101223012655.2681c596@galadriel.home> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1293065794 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50218 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 22, 2010 at 07:28:29PM -0500, Justin Piszcz wrote: > > > On Thu, 23 Dec 2010, Emmanuel Florac wrote: > > >Le Wed, 22 Dec 2010 13:03:13 -0600 vous écriviez: > > > >>http://xfs.org/index.php/XFS_FAQ#Q:_I_want_to_tune_my_XFS_filesystems_for_.3Csomething.3E > >> > >>which mentions getting your geometry right if it's hardware raid > >>that can't be detected automatically. > > > >Just as a side note : I tried several times to manually set the > >filesystem layout to precisely match the underlying hardware RAID > >with sunit and swidth but didn't find that it made a noticeable > >difference. On my 39.9 TB systems, the default agcount is 39, while the > >optimum would be (theorically at least) 42. > > Hi, I concur, for hardware raid (at least on 3ware cards) I have > found it makes no difference, thanks for confirming. I'd constrain that statement to "no difference for the workloads and hardware tested". Indeed, testing an empty filesystem will often show no difference in performance, because typically problems don't show up until you've started to age the filesystem significantly. When the filesystem has started to age, the difference between having done lots of stripe unit/width aligned allocation vs none can be very significant.... Hence don't assume that because you can't see any difference on a brand new, empty filesystem there never will be a difference over the life of the filesytem... Cheers, Dave. -- Dave Chinner david@fromorbit.com From eflorac@intellique.com Wed Dec 22 19:09:14 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBN19E6f062319 for ; Wed, 22 Dec 2010 19:09:14 -0600 X-ASG-Debug-ID: 1293066669-0cf6000f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1B36014784EB for ; Wed, 22 Dec 2010 17:11:10 -0800 (PST) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id EijFO1UckK55bdMV for ; Wed, 22 Dec 2010 17:11:10 -0800 (PST) Received: from galadriel.home (unknown [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP id BBB76A610F; Thu, 23 Dec 2010 02:11:05 +0100 (CET) Date: Thu, 23 Dec 2010 02:10:59 +0100 From: Emmanuel Florac To: Justin Piszcz Cc: Eric Sandeen , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? Message-ID: <20101223021059.059fa9db@galadriel.home> In-Reply-To: References: <20101222175611.1c7d5190@harpe.intellique.com> <4D124B71.9030401@sandeen.net> <20101223012655.2681c596@galadriel.home> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.20.1; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1293066673 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50220 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Wed, 22 Dec 2010 19:28:29 -0500 (EST) vous =E9criviez: > Hi, I concur, for hardware raid (at least on 3ware cards) I have > found it makes no difference, thanks for confirming. >=20 > Which RAID cards did you use? Mostly 3Ware until recently, but I switched to Adaptec. However I'm still running tests to sort out any peculiarity - found quite a lot of "features" since 2008 :) --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From SRS0+ai79+26+fromorbit.com=david@internode.on.net Wed Dec 22 19:13:52 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBN1Dqf9062696 for ; Wed, 22 Dec 2010 19:13:52 -0600 X-ASG-Debug-ID: 1293066948-611b02760000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DAC131CED6BC for ; Wed, 22 Dec 2010 17:15:49 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id U6QkYGXy9W5ihF3h for ; Wed, 22 Dec 2010 17:15:49 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50291609-1927428 for ; Thu, 23 Dec 2010 11:45:48 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PVZmU-0004iZ-FV for xfs@oss.sgi.com; Thu, 23 Dec 2010 12:15:46 +1100 Date: Thu, 23 Dec 2010 12:15:46 +1100 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 00/34] xfs: scalability patchset for 2.6.38 Subject: Re: [PATCH 00/34] xfs: scalability patchset for 2.6.38 Message-ID: <20101223011546.GK4907@dastard> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292916570-25015-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1293066950 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50219 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 21, 2010 at 06:28:56PM +1100, Dave Chinner wrote: > Folks, > > I'm sending the entire series of scalability patches in a single > patchbomb because I'm tired and it's too much like hard work to send > it out in multiple patchsets (i.e. I'm being lazy). Overall there > are relatively few changes: > > - new patch for iolock lockdep annotations > - new patch for allocations under ilock > > rcu inode freeing and lookup: > - reworked reclaim to use rcu read locking > - removed synchronise_rcu() from lookup failure > - cleaned up validity checks, added comments and rcu_read_lock_held > annotations > > AIL locking > - fixed aild sleep to use TASK_INTERRUPTABLE > > Log grant scaling > - made reserveq/writeq tracing just indicate if there are queued > tickets. > - cleaned up some minor formatting nitpicks suggested by Christoph > - split xlog_space_left() into __xlog_space_left() for AIl tail > pushing to work off a single tail lsn value. > > I'm mainly concerned with getting reviews for the few remaining > patches that don't currently have reviewed-by tags. Christoph, I > think I've fixed all the things your last round of comments covered, > so there should be relatively little remaining to be fixed up. > > The series is in the following git tree which is based on the > current OSS xfs tree. Alex, once I get the remaining reviews > complete I'll update the branch and send you a pull request. I've just pushed a new version out with all the new reviewed-by tags and fixups noticed. git://git.kernel.org/pub/scm/linux/dgc/xfsdev.git xfs-for-2.6.38 kernel.org is pretty slow right now, so it might take a while for it to propagate through. The patches I still need reviews for are: lib: percpu counter add unless less than functionality xfs: dynamic speculative EOF preallocation xfs: convert l_tail_lsn to an atomic variable Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+mveC+26+fromorbit.com=david@internode.on.net Wed Dec 22 19:42:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_64 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBN1gH0l067811 for ; Wed, 22 Dec 2010 19:42:18 -0600 X-ASG-Debug-ID: 1293068653-149001010000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 186ED1478819 for ; Wed, 22 Dec 2010 17:44:14 -0800 (PST) Received: from mail.internode.on.net (bld-mail20.adl6.internode.on.net [150.101.137.105]) by cuda.sgi.com with ESMTP id 5opt0qGBGz5pskFp for ; Wed, 22 Dec 2010 17:44:14 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 5604597-1927428 for multiple; Thu, 23 Dec 2010 12:14:12 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PVaDx-0004kU-R3; Thu, 23 Dec 2010 12:44:09 +1100 Date: Thu, 23 Dec 2010 12:44:09 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: add FITRIM support Subject: Re: xfs: add FITRIM support Message-ID: <20101223014409.GL4907@dastard> References: <20101125112304.GA4195@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101125112304.GA4195@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail20.adl6.internode.on.net[150.101.137.105] X-Barracuda-Start-Time: 1293068656 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50222 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Nov 25, 2010 at 06:23:04AM -0500, Christoph Hellwig wrote: > Allow manual discards from userspace using the FITRIM ioctl. This is not > intended to be run during normal workloads, as the freepsace btree walks > can cause large performance degradation. > > Signed-off-by: Christoph Hellwig ..... > +STATIC int > +xfs_trim_extents( > + struct xfs_mount *mp, > + xfs_agnumber_t agno, > + xfs_fsblock_t start, > + xfs_fsblock_t len, > + xfs_fsblock_t minlen) > +{ > + struct block_device *bdev = mp->m_ddev_targp->bt_bdev; > + struct xfs_btree_cur *cur; > + struct xfs_buf *agbp; > + struct xfs_perag *pag; > + int error; > + int i; > + > + pag = xfs_perag_get(mp, agno); > + > + error = xfs_alloc_read_agf(mp, NULL, agno, > + XFS_ALLOC_FLAG_TRYLOCK, &agbp); > + if (error || !agbp) { > + if (error == EAGAIN) > + error = 0; > + goto out_put_perag; > + } > + > + cur = xfs_allocbt_init_cursor(mp, NULL, agbp, agno, XFS_BTNUM_CNT); > + > + /* > + * Force out the log. This means any transactions that might have freed > + * space before we took the AGF buffer lock are now on disk, and the > + * volatile disk cache is flushed. > + */ > + xfs_log_force(mp, XFS_LOG_SYNC); > + > + /* > + * Look up the longest btree in the AGF and start with it. > + */ > + error = xfs_alloc_lookup_le(cur, 0, > + XFS_BUF_TO_AGF(agbp)->agf_longest, &i); > + if (error) > + goto out_del_cursor; > + > + /* > + * Loop until we are done with all extents that are large > + * enough to be worth discarding. > + */ > + while (i) { > + xfs_agblock_t fbno; > + xfs_extlen_t flen; > + > + error = xfs_alloc_get_rec(cur, &fbno, &flen, &i); > + if (error) > + goto out_del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, out_del_cursor); > + ASSERT(flen <= XFS_BUF_TO_AGF(agbp)->agf_longest); > + > + /* > + * Too small? Give up. > + */ > + if (flen < minlen) { > + trace_xfs_discard_toosmall(mp, agno, fbno, flen); > + goto out_del_cursor; > + } > + > + /* > + * If the extent is entirely outside of the range we are > + * supposed to discard skip it. Do not bother to trim > + * down partially overlapping ranges for now. > + */ > + if (XFS_AGB_TO_FSB(mp, agno, fbno) + flen < start || > + XFS_AGB_TO_FSB(mp, agno, fbno) > start + len) { > + trace_xfs_discard_exclude(mp, agno, fbno, flen); > + goto next_extent; > + } Hmmmm - if we are given a range to trim, wouldn't we do better to walk the by-bno btree instead? i.e, we have two different cases here - trim an entire AG, and trim part of an AG given by {start, end}. We only need these range checks on the AGs that are only partially trimmed, and it would seem more efficient to me to walk the by-bno tree for those rather than walk the by-size tree trying to find range matches. > + > + /* > + * If any blocks in the range are still busy, skip the > + * discard and try again the next time. > + */ > + if (xfs_alloc_busy_search(mp, agno, fbno, flen)) { > + trace_xfs_discard_busy(mp, agno, fbno, flen); > + goto next_extent; > + } > + > + trace_xfs_discard_extent(mp, agno, fbno, flen); > + error = -blkdev_issue_discard(bdev, > + XFS_AGB_TO_DADDR(mp, agno, fbno), > + XFS_FSB_TO_BB(mp, flen), > + GFP_NOFS, 0); > + if (error) > + goto out_del_cursor; > + > +next_extent: > + error = xfs_btree_decrement(cur, 0, &i); > + if (error) > + goto out_del_cursor; > + } Hmmm - so we hold the agf locked for the entire trim? That's a bit ugly. Given this is best effort, we could avoid this by changing it to something like: longest = 0; do { lock agf force log if (!longest) longest = agf->longest init cursor do { xfs_alloc_lookup_le(longest) alloc_get_rec(&fbno, &flen) check flen busy search discard decrement cursor } while (flen == longest) destroy cursor unlock agf longest = flen; } while(1) This way we walk the tree in a manner that does not hold the agf for extended periods of time, but still catches all the extents of the same size and, when idle, will catch all the extents longer than the given length to discard. If the filesystem is busy, it will have much less impact on it due to the much short AGF hold times. And perhaps the inner loop could simply be terminated on the number of discards issued or a timer to keep the number of log forces down to a sane number (e.g. one every 50ms). Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+02w5+26+fromorbit.com=david@internode.on.net Wed Dec 22 19:48:47 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBN1mlEK069219 for ; Wed, 22 Dec 2010 19:48:47 -0600 X-ASG-Debug-ID: 1293069044-60db03b00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D67FB1CDBA2E for ; Wed, 22 Dec 2010 17:50:44 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id zmEIZLOPCFuRSuAX for ; Wed, 22 Dec 2010 17:50:44 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50612975-1927428 for multiple; Thu, 23 Dec 2010 12:20:42 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PVaKG-0004lQ-VZ; Thu, 23 Dec 2010 12:50:41 +1100 Date: Thu, 23 Dec 2010 12:50:40 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: remove leftovers of old buffer log items in recovery code Subject: Re: [PATCH 1/4] xfs: remove leftovers of old buffer log items in recovery code Message-ID: <20101223015040.GA18264@dastard> References: <20101201220620.340188389@bombadil.infradead.org> <20101201220710.042656730@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101201220710.042656730@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1293069045 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50222 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 01, 2010 at 05:06:21PM -0500, Christoph Hellwig wrote: > XFS used to support different types of buffer log items long time ago. > Remove the switch statements checking the log item type in various > buffer recovery helpers that were left over from those days and the > rather useless xlog_recover_do_buffer_pass2 wrapper. > > Signed-off-by: Christoph Hellwig Looks good. This should have been done when all the old unsupported buffer formats were removed. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From laurent+xfs@u-picardie.fr Wed Dec 22 19:51:14 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBN1pDo8069794 for ; Wed, 22 Dec 2010 19:51:14 -0600 X-ASG-Debug-ID: 1293069190-0ea403c90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.u-picardie.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0E199219DFE for ; Wed, 22 Dec 2010 17:53:10 -0800 (PST) Received: from mx1.u-picardie.fr (mx1.u-picardie.fr [193.49.184.7]) by cuda.sgi.com with ESMTP id dPKCeVAW1RlN0ykj for ; Wed, 22 Dec 2010 17:53:10 -0800 (PST) Received: from mailx.u-picardie.fr (oban.u-picardie.fr [193.49.184.8]) by mx1.u-picardie.fr (Postfix) with ESMTP id 8B5A678016 for ; Thu, 23 Dec 2010 02:53:09 +0100 (CET) Received: from passoire.u-picardie.fr (passoire.u-picardie.fr [193.49.184.121]) by mailx.u-picardie.fr (Postfix) with ESMTP id 69855580F8 for ; Thu, 23 Dec 2010 02:53:09 +0100 (CET) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: Debian amavisd-new at u-picardie.fr Received: from mailx.u-picardie.fr ([193.49.184.8]) by passoire.u-picardie.fr (passoire.u-picardie.fr [193.49.184.121]) (amavisd-new, port 10024) with LMTP id RHIS5semI6dl for ; Thu, 23 Dec 2010 02:53:08 +0100 (CET) Received: from ezri.u-picardie.fr (ezri.u-picardie.fr [193.49.184.104]) by mailx.u-picardie.fr (Postfix) with ESMTP id 370D558105 for ; Thu, 23 Dec 2010 02:53:08 +0100 (CET) Received: by ezri.u-picardie.fr (Postfix, from userid 1000) id 57A4865B499; Thu, 23 Dec 2010 02:53:08 +0100 (CET) From: laurent+xfs@u-picardie.fr To: xfs@oss.sgi.com X-ASG-Orig-Subj: able to mount a fs, unable to repair it Subject: able to mount a fs, unable to repair it Date: Thu, 23 Dec 2010 02:53:08 +0100 Message-ID: <87r5d9uuez.fsf@ezri.u-picardie.fr> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: mx1.u-picardie.fr[193.49.184.7] X-Barracuda-Start-Time: 1293069191 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50222 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name X-Virus-Status: Clean Hi ! For a reason all my xfs FS got corrupted at the same time. My setup is: xen host using lvm on top of soft raid6 on top of jbod 3ware connected sata disks. Both the host and the VM fs got corrupted. ATM host is using 2.6.32 (debian/squeeze), xfsprogs are 3.1.4 I've had 2 kinds of corruptions: 1) unable to mount the FS, been able to xfs_repair -L 2) able to mount the FS, xfs_check was reporting errors, unable to xfs_repair the fs For most of the FS, i've managed to either mkfs.xfs or xfs_repair then rsync from the backup. I'm left with my 1.5TB fs for which i also have a full backup, i'm able to mount it (no kernel error or anything when mounting it). xfs_check on this unmounted FS gives errors. xfs_repair (after a long long time) is unable to find a suitable thingie to repair the FS. https://gist.github.com/752411 xfs_{db,check,repair,metadump} results. (haven't checked the memory/disk usage when doing the metadump) I can't really tell why all this happened in the first place. Been having power supply issues some weeks ago, been upgrading from lenny to squeeze, been playing with xen & lxc at the same, been doing my xmas shopping a bit late ! :-) I'd be curious to know how to repair the 1.5TB FS, any idea on what i could do ? TIA -- Laurent From SRS0+Prmc+26+fromorbit.com=david@internode.on.net Wed Dec 22 19:52:41 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBN1qfs2070150 for ; Wed, 22 Dec 2010 19:52:41 -0600 X-ASG-Debug-ID: 1293069278-4fd200640000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D4D3E219E0B for ; Wed, 22 Dec 2010 17:54:38 -0800 (PST) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id seEfTMARvOYESPcv for ; Wed, 22 Dec 2010 17:54:38 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50908728-1927428 for multiple; Thu, 23 Dec 2010 12:24:37 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PVaO4-0004lc-5s; Thu, 23 Dec 2010 12:54:36 +1100 Date: Thu, 23 Dec 2010 12:54:36 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/4] xfs: use struct list_head for the buf cancel table Subject: Re: [PATCH 2/4] xfs: use struct list_head for the buf cancel table Message-ID: <20101223015436.GB18264@dastard> References: <20101201220620.340188389@bombadil.infradead.org> <20101201220710.254521341@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101201220710.254521341@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1293069279 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0002 1.0000 -2.0197 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50222 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 01, 2010 at 05:06:22PM -0500, Christoph Hellwig wrote: > Signed-off-by: Christoph Hellwig looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+ai79+26+fromorbit.com=david@internode.on.net Wed Dec 22 19:54:40 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBN1se90070584 for ; Wed, 22 Dec 2010 19:54:40 -0600 X-ASG-Debug-ID: 1293069397-175101530000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id AD6AE1CEE045 for ; Wed, 22 Dec 2010 17:56:37 -0800 (PST) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id Ws5waSIBIkGrDuhy for ; Wed, 22 Dec 2010 17:56:37 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50296279-1927428 for multiple; Thu, 23 Dec 2010 12:26:36 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PVaPy-0004m1-0T; Thu, 23 Dec 2010 12:56:34 +1100 Date: Thu, 23 Dec 2010 12:56:33 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/4] xfs: refactor xlog_recover_commit_trans Subject: Re: [PATCH 3/4] xfs: refactor xlog_recover_commit_trans Message-ID: <20101223015633.GC18264@dastard> References: <20101201220620.340188389@bombadil.infradead.org> <20101201220710.454838485@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101201220710.454838485@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1293069398 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50222 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 01, 2010 at 05:06:23PM -0500, Christoph Hellwig wrote: > Merge the call to xlog_recover_reorder_trans and the loop over the > recovery items from xlog_recover_do_trans into xlog_recover_commit_trans, > and keep the switch statement over the log item types as a separate helper. > > Signed-off-by: Christoph Hellwig Much nicer. With the small "break" fix Alex commented on, it looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+02w5+26+fromorbit.com=david@internode.on.net Wed Dec 22 20:04:29 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBN24Sxf071572 for ; Wed, 22 Dec 2010 20:04:29 -0600 X-ASG-Debug-ID: 1293069985-0cfb02700000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 762E114789A9 for ; Wed, 22 Dec 2010 18:06:26 -0800 (PST) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id NpiUX3OPZDB8q5Ke for ; Wed, 22 Dec 2010 18:06:26 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50615217-1927428 for multiple; Thu, 23 Dec 2010 12:36:25 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PVaZT-0004n1-Ql; Thu, 23 Dec 2010 13:06:23 +1100 Date: Thu, 23 Dec 2010 13:06:23 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/4] xfs: untangle phase1 vs phase2 recovery helpers Subject: Re: [PATCH 4/4] xfs: untangle phase1 vs phase2 recovery helpers Message-ID: <20101223020623.GD18264@dastard> References: <20101201220620.340188389@bombadil.infradead.org> <20101201220710.647499265@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101201220710.647499265@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1293069987 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0002 1.0000 -2.0196 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50222 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 01, 2010 at 05:06:24PM -0500, Christoph Hellwig wrote: > Dispatch to a different helper for phase1 vs phase2 in xlog_recover_commit_trans > instead of doing it in all the low-level functions. > > Signed-off-by: Christoph Hellwig Good cleanup. That'll make it much easier to work out how to shoe-horn in item readahead to try to minimise log recovery times for large logs... Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From aelder@sgi.com Wed Dec 22 21:56:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBN3u1ML087034 for ; Wed, 22 Dec 2010 21:56:01 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8625AAC016 for ; Wed, 22 Dec 2010 19:58:00 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 22 Dec 2010 21:56:17 -0600 Subject: [PATCH 1/5] percpu_counter: fix test in __percpu_counter_add_unless_lt() From: Alex Elder Reply-To: aelder@sgi.com To: XFS Mailing List Content-Type: text/plain; charset="UTF-8" Date: Wed, 22 Dec 2010 21:56:15 -0600 Message-ID: <1293076575.2408.425.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 23 Dec 2010 03:56:17.0431 (UTC) FILETIME=[59E54A70:01CBA255] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean In __percpu_counter_add_unless_lt(), there is a test to see if a call to __percpu_counter_add() can be made, knowing the result will not be less than the given threshhold and the called function will do the addition without taking a lock. Unfortunately, it is using the wrong value in its comparison--the amount to add is not properly being taken into account. As a result, __percpu_counter_add() could end up adding a value when it should not. And even if the result will be non-negative, the called function may take the lock anyway because it does so if the *sum* of the (percpu) delta count and the given amount (and not just the amount alone) is greater than the batch size (or less than its negative). Fix the comparison, and since it __percpu_counter_add() will do the right thing (and might lock anyway), just call it regardless of what amount is getting added. Signed-off-by: Alex Elder --- lib/percpu_counter.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) Index: b/lib/percpu_counter.c =================================================================== --- a/lib/percpu_counter.c +++ b/lib/percpu_counter.c @@ -239,10 +239,10 @@ int __percpu_counter_add_unless_lt(struc goto out; /* - * If the counter is over the threshold and the change is less than the - * batch size, we might be able to avoid locking. + * If the updated counter will be over the threshold we know + * we can safely add, and might be able to avoid locking. */ - if (count > threshold + error && abs(amount) < batch) { + if (count + amount > threshold + error) { __percpu_counter_add(fbc, amount, batch); ret = 1; goto out; From aelder@sgi.com Wed Dec 22 21:56:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBN3u1x5087032 for ; Wed, 22 Dec 2010 21:56:01 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id 32D0CAC009 for ; Wed, 22 Dec 2010 19:57:57 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 22 Dec 2010 21:56:08 -0600 Subject: [PATCH 0/5] percpu_counter: modifications to __percpu_counter_add_unless_lt() From: Alex Elder Reply-To: aelder@sgi.com To: xfs@oss.sgi.com Content-Type: text/plain; charset="UTF-8" Date: Wed, 22 Dec 2010 21:56:07 -0600 Message-ID: <1293076567.2408.424.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 23 Dec 2010 03:56:09.0024 (UTC) FILETIME=[54E27C00:01CBA255] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This series is based on (i.e., applies on top of) the third patch in Dave Chinner's scalability series (lib: percpu counter add unless less than functionality). I had some questions while reviewing that patch, and after closer inspection I think I found what I think are some problems, and in order to work through them I came up with this patch series to lay out what I think the problems are and my attempt at addressing them. The series has been rearranged a bit since I put it together. Patch 3 includes some background and terminology that might be more useful at the beginning, but I'm leaving it as-is for now. The more I look at the end result of the series the more confident I am that it's correct. However I still need some convincing--either to point out where I've got something wrong, or to affirm that what I have is right. -Alex From aelder@sgi.com Wed Dec 22 21:56:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBN3u3ve087055 for ; Wed, 22 Dec 2010 21:56:03 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id 26FFDAC016 for ; Wed, 22 Dec 2010 19:58:02 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 22 Dec 2010 21:56:22 -0600 Subject: [PATCH 3/5] percpu_counter: fix error bound used in add_unless_lt function From: Alex Elder Reply-To: aelder@sgi.com To: xfs@oss.sgi.com Content-Type: text/plain; charset="UTF-8" Date: Wed, 22 Dec 2010 21:56:21 -0600 Message-ID: <1293076581.2408.430.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 23 Dec 2010 03:56:22.0946 (UTC) FILETIME=[5D2ED020:01CBA255] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean The __percpu_counter_add_unless_lt() function is designed to safely implement a conditional add operation on a percpu_counter, succeeding only if the result of the addition would produce a non-negative result. It goes to great lengths to avoid the need to take a spinlock(), but it currently is much more conservative than it has to be. The change below is simple, but I feel I need to provide a foundation of some background to argue that it is correct. The instantaneous "correct" value of a percpu_counter is the sum of its "aggregate" count value and all of its per-cpu "delta" counter values. This sum, as well as all the counts that comprise it, are all signed values. A global batch size, percpu_counter_batch, is maintained and used to limit how out-of-date the aggregate value is with the correct value of the percpu_counter. The aggregate count value is only updated under protection of a spinlock, and in several places taking the spinlock is avoided by understanding something about the bounds of what the per-cpu deltas could contribute to the percpu_counter's value. The possible range of the correct value of a percpu_counter can be represented as: percpu_counter->count +/- error where "error" is the current sum of all per-cpu deltas. The per-cpu delta values are only ever modified in two ways: they are either zeroed (in percpu_counter_set(), __percpu_counter_add(), and percpu_counter_hotcpu_callback()), or they are assigned a value whose absolute value is no more than the batch size (in __percpu_counter_add()). Therefore, each per-cpu delta value contributes no more than +/- the batch size to the value of the percpu_counter. And since at most num_online_cpus() deltas are maintained, the maximum (absolute) value of "error" is: num_online_cpus() * percpu_counter_batch In other words, the correct value of a percpu_counter can be described as within this range: percpu_counter->count +/- num_online_cpus() * percpu_counter_batch In __percpu_counter_add_unless_lt(), error is computed to be twice the size it needs to be, and this change fixes that. While we're at it, tweak percpu_counter_compare() so it uses a local variable "error" that serves the same purpose as its counterpart in __percpu_counter_add_unless_lt(). Signed-off-by: Alex Elder --- lib/percpu_counter.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) Index: b/lib/percpu_counter.c =================================================================== --- a/lib/percpu_counter.c +++ b/lib/percpu_counter.c @@ -192,10 +192,11 @@ static int __cpuinit percpu_counter_hotc int percpu_counter_compare(struct percpu_counter *fbc, s64 rhs) { s64 count; + s64 error = percpu_counter_batch * num_online_cpus(); count = percpu_counter_read(fbc); /* Check to see if rough count will be sufficient for comparison */ - if (abs(count - rhs) > percpu_counter_batch * num_online_cpus()) { + if (abs(count - rhs) > error) { if (count > rhs) return 1; return -1; @@ -227,7 +228,7 @@ int __percpu_counter_add_unless_lt(struc s64 threshold, s32 batch) { s64 count; - s64 error = 2 * batch * num_online_cpus(); + s64 error = batch * num_online_cpus(); int cpu; int ret = -1; From aelder@sgi.com Wed Dec 22 21:56:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBN3u323087057 for ; Wed, 22 Dec 2010 21:56:03 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id 77582AC017 for ; Wed, 22 Dec 2010 19:58:02 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 22 Dec 2010 21:56:28 -0600 Subject: [PATCH 2/5] percpu_counter: avoid potential underflow in add_unless_lt From: Alex Elder Reply-To: aelder@sgi.com To: XFS Mailing List Content-Type: text/plain; charset="UTF-8" Date: Wed, 22 Dec 2010 21:56:27 -0600 Message-ID: <1293076587.2408.431.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 23 Dec 2010 03:56:28.0993 (UTC) FILETIME=[60C98310:01CBA255] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean In __percpu_counter_add_unless_lt(), an assumption is made that under certain conditions it's possible to determine that an amount can be safely added to a counter, possibly without having to acquire the lock. This assumption is not valid, however. These lines encode the assumption: if (count + amount > threshold + error) { __percpu_counter_add(fbc, amount, batch); Inside __percpu_counter_add(), the addition is performed without acquiring the lock if the *sum* of the batch size and the CPU-local delta is within the batch size. Otherwise it does the addition after acquiring the lock. The problem is that *that* sum may actually end up being greater than the batch size, forcing the addition to be performed under protection of the lock. And by the time the lock is acquired, the value of fbc->count may have been updated such that adding the given amount allows the result to go negative. Fix this by open-coding the portion of the __percpu_counter_add() that avoids the lock. Signed-off-by: Alex Elder --- lib/percpu_counter.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) Index: b/lib/percpu_counter.c =================================================================== --- a/lib/percpu_counter.c +++ b/lib/percpu_counter.c @@ -243,9 +243,14 @@ int __percpu_counter_add_unless_lt(struc * we can safely add, and might be able to avoid locking. */ if (count + amount > threshold + error) { - __percpu_counter_add(fbc, amount, batch); - ret = 1; - goto out; + s32 *pcount = this_cpu_ptr(fbc->counters); + + count = *pcount + amount; + if (abs(count) < batch) { + *pcount = count; + ret = 1; + goto out; + } } /* From aelder@sgi.com Wed Dec 22 21:56:04 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBN3u3m9087059 for ; Wed, 22 Dec 2010 21:56:04 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id CAC84AC009 for ; Wed, 22 Dec 2010 19:58:02 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 22 Dec 2010 21:56:39 -0600 Subject: [PATCH 4/5] percpu_counter: tie error bounds more obviously to count values From: Alex Elder Reply-To: aelder@sgi.com To: XFS Mailing List Content-Type: text/plain; charset="UTF-8" Date: Wed, 22 Dec 2010 21:56:38 -0600 Message-ID: <1293076598.2408.433.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 23 Dec 2010 03:56:39.0962 (UTC) FILETIME=[67533FA0:01CBA255] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This change simply moves around the computed error bound used in a few spots so it is more closely associated with the count value. This is based on this interpretation of the correct value of of a percpu_counter: percpu_counter->count +/- error So when thinking about the code, it is useful to think of (count + error) or (count - error) to represent an upper or lower bound of the percpu_counter's value. And this change simply moves things around to match that way of thinking. Doing this made me realize there's another optimization to be made--namely skipping the per-cpu sum if after taking the lock we know the result will be below the threshold. Signed-off-by: Alex Elder --- lib/percpu_counter.c | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) Index: b/lib/percpu_counter.c =================================================================== --- a/lib/percpu_counter.c +++ b/lib/percpu_counter.c @@ -234,16 +234,21 @@ int __percpu_counter_add_unless_lt(struc preempt_disable(); - /* Check to see if rough count will be sufficient for comparison */ + /* + * Check to see if rough count will be sufficient for + * comparison. First, if the upper bound is too low, + * we're done. + */ count = percpu_counter_read(fbc); - if (count + amount < threshold - error) + if (count + error + amount < threshold) goto out; /* - * If the updated counter will be over the threshold we know - * we can safely add, and might be able to avoid locking. + * Next, if the lower bound is above the threshold, we can + * safely add the amount. See if we can do so without + * locking. */ - if (count + amount > threshold + error) { + if (count - error + amount > threshold) { s32 *pcount = this_cpu_ptr(fbc->counters); count = *pcount + amount; @@ -255,12 +260,21 @@ int __percpu_counter_add_unless_lt(struc } /* - * If the result is over the error threshold, we can just add it - * into the global counter ignoring what is in the per-cpu counters - * as they will not change the result of the calculation. + * We're within the error margin, so we need to be more + * precise. Take the lock, get the current count value, and + * check once more whether the result will be outside the + * error threshold. + * + * If we find we can safely add, just add the amount into + * the global counter ignoring what is in the per-cpu + * counters as they will not change the result of the + * calculation. */ spin_lock(&fbc->lock); - if (fbc->count + amount > threshold + error) { + if (fbc->count + error + amount < threshold) + goto out_unlock; + + if (fbc->count - error + amount > threshold) { fbc->count += amount; ret = 1; goto out_unlock; From aelder@sgi.com Wed Dec 22 21:56:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBN3u4iB087069 for ; Wed, 22 Dec 2010 21:56:04 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3AC05AC016 for ; Wed, 22 Dec 2010 19:58:03 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 22 Dec 2010 21:56:43 -0600 Subject: [PATCH 5/5] percpu_counter: only disable preemption if needed in add_unless_lt() From: Alex Elder Reply-To: aelder@sgi.com To: xfs@oss.sgi.com Content-Type: text/plain; charset="UTF-8" Date: Wed, 22 Dec 2010 21:56:42 -0600 Message-ID: <1293076602.2408.434.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 23 Dec 2010 03:56:43.0634 (UTC) FILETIME=[69838D20:01CBA255] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean In __percpu_counter_add_unless_lt() we don't need to disable preemption unless we're manipulating a per-cpu variable. That only happens in a limited case, so narrow the scope of that preemption to surround that case. This makes the "out" label rather unnecessary, so replace a couple "goto out" calls to just return. Signed-off-by: Alex Elder --- lib/percpu_counter.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) Index: b/lib/percpu_counter.c =================================================================== --- a/lib/percpu_counter.c +++ b/lib/percpu_counter.c @@ -232,8 +232,6 @@ int __percpu_counter_add_unless_lt(struc int cpu; int ret = -1; - preempt_disable(); - /* * Check to see if rough count will be sufficient for * comparison. First, if the upper bound is too low, @@ -241,7 +239,7 @@ int __percpu_counter_add_unless_lt(struc */ count = percpu_counter_read(fbc); if (count + error + amount < threshold) - goto out; + return -1; /* * Next, if the lower bound is above the threshold, we can @@ -251,12 +249,15 @@ int __percpu_counter_add_unless_lt(struc if (count - error + amount > threshold) { s32 *pcount = this_cpu_ptr(fbc->counters); + preempt_disable(); + pcount = this_cpu_ptr(fbc->counters); count = *pcount + amount; if (abs(count) < batch) { *pcount = count; - ret = 1; - goto out; + preempt_enable(); + return 1; } + preempt_enable(); } /* @@ -281,10 +282,9 @@ int __percpu_counter_add_unless_lt(struc } /* - * Result is withing the error margin. Run an open-coded sum of the - * per-cpu counters to get the exact value at this point in time, - * and if the result greater than the threshold, add the amount to - * the global counter. + * Now add in all the per-cpu counters to compute the exact + * value at this point in time, and if the result greater + * than the threshold, add the amount to the global counter. */ count = fbc->count; for_each_online_cpu(cpu) { @@ -301,8 +301,7 @@ int __percpu_counter_add_unless_lt(struc } out_unlock: spin_unlock(&fbc->lock); -out: - preempt_enable(); + return ret; } EXPORT_SYMBOL(__percpu_counter_add_unless_lt); From sandeen@sandeen.net Wed Dec 22 22:02:54 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBN42rYT088423 for ; Wed, 22 Dec 2010 22:02:54 -0600 X-ASG-Debug-ID: 1293077091-1a8400190000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 253AC1CEE682 for ; Wed, 22 Dec 2010 20:04:51 -0800 (PST) Received: from mail.sandeen.net (64-131-28-21.usfamily.net [64.131.28.21]) by cuda.sgi.com with ESMTP id asBUDujRDirKSz3h for ; Wed, 22 Dec 2010 20:04:51 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id A54C44882007; Wed, 22 Dec 2010 22:04:50 -0600 (CST) Message-ID: <4D12CA62.20902@sandeen.net> Date: Wed, 22 Dec 2010 22:04:50 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: laurent+xfs@u-picardie.fr CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: able to mount a fs, unable to repair it Subject: Re: able to mount a fs, unable to repair it References: <87r5d9uuez.fsf@ezri.u-picardie.fr> In-Reply-To: <87r5d9uuez.fsf@ezri.u-picardie.fr> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-28-21.usfamily.net[64.131.28.21] X-Barracuda-Start-Time: 1293077092 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50228 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 12/22/10 7:53 PM, laurent+xfs@u-picardie.fr wrote: > > Hi ! > > For a reason all my xfs FS got corrupted at the same time. > My setup is: xen host using lvm on top of soft raid6 on top of jbod > 3ware connected sata disks. > Both the host and the VM fs got corrupted. > > ATM host is using 2.6.32 (debian/squeeze), xfsprogs are 3.1.4 > > I've had 2 kinds of corruptions: > 1) unable to mount the FS, been able to xfs_repair -L > 2) able to mount the FS, xfs_check was reporting errors, unable to > xfs_repair the fs > > For most of the FS, i've managed to either mkfs.xfs or xfs_repair then > rsync from the backup. > > I'm left with my 1.5TB fs for which i also have a full backup, i'm > able to mount it (no kernel error or anything when > mounting it). xfs_check on this unmounted FS gives errors. xfs_repair > (after a long long time) is unable to find a suitable thingie to > repair the FS. > > https://gist.github.com/752411 xfs_{db,check,repair,metadump} results. > (haven't checked the memory/disk usage when doing the metadump) > > I can't really tell why all this happened in the first place. > Been having power supply issues some weeks ago, been upgrading from > lenny to squeeze, been playing with xen & lxc at the same, been doing > my xmas shopping a bit late ! :-) > > I'd be curious to know how to repair the 1.5TB FS, any idea on what i > could do ? > > TIA > for the image that segfaults, I'd say make an xfs_metadump and provide it for analysis, if the latest xfsprogs xfs_repair still segfaults. -Eric From yad.naveen@gmail.com Wed Dec 22 23:17:44 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBN5HhU5099491 for ; Wed, 22 Dec 2010 23:17:44 -0600 X-ASG-Debug-ID: 1293081580-207202130000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-qy0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2C46114794C4 for ; Wed, 22 Dec 2010 21:19:41 -0800 (PST) Received: from mail-qy0-f181.google.com (mail-qy0-f181.google.com [209.85.216.181]) by cuda.sgi.com with ESMTP id Z7MqqXUnF6pZLitu for ; Wed, 22 Dec 2010 21:19:41 -0800 (PST) Received: by qyk12 with SMTP id 12so6336304qyk.5 for ; Wed, 22 Dec 2010 21:19:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:content-type :content-transfer-encoding; bh=mqdMQDBG3TqXj6N9Y+Be4Ww971+Qoh6e7H8Qwz6Glww=; b=cl5qwhac1EyU49+Lfar2hQWpTVD6qLDuwfXJBKY8X7/qoya8z4wnLKophLzGi1+FXJ vi5jJzs80iIWIm/PxzTKEtA5w0CrV6wHxqoW02Fqpi5vpEo1DMKtB87ewR7xykMRDyzU fJsWTo7Ifo/dSz00RgId5if4JaPgy4NV36HSU= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type:content-transfer-encoding; b=h08GyHnmeTSqp9mXNZ4Z15xSxcX8of115xoznRfsb1U6fxms1oM/DSi7pX6kSXQ53U c0ADmz0qOPTpAVHYmRDWRjj4m93KcYg6EwPy7tTAvfNpA6M9W+tyGvc0PQVksGRa5VY0 GV4BZiPF2l69QbTydvlGE8l9SHTZFpcx/jGok= MIME-Version: 1.0 Received: by 10.229.84.147 with SMTP id j19mr6693647qcl.210.1293081580500; Wed, 22 Dec 2010 21:19:40 -0800 (PST) Received: by 10.229.75.13 with HTTP; Wed, 22 Dec 2010 21:19:40 -0800 (PST) In-Reply-To: References: <20101221213101.GA4907@dastard> <20101222053730.GG4907@dastard> Date: Thu, 23 Dec 2010 10:49:40 +0530 Message-ID: X-ASG-Orig-Subj: Re: Issue on kernel 2.6.35.9 vanilla Subject: Re: Issue on kernel 2.6.35.9 vanilla From: naveen yadav To: Dave Chinner , xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-qy0-f181.google.com[209.85.216.181] X-Barracuda-Start-Time: 1293081582 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50233 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_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi Dave, The question you ask about log difference, the reason is I just reboot my PC and again reconnect my corrupted disk again, FYI, I already send rest of info in my previous mail, If you need more info, i will provide Thanks On Wed, Dec 22, 2010 at 12:30 PM, naveen yadav wrote= : > Thanks a lot Dave, > > Please find attached log for command xfs_repair -n. > > Thanks a lot > > On Wed, Dec 22, 2010 at 11:07 AM, Dave Chinner wrot= e: >> On Wed, Dec 22, 2010 at 10:27:16AM +0530, naveen yadav wrote: >>> Hi Dave, >>> >>> Please find attached log as suggested by you. >>> >>> Kind regards >>> Naveen >>> >>> On Wed, Dec 22, 2010 at 3:01 AM, Dave Chinner wro= te: >>> > On Tue, Dec 21, 2010 at 07:41:51PM +0530, naveen yadav wrote: >>> >> Hi all, >>> >> >>> >> We have one disk that got corrupted, when I connect to my PC, havein= g >>> >> kernel version(2.6.35.9). >>> >> The Disk mount well, but when i do 'ls; command it hangs. >>> > >>> > ls shouldn't hang. This should return: >>> > >>> >> Please find the dmesg. >>> >> /0x22 [xfs] >>> >> =A0[] xfs_da_do_buf+0x582/0x628 [xfs] >>> >> =A0[] ? xfs_da_read_buf+0x1d/0x22 [xfs] >>> >> =A0[] ? xfs_da_node_lookup_int+0x52/0x207 [xfs] >>> >> =A0[] ? xfs_da_read_buf+0x1d/0x22 [xfs] >>> >> =A0[] xfs_da_read_buf+0x1d/0x22 [xfs] >>> >> =A0[] ? xfs_da_node_lookup_int+0x52/0x207 [xfs] >>> >> =A0[] xfs_da_node_lookup_int+0x52/0x207 [xfs] >> ..... >>> >> c2d9d000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff =A0.......= ......... >>> >> Filesystem "sdb2": XFS internal error xfs_da_do_buf(2) at line 2113 = of >>> >> file fs/xfs/xfs_da_btree.c. =A0Caller 0xe0dfd3ce >> >> This is not in your dmesg log. When did it actually happen? Before >> the hung task timer started to trip? From your log: >> >> scsi 5:0:0:0: Direct-Access =A0 =A0 SanDisk =A0Cruzer Blade =A0 =A0 1.00= PQ: 0 ANSI: 2 >> sd 5:0:0:0: Attached scsi generic sg1 type 0 >> sd 5:0:0:0: [sdb] 15625216 512-byte logical blocks: (8.00 GB/7.45 GiB) >> sd 5:0:0:0: [sdb] Write Protect is off >> sd 5:0:0:0: [sdb] Mode Sense: 03 00 00 00 >> sd 5:0:0:0: [sdb] Assuming drive cache: write through >> sd 5:0:0:0: [sdb] Assuming drive cache: write through >> =A0sdb: sdb1 sdb2 >> sd 5:0:0:0: [sdb] Assuming drive cache: write through >> sd 5:0:0:0: [sdb] Attached SCSI removable disk >> SELinux: initialized (dev sdb1, type vfat), uses genfs_contexts >> XFS mounting filesystem sdb2 >> Starting XFS recovery on filesystem: sdb2 (logdev: internal) >> Ending XFS recovery on filesystem: sdb2 (logdev: internal) >> SELinux: initialized (dev sdb2, type xfs), uses xattr >> INFO: task gvfs-gdu-volume:2311 blocked for more than 120 seconds. >> "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message= . >> gvfs-gdu-volu D 00000026 =A0 =A0 0 =A02311 =A0 =A0 =A01 0x00000080 >> =A0c6cf9b2c 00000086 a41cc623 00000026 c0a25e00 c0a25e00 c0a25e00 c0a25e= 00 >> =A0d1290f54 c0a25e00 c0a25e00 000336ad 00000000 cd871c00 00000026 d1290c= d0 >> =A000000000 cd8d2a08 cd8d2a00 7fffffff 7fffffff c6cf9b70 c0781c43 000000= 00 >> Call Trace: >> =A0[] schedule_timeout+0x1b/0x95 >> =A0[] __down_common+0x82/0xb9 >> =A0[] ? _xfs_buf_find+0x122/0x1b8 [xfs] >> =A0[] __down+0x17/0x19 >> =A0[] down+0x27/0x37 >> =A0[] xfs_buf_lock+0x67/0x93 [xfs] >> =A0[] _xfs_buf_find+0x122/0x1b8 [xfs] >> =A0[] xfs_buf_get+0x60/0x149 [xfs] >> =A0[] xfs_buf_read+0x22/0xb0 [xfs] >> =A0[] xfs_trans_read_buf+0x53/0x2e9 [xfs] >> =A0[] xfs_da_do_buf+0x411/0x628 [xfs] >> =A0[] ? xfs_da_node_lookup_int+0x52/0x207 [xfs] >> =A0[] xfs_da_read_buf+0x1d/0x22 [xfs] >> =A0[] ? xfs_da_node_lookup_int+0x52/0x207 [xfs] >> =A0[] xfs_da_node_lookup_int+0x52/0x207 [xfs] >> =A0[] xfs_dir2_node_lookup+0x5f/0xee [xfs] >> =A0[] xfs_dir_lookup+0xde/0x110 [xfs] >> =A0[] xfs_lookup+0x50/0x9f [xfs] >> =A0[] xfs_vn_lookup+0x3e/0x76 [xfs] >> =A0[] do_lookup+0xc9/0x139 >> =A0[] do_last+0x186/0x49f >> =A0[] do_filp_open+0x1bd/0x459 >> =A0[] ? timekeeping_get_ns+0x16/0x54 >> =A0[] ? might_fault+0x1e/0x20 >> =A0[] ? alloc_fd+0x58/0xbe >> =A0[] do_sys_open+0x4d/0xe4 >> =A0[] ? audit_syscall_entry+0x12a/0x14c >> =A0[] sys_open+0x23/0x2b >> =A0[] sysenter_do_call+0x12/0x2d >> >> You've got a gvfs (gnome-vfs?) process stuck waiting on a buffer >> lock. The onyl way I can see it getting stuck here is if it the >> buffer has not been unlocked somewhere. It's possible that it is >> stuck on the same buffer that the corruption error came from, >> but the corrupted buffer is unlocked in the error handling path. >> what does `xfs_repair -n` tell about the filesytsem? >> >> FWIW, later on: >> >> ...... >> INFO: task gvfsd-trash:1891 blocked for more than 120 seconds. >> "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message= . >> gvfsd-trash =A0 D 00000026 =A0 =A0 0 =A01891 =A0 =A0 =A01 0x00000080 >> >> gvfs-trashd gets stuck on a mutex during a path walk which is >> probably held by the above directory read. >> >> .... >> INFO: task gvfs-gdu-volume:2321 blocked for more than 120 seconds. >> "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message= . >> gvfs-gdu-volu D 00000026 =A0 =A0 0 =A02321 =A0 =A0 =A01 0x00000088 >> >> As does this one. >> >> .... >> >> gvfs-gdu-volu D 00000026 =A0 =A0 0 =A01889 =A0 =A0 =A01 0x00000080 >> =A0cda3df10 00000086 a422923c 00000026 c0a25e00 c0a25e00 c0a25e00 c0a25e= 00 >> =A0cd936904 c0a25e00 c0a25e00 000b9ea1 00000000 cda24400 00000026 cd9366= 80 >> =A000ae3000 c34c01a4 c34c019c cd936680 c34c01a0 cda3df44 c0782093 c34c01= ac >> Call Trace: >> =A0[] __mutex_lock_common+0xe8/0x137 >> =A0[] __mutex_lock_killable_slowpath+0x17/0x19 >> =A0[] ? mutex_lock_killable+0x32/0x45 >> =A0[] mutex_lock_killable+0x32/0x45 >> =A0[] vfs_readdir+0x46/0x94 >> =A0[] ? filldir64+0x0/0xf5 >> =A0[] sys_getdents64+0x72/0xb2 >> =A0[] sysenter_do_call+0x12/0x2d >> >> And this one, too. >> >> ..... >> ls =A0 =A0 =A0 =A0 =A0 =A0D 00000000 =A0 =A0 0 =A02325 =A0 2044 0x000000= 80 >> =A0c6d03f10 00200086 00000000 00000000 c0a25e00 c0a25e00 c0a25e00 c0a25e= 00 >> =A0cdacb5c4 c0a25e00 c0a25e00 d6779fa1 00000029 00000000 00000029 cdacb3= 40 >> =A000000001 c34c01a4 c34c019c cdacb340 c34c01a0 c6d03f44 c0782093 c34c01= ac >> Call Trace: >> =A0[] __mutex_lock_common+0xe8/0x137 >> =A0[] __mutex_lock_killable_slowpath+0x17/0x19 >> =A0[] ? mutex_lock_killable+0x32/0x45 >> =A0[] mutex_lock_killable+0x32/0x45 >> =A0[] vfs_readdir+0x46/0x94 >> =A0[] ? filldir64+0x0/0xf5 >> =A0[] sys_getdents64+0x72/0xb2 >> =A0[] sysenter_do_call+0x12/0x2d >> >> And finally, there is an ls process that is hung, stuck on a >> directory mutex. Is this the one you were seeing hang rather than >> whatever generated the corrupion report? >> >> Cheers, >> >> Dave. >> -- >> Dave Chinner >> david@fromorbit.com >> > From SRS0+Prmc+26+fromorbit.com=david@internode.on.net Thu Dec 23 00:04:59 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBN64w2F108865 for ; Thu, 23 Dec 2010 00:04:59 -0600 X-ASG-Debug-ID: 1293084415-47ff017c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E7D4E1479154 for ; Wed, 22 Dec 2010 22:06:55 -0800 (PST) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id EHHKAFOUpYqt8cLi for ; Wed, 22 Dec 2010 22:06:55 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50934656-1927428 for multiple; Thu, 23 Dec 2010 16:36:54 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PVeKC-000559-H3; Thu, 23 Dec 2010 17:06:52 +1100 Date: Thu, 23 Dec 2010 17:06:52 +1100 From: Dave Chinner To: Alex Elder Cc: XFS Mailing List X-ASG-Orig-Subj: Re: [PATCH 1/5] percpu_counter: fix test in __percpu_counter_add_unless_lt() Subject: Re: [PATCH 1/5] percpu_counter: fix test in __percpu_counter_add_unless_lt() Message-ID: <20101223060652.GE18264@dastard> References: <1293076575.2408.425.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1293076575.2408.425.camel@doink> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1293084416 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50237 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 22, 2010 at 09:56:15PM -0600, Alex Elder wrote: > In __percpu_counter_add_unless_lt(), there is a test to see if > a call to __percpu_counter_add() can be made, knowing the result > will not be less than the given threshhold and the called function > will do the addition without taking a lock. > > Unfortunately, it is using the wrong value in its comparison--the > amount to add is not properly being taken into account. As a > result, __percpu_counter_add() could end up adding a value when it > should not. And even if the result will be non-negative, the called > function may take the lock anyway because it does so if the *sum* of > the (percpu) delta count and the given amount (and not just the amount > alone) is greater than the batch size (or less than its negative). > > Fix the comparison, and since it __percpu_counter_add() will do > the right thing (and might lock anyway), just call it regardless > of what amount is getting added. > > Signed-off-by: Alex Elder > > --- > lib/percpu_counter.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > Index: b/lib/percpu_counter.c > =================================================================== > --- a/lib/percpu_counter.c > +++ b/lib/percpu_counter.c > @@ -239,10 +239,10 @@ int __percpu_counter_add_unless_lt(struc > goto out; > > /* > - * If the counter is over the threshold and the change is less than the > - * batch size, we might be able to avoid locking. > + * If the updated counter will be over the threshold we know > + * we can safely add, and might be able to avoid locking. > */ > - if (count > threshold + error && abs(amount) < batch) { > + if (count + amount > threshold + error) { > __percpu_counter_add(fbc, amount, batch); > ret = 1; > goto out; What you have is what I first implemented following your exact logic. However, after having several assert failures n the XFS code, I realised that the logic fails when there are concurrent modifications with abs(amount) > batch. To demonstrate, take the initial conditions: threshold = 0 amount = -39 (for ease of maths) batch = 32 error = 256 (2 * 32 * 4 cpus) with the per CPU counter values: fbc->count = 296 CPU 0 1 2 3 value -31 -31 -31 -31 And the start the concurrent modification such that every racing CPU sees fbc->count = 296 at their initial sample. All evaluate it as: count = 296 if (296 - 39 > 0 + 256) { and so take the __percpu_counter_add() path. Assuming CPUs 1-3 complete before CPU 0, the counter changes value like: cpu 1 pcp_cnt_add_lt(-39) CPU 0 1 2 3 value -31 0 -31 -31 fbc->count = 216 cpu 2 pcp_cnt_add_lt(-39) CPU 0 1 2 3 value -31 0 0 -31 fbc->count = 136 cpu 3 pcp_cnt_add_lt(-39) CPU 0 1 2 3 value -31 0 0 0 fbc->count = 56 And the we run the counter add on CPU 0: __percpu_counter_add(fbc, -39, 32); CPU 0 1 2 3 value 0 0 0 0 fbc->count = -24 And we've just blown through the threshold. We modified the counter and pushed the result less than the threshold which we are not supposed to be, and worst yet is the fact we returning a positive number indicating that we _didn't_ bust the threshold. Analysis of the failures lead me to this lead me to this logic for the unlocked check in my proposed patch: We can do unlocked modifications concurrently on all CPUs IFF 1. the code cannot be preempted between sampling fbc->count and calling __percpu_counter_add() 2. -batch < amount < batch 3. the error bound is set to 2 * batch * nr_cpus To demonstrate the worst case initial conditions, but being bound by the above rules: threshold = 0 amount = -31 batch = 32 error = 256 (2 * 32 * 4 cpus) per CPU counters are at worst case lower edge for lt detection: CPU 0 1 2 3 value -31 -31 -31 -31 fbc->count = 258 and the racing CPUs are all doing equivalent add_unless_lt of -31. Every racing CPU sees fbc->count = 258 at their initial sample. what we end up with is: CPU 0: Racing CPUs count = 258 if (258 > 0 + 256) { cpu 1 pcp_cnt_add_lt(-31) CPU 0 1 2 3 value -31 0 -31 -31 fbc->count = 196 cpu 2 pcp_cnt_add_lt(-31) CPU 0 1 2 3 value -31 0 0 -31 fbc->count = 134 cpu 3 pcp_cnt_add_lt(-31) CPU 0 1 2 3 value -31 0 0 0 fbc->count = 70 __percpu_counter_add(fbc, -31, 32); CPU 0 1 2 3 value 0 0 0 0 fbc->count = 6 And so the return value of 1 is valid because 6 > 0. Indeed, looking at this I can probably change the rule to -batch <= amount <= batch, because the above with amount = -32 would give and end value of fbc->count = 2.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+02w5+26+fromorbit.com=david@internode.on.net Thu Dec 23 00:29:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBN6TimX113010 for ; Thu, 23 Dec 2010 00:29:45 -0600 X-ASG-Debug-ID: 1293085901-693101d90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 592CE1CEEF89 for ; Wed, 22 Dec 2010 22:31:41 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id jZRLEeeRSJYZR9sV for ; Wed, 22 Dec 2010 22:31:41 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 50826503-1927428 for multiple; Thu, 23 Dec 2010 17:01:40 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PVeiB-00058b-1W; Thu, 23 Dec 2010 17:31:39 +1100 Date: Thu, 23 Dec 2010 17:31:38 +1100 From: Dave Chinner To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 5/5] percpu_counter: only disable preemption if needed in add_unless_lt() Subject: Re: [PATCH 5/5] percpu_counter: only disable preemption if needed in add_unless_lt() Message-ID: <20101223063138.GF18264@dastard> References: <1293076602.2408.434.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1293076602.2408.434.camel@doink> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1293085903 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50238 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 22, 2010 at 09:56:42PM -0600, Alex Elder wrote: > In __percpu_counter_add_unless_lt() we don't need to disable > preemption unless we're manipulating a per-cpu variable. That only > happens in a limited case, so narrow the scope of that preemption to > surround that case. This makes the "out" label rather unnecessary, > so replace a couple "goto out" calls to just return. > > Signed-off-by: Alex Elder > > --- > lib/percpu_counter.c | 21 ++++++++++----------- > 1 file changed, 10 insertions(+), 11 deletions(-) > > Index: b/lib/percpu_counter.c > =================================================================== > --- a/lib/percpu_counter.c > +++ b/lib/percpu_counter.c > @@ -232,8 +232,6 @@ int __percpu_counter_add_unless_lt(struc > int cpu; > int ret = -1; > > - preempt_disable(); > - > /* > * Check to see if rough count will be sufficient for > * comparison. First, if the upper bound is too low, > @@ -241,7 +239,7 @@ int __percpu_counter_add_unless_lt(struc > */ > count = percpu_counter_read(fbc); > if (count + error + amount < threshold) > - goto out; > + return -1; > > /* > * Next, if the lower bound is above the threshold, we can > @@ -251,12 +249,15 @@ int __percpu_counter_add_unless_lt(struc > if (count - error + amount > threshold) { > s32 *pcount = this_cpu_ptr(fbc->counters); > > + preempt_disable(); > + pcount = this_cpu_ptr(fbc->counters); > count = *pcount + amount; > if (abs(count) < batch) { > *pcount = count; > - ret = 1; > - goto out; > + preempt_enable(); > + return 1; > } > + preempt_enable(); > } Regardless of the other changes, this is not valid. That is: amount = -1; count = fbc->count; ..... count (i.e lots more than error will catch), so the current value of count in this context is wrong and cannot be trusted> if (count - error + amount > threshold) { .... } Effectively, if we want to be able to use lockless optimisations, we need to ensure that the value of the global counter that we read remains within the given error bounds until we have finished making the lockless modification. That is done via disabling preemption across the entire function... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+02w5+26+fromorbit.com=david@internode.on.net Thu Dec 23 00:38:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBN6c2KV114698 for ; Thu, 23 Dec 2010 00:38:03 -0600 X-ASG-Debug-ID: 1293086399-47ff03000000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9D0A8147954B for ; Wed, 22 Dec 2010 22:40:00 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id wAjUc8V3f66hIMeb for ; Wed, 22 Dec 2010 22:40:00 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51337956-1927428 for multiple; Thu, 23 Dec 2010 17:09:58 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PVeqD-00059R-8c; Thu, 23 Dec 2010 17:39:57 +1100 Date: Thu, 23 Dec 2010 17:39:57 +1100 From: Dave Chinner To: Alex Elder Cc: XFS Mailing List X-ASG-Orig-Subj: Re: [PATCH 2/5] percpu_counter: avoid potential underflow in add_unless_lt Subject: Re: [PATCH 2/5] percpu_counter: avoid potential underflow in add_unless_lt Message-ID: <20101223063957.GG18264@dastard> References: <1293076587.2408.431.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1293076587.2408.431.camel@doink> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1293086401 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50239 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 22, 2010 at 09:56:27PM -0600, Alex Elder wrote: > In __percpu_counter_add_unless_lt(), an assumption is made that > under certain conditions it's possible to determine that an amount > can be safely added to a counter, possibly without having to acquire > the lock. This assumption is not valid, however. > > These lines encode the assumption: > if (count + amount > threshold + error) { > __percpu_counter_add(fbc, amount, batch); > > Inside __percpu_counter_add(), the addition is performed > without acquiring the lock if the *sum* of the batch size > and the CPU-local delta is within the batch size. Otherwise > it does the addition after acquiring the lock. > > The problem is that *that* sum may actually end up being greater > than the batch size, forcing the addition to be performed under > protection of the lock. And by the time the lock is acquired, the > value of fbc->count may have been updated such that adding the given > amount allows the result to go negative. > > Fix this by open-coding the portion of the __percpu_counter_add() > that avoids the lock. > > Signed-off-by: Alex Elder > > --- > lib/percpu_counter.c | 11 ++++++++--- > 1 file changed, 8 insertions(+), 3 deletions(-) > > Index: b/lib/percpu_counter.c > =================================================================== > --- a/lib/percpu_counter.c > +++ b/lib/percpu_counter.c > @@ -243,9 +243,14 @@ int __percpu_counter_add_unless_lt(struc > * we can safely add, and might be able to avoid locking. > */ > if (count + amount > threshold + error) { > - __percpu_counter_add(fbc, amount, batch); > - ret = 1; > - goto out; > + s32 *pcount = this_cpu_ptr(fbc->counters); > + > + count = *pcount + amount; > + if (abs(count) < batch) { > + *pcount = count; > + ret = 1; > + goto out; > + } > } The problem with this is that it never zeros pcount. That means after a bunch of increments or decrements, abs(*pcount) == 31, and ever further increment/decrement will drop through to the path that requires locking. Then we simply have a very expensive global counter. We need to take the lock to zero the pcount value because it has to be added to fbc->count. i.e. if you want this path to remain mostly lockless, then it needs to do exactly what __percpu_counter_add() does.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From jpiszcz@lucidpixels.com Thu Dec 23 03:41:29 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBN9fSUj142175 for ; Thu, 23 Dec 2010 03:41:29 -0600 X-ASG-Debug-ID: 1293097406-110a00f40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lucidpixels.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 13ED521AA58 for ; Thu, 23 Dec 2010 01:43:26 -0800 (PST) Received: from lucidpixels.com (lucidpixels.com [75.144.35.66]) by cuda.sgi.com with ESMTP id cYKAdxIaFzH85ltC for ; Thu, 23 Dec 2010 01:43:26 -0800 (PST) Received: by lucidpixels.com (Postfix, from userid 1001) id 256681204B5; Thu, 23 Dec 2010 04:43:26 -0500 (EST) Date: Thu, 23 Dec 2010 04:43:26 -0500 (EST) From: Justin Piszcz To: Dave Chinner cc: Eric Sandeen , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? In-Reply-To: <20101223005630.GJ4907@dastard> Message-ID: References: <20101222175611.1c7d5190@harpe.intellique.com> <4D124B71.9030401@sandeen.net> <20101223012655.2681c596@galadriel.home> <20101223005630.GJ4907@dastard> User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="655872-1901294152-1293097406=:7452" X-Barracuda-Connect: lucidpixels.com[75.144.35.66] X-Barracuda-Start-Time: 1293097407 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50250 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. --655872-1901294152-1293097406=:7452 Content-Type: TEXT/PLAIN; charset=iso-8859-1; format=flowed Content-Transfer-Encoding: QUOTED-PRINTABLE On Thu, 23 Dec 2010, Dave Chinner wrote: > On Wed, Dec 22, 2010 at 07:28:29PM -0500, Justin Piszcz wrote: >> >> >> On Thu, 23 Dec 2010, Emmanuel Florac wrote: >> >>> Le Wed, 22 Dec 2010 13:03:13 -0600 vous =E9criviez: >>> >>>> http://xfs.org/index.php/XFS_FAQ#Q:_I_want_to_tune_my_XFS_filesystems_= for_.3Csomething.3E >>>> >>>> which mentions getting your geometry right if it's hardware raid >>>> that can't be detected automatically. >>> >>> Just as a side note : I tried several times to manually set the >>> filesystem layout to precisely match the underlying hardware RAID >>> with sunit and swidth but didn't find that it made a noticeable >>> difference. On my 39.9 TB systems, the default agcount is 39, while the >>> optimum would be (theorically at least) 42. >> >> Hi, I concur, for hardware raid (at least on 3ware cards) I have >> found it makes no difference, thanks for confirming. > > I'd constrain that statement to "no difference for the workloads > and hardware tested". > > Indeed, testing an empty filesystem will often show no difference in > performance, because typically problems don't show up until you've > started to age the filesystem significantly. When the filesystem has > started to age, the difference between having done lots of stripe > unit/width aligned allocation vs none can be very significant.... > > Hence don't assume that because you can't see any difference on a > brand new, empty filesystem there never will be a difference over > the life of the filesytem... > > Cheers, > > Dave. > --=20 > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > Hi Dave, So for an 18 disk raid-6 with 256k stripe you would recommend: mkfs.xfs with su=3D256k,sw=3D16 for optimal performance with inode64 mount= =20 option? Justin. --655872-1901294152-1293097406=:7452-- From eflorac@intellique.com Thu Dec 23 06:01:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBNC1SYt162553 for ; Thu, 23 Dec 2010 06:01:28 -0600 X-ASG-Debug-ID: 1293105803-606200d20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0DD03147AEF6 for ; Thu, 23 Dec 2010 04:03:24 -0800 (PST) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id t7HClqhBJbZoRnzx for ; Thu, 23 Dec 2010 04:03:24 -0800 (PST) Received: from harpe.intellique.com (unknown [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id 919A34C814D; Thu, 23 Dec 2010 13:03:18 +0100 (CET) Date: Thu, 23 Dec 2010 13:03:22 +0100 From: Emmanuel Florac To: Justin Piszcz Cc: Dave Chinner , Eric Sandeen , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? Message-ID: <20101223130322.28644309@harpe.intellique.com> In-Reply-To: References: <20101222175611.1c7d5190@harpe.intellique.com> <4D124B71.9030401@sandeen.net> <20101223012655.2681c596@galadriel.home> <20101223005630.GJ4907@dastard> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.16.6; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1293105807 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50259 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Thu, 23 Dec 2010 04:43:26 -0500 (EST) Justin Piszcz =E9crivait: > So for an 18 disk raid-6 with 256k stripe you would recommend: >=20 > mkfs.xfs with su=3D256k,sw=3D16 for optimal performance with inode64 > mount option? >=20 Yes that should be the best setting.=20 --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From j.fikar@gmail.com Thu Dec 23 06:30:42 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,FREEMAIL_FROM, J_CHICKENPOX_27,T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBNCUfDm167342 for ; Thu, 23 Dec 2010 06:30:42 -0600 X-ASG-Debug-ID: 1293107560-79e2022e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-iy0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1153C21B337 for ; Thu, 23 Dec 2010 04:32:40 -0800 (PST) Received: from mail-iy0-f181.google.com (mail-iy0-f181.google.com [209.85.210.181]) by cuda.sgi.com with ESMTP id UH0phAaObmCemkGp for ; Thu, 23 Dec 2010 04:32:40 -0800 (PST) Received: by iyj18 with SMTP id 18so5669007iyj.26 for ; Thu, 23 Dec 2010 04:32:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:date:message-id :subject:from:to:content-type; bh=WVH+VUGHuv+c7jCutjWnySfzSJEQe1xIm6yYW0f85VM=; b=g7GT4UnGW0i8bsuFGD9u590+cwTrPAZ7xoib9xadN71PI/VeqtBCqM8kXR7bh/62Al 4awAYfDnXA7zw3RvfnNZtXGcZLA13vLK6G5FkiiG/9RuV+zesLx8Q2mJ3p1qitKoqnnm EAYb6vjKLdN8rr8L1T0edurQjQXf/nfXAiaK4= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=hPdjmQrCsQhHzfyp9TqYlXS433Xib1IgFMkmt8I7NQWEb3fZUWlhm6aQLAMGUJz9Rj oeqxzV66BZ9CVfoLk+Y3CZB7Qotg5XR2aNUgzyjIgJRo6phN6hxhYMgQRWRKivHpflrM UQdW+oR5ChyRff1xUjh7WqzN9jTgtW6MQXYmQ= MIME-Version: 1.0 Received: by 10.231.19.136 with SMTP id a8mr8053089ibb.73.1293107560341; Thu, 23 Dec 2010 04:32:40 -0800 (PST) Received: by 10.231.206.75 with HTTP; Thu, 23 Dec 2010 04:32:40 -0800 (PST) Date: Thu, 23 Dec 2010 13:32:40 +0100 Message-ID: X-ASG-Orig-Subj: no rw xfs file systems in mtab: /proc/mounts Subject: no rw xfs file systems in mtab: /proc/mounts From: Honza Fikar To: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-iy0-f181.google.com[209.85.210.181] X-Barracuda-Start-Time: 1293107561 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50261 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi guys, when I try "xfs_fsr -v -d" on my two computers, it says now: no rw xfs file systems in mtab: /proc/mounts while actually there is the LUKS encrypted root: ... /dev/mapper/root / xfs rw,noatime,attr2,inode64,logbufs=8,logbsize=256k,noquota 0 0 ... on the third computer it works as expected, there are two xfs file systems, one of them LUKS encrypted: ... /dev/root / xfs rw,noatime,attr2,delaylog,inode64,logbufs=8,logbsize=256k,noquota 0 0 /dev/mapper/encrypted /home xfs rw,noatime,attr2,delaylog,inode64,logbufs=8,logbsize=256k,sunit=512,swidth=1536,noquota 0 0 ... and it was working some time ago on all the three computers distribution gentoo xfsprogs 3.1.4, but I just tried git version and it's the same kernel 2.6.32, on the third machine 2.6.35 Best regards, Honza From sandeen@sandeen.net Thu Dec 23 09:00:37 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_27 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBNF0biv189897 for ; Thu, 23 Dec 2010 09:00:37 -0600 X-ASG-Debug-ID: 1293116555-7f43024b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 35FBD21B9AC for ; Thu, 23 Dec 2010 07:02:35 -0800 (PST) Received: from mail.sandeen.net (64-131-28-21.usfamily.net [64.131.28.21]) by cuda.sgi.com with ESMTP id gzxMSkzffRIRB5QE for ; Thu, 23 Dec 2010 07:02:35 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id A094A4815700; Thu, 23 Dec 2010 09:02:35 -0600 (CST) Message-ID: <4D13648B.8000105@sandeen.net> Date: Thu, 23 Dec 2010 09:02:35 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: Honza Fikar CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: no rw xfs file systems in mtab: /proc/mounts Subject: Re: no rw xfs file systems in mtab: /proc/mounts References: In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-28-21.usfamily.net[64.131.28.21] X-Barracuda-Start-Time: 1293116556 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50272 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 12/23/10 6:32 AM, Honza Fikar wrote: > Hi guys, > > when I try "xfs_fsr -v -d" on my two computers, it says now: > > no rw xfs file systems in mtab: /proc/mounts hm that's a little confusing, what it means is it looked in /proc/mounts and did not find anything, or so it thought. As a result of: 89e4b5bd5615edc584a5111c86f12b4f89f8dd7d xfs_fsr: use /proc/mounts if available What does your /proc/mounts show? -Eric > while actually there is the LUKS encrypted root: > ... > /dev/mapper/root / xfs > rw,noatime,attr2,inode64,logbufs=8,logbsize=256k,noquota 0 0 > ... > > on the third computer it works as expected, there are two xfs file > systems, one of them LUKS encrypted: > ... > /dev/root / xfs > rw,noatime,attr2,delaylog,inode64,logbufs=8,logbsize=256k,noquota 0 0 > /dev/mapper/encrypted /home xfs > rw,noatime,attr2,delaylog,inode64,logbufs=8,logbsize=256k,sunit=512,swidth=1536,noquota > 0 0 > ... > > and it was working some time ago on all the three computers > > distribution gentoo > xfsprogs 3.1.4, but I just tried git version and it's the same > kernel 2.6.32, on the third machine 2.6.35 > > Best regards, > Honza > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From petre.rodan@simplex.ro Thu Dec 23 10:55:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_26, J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBNGtEFg205855 for ; Thu, 23 Dec 2010 10:55:14 -0600 X-ASG-Debug-ID: 1293123431-2fa8008d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from passage.avira.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0187D1CF4A3A for ; Thu, 23 Dec 2010 08:57:12 -0800 (PST) Received: from passage.avira.com (passage.avira.com [89.238.222.20]) by cuda.sgi.com with ESMTP id CEAVAa8E7ijEjsKf for ; Thu, 23 Dec 2010 08:57:12 -0800 (PST) Received: by passage.avira.com (Postfix/AVIRA, from userid 26) id E13611249FA; Thu, 23 Dec 2010 18:57:10 +0200 (EET) Received: from localhost (localhost [127.0.0.1]) by passage.avira.com (Postfix/AVIRA) with ESMTP id 4D1F41249F9 for ; Thu, 23 Dec 2010 18:57:10 +0200 (EET) Received: from passage.avira.com (localhost [127.0.0.1]) by localhost (AvMailGate-2.1.3-2) id 32035-tE83iY; Thu, 23 Dec 2010 18:57:10 +0200 (EET) Received: from naliboat.bu.avira.com (dasapass.avira.com [89.238.222.18]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "mail.bu.avira.com", Issuer "Avira Intermediate Certificate Authority 2010-2020" (not verified)) by passage.avira.com (Postfix/AVIRA) with ESMTPS id 40D941249F9 for ; Thu, 23 Dec 2010 18:57:10 +0200 (EET) Received: (qmail 4061 invoked from network); 23 Dec 2010 16:57:10 -0000 Received: from unknown (HELO peter.simplex.ro) (prodan@10.7.0.16) by naliboat.bu.avira.com with ESMTPA; 23 Dec 2010 16:57:10 -0000 Date: Thu, 23 Dec 2010 18:55:32 +0200 From: Petre Rodan To: xfs@oss.sgi.com X-ASG-Orig-Subj: xfssyncd and disk spin down Subject: xfssyncd and disk spin down Message-ID: <20101223165532.GA23813@peter.simplex.ro> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="n8g4imXOkfNTN/H1" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-AntiVirus: checked by AntiVir MailGate (version: 2.1.3-2; AVE: 7.9.4.128; VDF: 7.11.0.151; host: passage.avira.com) X-Barracuda-Connect: passage.avira.com[89.238.222.20] X-Barracuda-Start-Time: 1293123433 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50280 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --n8g4imXOkfNTN/H1 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hello, I have a problem with a hard drive that never managed to spin down. this dr= ive is a storage space, not a system disk, the only thing that generated wr= ites is the nfs server that exports its contents. it has only one large xfs= partition on it. upon closer inspection it turns out that after the first Write action to th= at partition, an xfssyncd process continues to write to that partition each= 36 seconds and it doesn't stop doing that, even if there are no more Write= s from the exterior. this keeps the drive busy with varying consequences. m= ore about that later. I found that the only easy way to stop the xfssyncd process poking the driv= e is to run a `mount -o remount /mnt/space`. this will silence any internal= xfs process to acessing the drive, thus allowing it to spin down and only = be woken up by a NFS access. here are some simple steps to replicate the problem: # echo 3 > /proc/sys/vm/drop_caches # free cached fs entities=20 # ( blktrace -d /dev/sdb -o - | blkparse -i - ) & # mount -o remount /mnt/space # find /mnt/space/ -type f > /dev/null # generate some non-cached Read req= uests # # absolutely no writes have been performed to the drive,=20 # # it could spin down now if enough time would pass # touch /mnt/space/foo # # process 1352 will start writing to the drive at a 35-36s interval, # # even if there has been no other write request. 8,16 1 36591 6306.873151576 1352 A WBS 976985862 + 2 <- (8,17) 97= 6985799 8,16 1 36592 6306.873152998 1352 Q WBS 976985862 + 2 [xfssyncd/sd= b1] [..] 8,16 1 36600 6342.875151286 1352 A WBS 976985864 + 2 <- (8,17) 97= 6985801 8,16 1 36601 6342.875152938 1352 Q WBS 976985864 + 2 [xfssyncd/sd= b1] [..] 8,16 1 36609 6378.877225211 1352 A WBS 976985866 + 2 <- (8,17) 97= 6985803 8,16 1 36610 6378.877226935 1352 Q WBS 976985866 + 2 [xfssyncd/sd= b1] there was no file at or near the 976985799 inode (I presume that's an inode= ?) I found that the only way to stop it is to remount the partition. I also tr= ied sync(1), but to no avail.=20 so is there an XFS option somewhere that would make the filesystem be more = forgiving with the hardware beneath it? without loosing the journal of cour= se. I'm using a vanilla 2.6.36.2 kernel patched with grsecurity, default mkfs.x= fs options, rw,nosuid,nodev,noexec,noatime,attr2,noquota mount options, and= xfs_info looks like this: meta-data=3D/dev/sdb1 isize=3D256 agcount=3D4, agsize=3D610= 47500 blks =3D sectsz=3D512 attr=3D2 data =3D bsize=3D4096 blocks=3D244190000, imaxp= ct=3D25 =3D sunit=3D0 swidth=3D0 blks naming =3Dversion 2 bsize=3D4096 ascii-ci=3D0 log =3Dinternal bsize=3D4096 blocks=3D32768, version= =3D2 =3D sectsz=3D512 sunit=3D0 blks, lazy-coun= t=3D0 realtime =3Dnone extsz=3D4096 blocks=3D0, rtextents=3D0 a probably related issue is with modern Western Digital/Hitachi hard drives= that use a Ramp load/unload technology that automatically parks the heads = at stupidly small inactivity intervals (some small as 8 seconds), so look w= hat happens when using such a drive and xfs: # smartctl -a /dev/sda [..] Device Model: WDC WD20EARS-00MVWB0 Serial Number: WD-WCAZA0101731 Firmware Version: 50.0AB50 [..] 4 Start_Stop_Count 0x0032 100 100 000 Old_age Always = - 17 [..] 9 Power_On_Hours 0x0032 096 096 000 Old_age Always = - 3351 [..] 193 Load_Cycle_Count 0x0032 066 066 000 Old_age Always = - 403405 this hard drive has exceeded it's 300k load/unload maximum from the specs i= n only 140 days, which means it was woken up every 30s or so. not willingly. cheers, peter --n8g4imXOkfNTN/H1 Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.16 (GNU/Linux) iEYEABECAAYFAk0TfwQACgkQixMPpwVd7zHwQgCgg50zqHPI744lJ6fi0/LZVNaO m8cAmgImSrmW9RrM41CH38U4Y2I21CwR =Sv/q -----END PGP SIGNATURE----- --n8g4imXOkfNTN/H1-- From j.fikar@gmail.com Thu Dec 23 11:16:24 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,FREEMAIL_FROM, J_CHICKENPOX_27,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBNHGOcP208777 for ; Thu, 23 Dec 2010 11:16:24 -0600 X-ASG-Debug-ID: 1293124702-76ef00e10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-bw0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 36F5921C147 for ; Thu, 23 Dec 2010 09:18:22 -0800 (PST) Received: from mail-bw0-f53.google.com (mail-bw0-f53.google.com [209.85.214.53]) by cuda.sgi.com with ESMTP id FmQ3gYy3G1scnkzr for ; Thu, 23 Dec 2010 09:18:22 -0800 (PST) Received: by bwg12 with SMTP id 12so751221bwg.26 for ; Thu, 23 Dec 2010 09:18:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:reply-to :user-agent:mime-version:to:cc:subject:references:in-reply-to :x-enigmail-version:content-type; bh=zmgWpXjzSQ0MqO6HEQ5PUF4MlWqAuYr/GOAaHDrIo+E=; b=gzcuF7dv4+qicpGdD/OL61pin5apJGA1LXnLnZyq3QvAt49I77i1oprS+sYOVYsq6K gWMHHQ386WkllhQ9+prtxKkFd0nS8s4BuetTjSQSI7IllG9Eq8Z2pzBGdI0HvsXnb0eQ dWEkYqtv7Z1/PFUsnwbNipD1tzjnJ7laMuhWM= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:reply-to:user-agent:mime-version:to:cc:subject :references:in-reply-to:x-enigmail-version:content-type; b=KfVDjRpEvO+NbrFyigfeQqt3WsXHVIp8zyx8iRczWoK239XlYdro0Y63AxZnZ77/93 nf8HGB/90YXOu/o3ag11dVuJn14f7/9sULJYAXZ4L+Zi1PFHlKxXnpXibbMOVtTYdju5 aY74FXGdUrWQ1LeEr7ebAYrjtqFifeXVeH2WY= Received: by 10.204.76.145 with SMTP id c17mr7234275bkk.52.1293124701273; Thu, 23 Dec 2010 09:18:21 -0800 (PST) Received: from [192.168.1.202] (217-162-63-218.dclient.hispeed.ch [217.162.63.218]) by mx.google.com with ESMTPS id j11sm5652538bka.0.2010.12.23.09.18.19 (version=SSLv3 cipher=RC4-MD5); Thu, 23 Dec 2010 09:18:20 -0800 (PST) Message-ID: <4D138457.8020008@gmail.com> Date: Thu, 23 Dec 2010 18:18:15 +0100 From: Honza Fikar Reply-To: j.fikar@gmail.com User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101222 Lightning/1.0b3pre Thunderbird/3.1.7 MIME-Version: 1.0 To: Eric Sandeen CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: no rw xfs file systems in mtab: /proc/mounts Subject: Re: no rw xfs file systems in mtab: /proc/mounts References: <4D13648B.8000105@sandeen.net> In-Reply-To: <4D13648B.8000105@sandeen.net> X-Enigmail-Version: 1.1.2 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enigAB09642F972D4CDE6BA7CCED" X-Barracuda-Connect: mail-bw0-f53.google.com[209.85.214.53] X-Barracuda-Start-Time: 1293124703 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50280 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enigAB09642F972D4CDE6BA7CCED Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable > hm that's a little confusing, what it means is it looked > in /proc/mounts and did not find anything, or so it thought. I agree that it's confusing, while there are xfs mounted rw in /proc/moun= ts > As a result of: >=20 > 89e4b5bd5615edc584a5111c86f12b4f89f8dd7d xfs_fsr: use /proc/mounts if a= vailable I "quickly and dirty" tried to use /etc/mtab instead, but the result is the same. Even tried some old version (3.0.3), which uses mtab and it's the same. > What does your /proc/mounts show? it shows the lines included in the original e-mail, just here it is wrapped, i.e. for the not working case: >> ... >> /dev/mapper/root / xfs >> rw,noatime,attr2,inode64,logbufs=3D8,logbsize=3D256k,noquota 0 0 >> ... and for working case: >> ... >> /dev/root / xfs >> rw,noatime,attr2,delaylog,inode64,logbufs=3D8,logbsize=3D256k,noquota = 0 0 >> /dev/mapper/encrypted /home xfs >> rw,noatime,attr2,delaylog,inode64,logbufs=3D8,logbsize=3D256k,sunit=3D= 512,swidth=3D1536,noquota >> 0 0 >> ... Honza --------------enigAB09642F972D4CDE6BA7CCED Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.16 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iEYEARECAAYFAk0ThFoACgkQp4S3GwoQQ3tFAwCeNk5Z7wYGto9EDUIV+bKtOrvP 2ZkAoMNbpAFK4Lg9XlFyC88t+6jpAORJ =xqkA -----END PGP SIGNATURE----- --------------enigAB09642F972D4CDE6BA7CCED-- From eflorac@intellique.com Thu Dec 23 11:33:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBNHXj9V211749 for ; Thu, 23 Dec 2010 11:33:45 -0600 X-ASG-Debug-ID: 1293125738-76f001cd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2DCBC21C20E for ; Thu, 23 Dec 2010 09:35:42 -0800 (PST) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id 9qkFuW82ULyZEujP for ; Thu, 23 Dec 2010 09:35:42 -0800 (PST) Received: from galadriel.home (unknown [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP id 86395A62E2; Thu, 23 Dec 2010 18:35:34 +0100 (CET) Date: Thu, 23 Dec 2010 18:35:31 +0100 From: Emmanuel Florac To: laurent+xfs@u-picardie.fr Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: able to mount a fs, unable to repair it Subject: Re: able to mount a fs, unable to repair it Message-ID: <20101223183531.19464601@galadriel.home> In-Reply-To: <87r5d9uuez.fsf@ezri.u-picardie.fr> References: <87r5d9uuez.fsf@ezri.u-picardie.fr> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.20.1; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1293125744 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50282 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Thu, 23 Dec 2010 02:53:08 +0100 vous =E9criviez: > For a reason all my xfs FS got corrupted at the same time. > My setup is: xen host using lvm on top of soft raid6 on top of jbod > 3ware connected sata disks. > Both the host and the VM fs got corrupted. RAID-6 is extremely stable on the 3Ware, while software RAID-6 is dubbed experimental in the kernel. Software RAID can provide seducely high performance when running benchmarks, but IMO it doesn't fly when you need your CPU to do some other jobs, like running NFS daemons or even worse, VMs. Under high CPU loads concurrently coming from the software RAID and virtualisation stack, so many things may go wrong... My advice : software RAID stinks under high CPU load/ high IO. Use hardware RAID whenever possible because it provides more predictable performance and remove many weird software interactions from the picture. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From jpiszcz@lucidpixels.com Thu Dec 23 12:04:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBNI4CTi216845 for ; Thu, 23 Dec 2010 12:04:13 -0600 X-ASG-Debug-ID: 1293127570-185a01280000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lucidpixels.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 07DDB21C326 for ; Thu, 23 Dec 2010 10:06:10 -0800 (PST) Received: from lucidpixels.com (lucidpixels.com [75.144.35.66]) by cuda.sgi.com with ESMTP id mTrdWkeF9YfLAEMs for ; Thu, 23 Dec 2010 10:06:10 -0800 (PST) Received: by lucidpixels.com (Postfix, from userid 1001) id 53757120558; Thu, 23 Dec 2010 13:06:10 -0500 (EST) Date: Thu, 23 Dec 2010 13:06:10 -0500 (EST) From: Justin Piszcz To: Dave Chinner cc: Eric Sandeen , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? In-Reply-To: Message-ID: References: <20101222175611.1c7d5190@harpe.intellique.com> <4D124B71.9030401@sandeen.net> <20101223012655.2681c596@galadriel.home> <20101223005630.GJ4907@dastard> User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-Barracuda-Connect: lucidpixels.com[75.144.35.66] X-Barracuda-Start-Time: 1293127571 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50284 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, 23 Dec 2010, Justin Piszcz wrote: Hi, How come parted using (optimal at 1mb alignment is slower than no partition? In addition, sunit and swidth set properly as mentioned earlier appears to be _slower_ than defaults with no partitions. http://home.comcast.net/~jpiszcz/20101223/final.html Justin. From info@haakonsnyc.com Thu Dec 23 12:09:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.1 required=5.0 tests=BAYES_50,T_URIBL_BLACK_OVERLAP, URIBL_BLACK,URIBL_WS_SURBL autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBNI9D0H217800 for ; Thu, 23 Dec 2010 12:09:13 -0600 X-ASG-Debug-ID: 1293127868-76f003590000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from 122893-WEB1.allengoelhost.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EF94821C352 for ; Thu, 23 Dec 2010 10:11:08 -0800 (PST) Received: from 122893-WEB1.allengoelhost.com (122893-web1.allengoelhost.com [74.205.83.130]) by cuda.sgi.com with ESMTP id PHEBiolGF0ACab1d for ; Thu, 23 Dec 2010 10:11:08 -0800 (PST) Received: from mail pickup service by 122893-WEB1.allengoelhost.com with Microsoft SMTPSVC; Thu, 23 Dec 2010 13:11:15 -0500 thread-index: AcuizMnM6Fme8IESSyS1eKmeIT8Bqg== Thread-Topic: Haakon's Hall From: To: X-ASG-Orig-Subj: Haakon's Hall Subject: Haakon's Hall Date: Thu, 23 Dec 2010 13:11:15 -0500 Message-ID: <071301cba2cc$c9cc2b20$70ea810a@122893WEB1> MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 7bit X-Mailer: Microsoft CDO for Windows 2000 Content-Class: urn:content-classes:message Importance: normal Priority: normal X-MimeOLE: Produced By Microsoft MimeOLE V6.00.3790.3168 X-OriginalArrivalTime: 23 Dec 2010 18:11:15.0485 (UTC) FILETIME=[C9EB24D0:01CBA2CC] X-Barracuda-Connect: 122893-web1.allengoelhost.com[74.205.83.130] X-Barracuda-Start-Time: 1293127868 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4407 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50284 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hello - This isn't something you're going to hear about from any of the usual gurus. . . This guy is about 11 steps ahead of them. We're talking about 978 dollars per day. . .from a system you ONLY set up ONCE. EVER! You've GOT to see this. http://www.biz2wealth.co.cc/aff.php?e=linux-xfs@oss.sgi.com Lea Smith USA P.S. When you realize how hard you've been working to drive FAR LESS traffic than Mike and Bill your blood just might boil. http://www.biz2wealth.co.cc/aff.php?e=linux-xfs@oss.sgi.com To unsubscribe please send and email to leasmithusa@gmail.com ---------------------------------------- This message sent to you from 'jhonkarlo@gmail.com', courtesy of Haakon's Hall. Visit us at www.haakonsnyc.com From eflorac@intellique.com Thu Dec 23 12:53:57 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBNIrvLZ225422 for ; Thu, 23 Dec 2010 12:53:57 -0600 X-ASG-Debug-ID: 1293130553-1cb1006a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 426E31CF505A for ; Thu, 23 Dec 2010 10:55:54 -0800 (PST) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id mfHU6a4AtR4dfky6 for ; Thu, 23 Dec 2010 10:55:54 -0800 (PST) Received: from galadriel.home (unknown [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP id 6AB5CA6281; Thu, 23 Dec 2010 19:55:49 +0100 (CET) Date: Thu, 23 Dec 2010 19:55:44 +0100 From: Emmanuel Florac To: Justin Piszcz Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? Message-ID: <20101223195544.53d45f0b@galadriel.home> In-Reply-To: References: <20101222175611.1c7d5190@harpe.intellique.com> <4D124B71.9030401@sandeen.net> <20101223012655.2681c596@galadriel.home> <20101223005630.GJ4907@dastard> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.20.1; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1293130556 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50288 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Thu, 23 Dec 2010 13:06:10 -0500 (EST) vous =E9criviez: > http://home.comcast.net/~jpiszcz/20101223/final.html >=20 Something's wrong with the file create/stat/delete tests. Did you mount with "nobarrier"?=20 Which drives, controller firmware, raid level, stripe width?=20 BTW don't run only one test, it's meaningless. I always run at least 8 cycles (and up to 30 or 40 cycles) and then calculate the average and standard deviation, because one test among a cycle may vary wildly for some reason. You don't need the "char" tests, that doesn't correspond to any real-life usage pattern. Better run bonnie with the -f option, and -x with some large enough value. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From jpiszcz@lucidpixels.com Thu Dec 23 13:05:16 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBNJ5FDS227823 for ; Thu, 23 Dec 2010 13:05:16 -0600 X-ASG-Debug-ID: 1293131234-7e8c02c20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lucidpixels.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 99C451CF50F7 for ; Thu, 23 Dec 2010 11:07:14 -0800 (PST) Received: from lucidpixels.com (lucidpixels.com [75.144.35.66]) by cuda.sgi.com with ESMTP id 3RfRCnXqNg1bRrqm for ; Thu, 23 Dec 2010 11:07:14 -0800 (PST) Received: by lucidpixels.com (Postfix, from userid 1001) id B996F120558; Thu, 23 Dec 2010 14:07:13 -0500 (EST) Date: Thu, 23 Dec 2010 14:07:13 -0500 (EST) From: Justin Piszcz To: Emmanuel Florac cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? In-Reply-To: <20101223195544.53d45f0b@galadriel.home> Message-ID: References: <20101222175611.1c7d5190@harpe.intellique.com> <4D124B71.9030401@sandeen.net> <20101223012655.2681c596@galadriel.home> <20101223005630.GJ4907@dastard> <20101223195544.53d45f0b@galadriel.home> User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="655872-897510591-1293131233=:5924" X-Barracuda-Connect: lucidpixels.com[75.144.35.66] X-Barracuda-Start-Time: 1293131234 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50288 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. --655872-897510591-1293131233=:5924 Content-Type: TEXT/PLAIN; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: QUOTED-PRINTABLE On Thu, 23 Dec 2010, Emmanuel Florac wrote: > Le Thu, 23 Dec 2010 13:06:10 -0500 (EST) vous =E9criviez: > >> http://home.comcast.net/~jpiszcz/20101223/final.html >> > > Something's wrong with the file create/stat/delete tests. Did you mount > with "nobarrier"? No, default mount options.. Also I just changed it will update the page in a bit, the raid was on balance mode, with performance, the raid-rewrite went to ~420-430MiB/s, muc= h faster. > Which drives, controller firmware, raid level, stripe width? Hitachi 7K3000 7200RPM 3TB Drives Latest firmware, 10.2 I think for the 9750-24ie Raid Level =3D 6 Stripe width =3D 256k (default) > > BTW don't run only one test, it's meaningless. I always run at least 8 > cycles (and up to 30 or 40 cycles) and then calculate the average and > standard deviation, because one test among a cycle may vary wildly for > some reason. You don't need the "char" tests, that doesn't correspond > to any real-life usage pattern. Better run bonnie with the -f option, > and -x with some large enough value. I ran 3 tests and took the average of the 3 runs per each unit test.=20 I use this test because I have been using it for 3-4+ years so I can compar= e=20 apples to apples. If its +++ or blank in the HTML that means it ran too fast for it to measur= e I believe. Main wonder I have is why when the partition is aligned to 1MiB, which is the default in parted 2.2+ I believe, is it slower than with no partitions? I will try again with mode=3Dperformance on the RAID controller.. > > --=20 > ------------------------------------------------------------------------ > Emmanuel Florac | Direction technique > | Intellique > |=09 > | +33 1 78 94 84 02 > ------------------------------------------------------------------------ > --655872-897510591-1293131233=:5924-- From stan@hardwarefreak.com Thu Dec 23 13:27:17 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBNJRGEq231359 for ; Thu, 23 Dec 2010 13:27:17 -0600 X-ASG-Debug-ID: 1293132554-423d01d20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id AC846147E486 for ; Thu, 23 Dec 2010 11:29:14 -0800 (PST) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id buFa7pOr05MtX5CE for ; Thu, 23 Dec 2010 11:29:14 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 1331E6C0B8 for ; Thu, 23 Dec 2010 13:29:14 -0600 (CST) Message-ID: <4D13A30A.3090600@hardwarefreak.com> Date: Thu, 23 Dec 2010 13:29:14 -0600 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfssyncd and disk spin down Subject: Re: xfssyncd and disk spin down References: <20101223165532.GA23813@peter.simplex.ro> In-Reply-To: <20101223165532.GA23813@peter.simplex.ro> 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: 1293132555 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0649 1.0000 -1.6070 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.01 X-Barracuda-Spam-Status: No, SCORE=-1.01 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50289 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Petre Rodan put forth on 12/23/2010 10:55 AM: > this hard drive has exceeded it's 300k load/unload maximum from the specs in only 140 days, which means it was woken up every 30s or so. not willingly. Contact WD and request a warranty replacement for the drive due to exceeding the spec'd cycle max in less than 6 months. They may not honor your request. Whether they do or not, I'd replace the drive as the mechanism obviously has too much wear on it already, and within one year of use will have well over double the spec'd cycles. If you replace it with another 20EARS, replace the firmware immediately as mentioned below to decrease the load/unload rate. (It would be nice if they offered the ability to disable the sleep mode totally, but then it wouldn't be "green" pfft). Modern drives consume so little power compared to CPUs and GPUs I can't understand the big power save quest the HD industry has embarked upon, especially with potential consequences to drive life you and others are seeing. I can understand the need WRT huge drive count enterprise near line disk arrays, but not the average desktop or server. And the EARS series drives are anything but enterprise caliber. Note the power specs for the WD20EARS: Current Requirements 12 VDC Read/Write 296 mA Idle 243 mA Standby 3 mA Sleep 3 mA 5 VDC Read/Write 503 mA Idle 172 mA Standby 160 mA Sleep 160 mA Power Dissipation Read/Write 6.00 Watts Idle 3.70 Watts Standby 0.80 Watts Sleep 0.80 Watts 6 watts maximum draw for read/write and 3.7 watts idle. Sure, the sleep mode consumes 10x less power, but when you're already at less than 4 watts idle it doesn't matter except in huge disk arrays. For comparison, your average dual core cpu today consumes an average of 20-50 watts or more. Power supplies burn more wasted juice than anything, so get a 90% efficiency PSU and disable all the power save features of your disk drives to prolong their lifespan. To replace the 20EARS firmware: From: http://community.wdc.com/t5/Desktop/Green-Caviar-High-Load-Cycle-Cout-after-short-operation-time/td-p/15731/page/2 Re: Green Caviar: High Load Cycle Count after short operation time 04-08-2010 04:03 PM Sorry, but our agent didn't know that this policy was just changed. Current WDIDLE3 works with the RE and GP drives listed below. RE Drives - WD1000FYPS-01ZKB0, WD7500AYPS-01ZKB0, WD7501AYPS-01ZKB0 GP Drives - WD20EADS, WD20EARS, WD15EADS, WD15EARS, WD10EADS, WD10EARS, WD8000AARS, WD7500AADS, WD7500AARS, WD6400AADS, WD6400AARS, WD5000AADS, WD5000AARS WDIDLE3 http://support.wdc.com/product/download.asp?groupid=609&sid=113&lang=en -- Stan From jpiszcz@lucidpixels.com Thu Dec 23 13:27:27 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBNJRRL5231393 for ; Thu, 23 Dec 2010 13:27:27 -0600 X-ASG-Debug-ID: 1293132566-236801b60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lucidpixels.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 95F251CF5273 for ; Thu, 23 Dec 2010 11:29:26 -0800 (PST) Received: from lucidpixels.com (lucidpixels.com [75.144.35.66]) by cuda.sgi.com with ESMTP id Eb9gdCCkrQOL0pym for ; Thu, 23 Dec 2010 11:29:26 -0800 (PST) Received: by lucidpixels.com (Postfix, from userid 1001) id 2776E120558; Thu, 23 Dec 2010 14:29:26 -0500 (EST) Date: Thu, 23 Dec 2010 14:29:26 -0500 (EST) From: Justin Piszcz To: Emmanuel Florac cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? In-Reply-To: <20101223195544.53d45f0b@galadriel.home> Message-ID: References: <20101222175611.1c7d5190@harpe.intellique.com> <4D124B71.9030401@sandeen.net> <20101223012655.2681c596@galadriel.home> <20101223005630.GJ4907@dastard> <20101223195544.53d45f0b@galadriel.home> User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="655872-795982373-1293132566=:6569" X-Barracuda-Connect: lucidpixels.com[75.144.35.66] X-Barracuda-Start-Time: 1293132566 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50290 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. --655872-795982373-1293132566=:6569 Content-Type: TEXT/PLAIN; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: QUOTED-PRINTABLE On Thu, 23 Dec 2010, Emmanuel Florac wrote: > Le Thu, 23 Dec 2010 13:06:10 -0500 (EST) vous =E9criviez: > >> http://home.comcast.net/~jpiszcz/20101223/final.html >> Please check the updated page: http://home.comcast.net/~jpiszcz/20101223/final.html Using a partition shows a slight degredation in the re-write speed but an increase in performance for sequential output and input with the mode set to perform. Looks like this is what I will be using as it is the faste= st speeds overall except for the rewrite. Thanks! Justin. --655872-795982373-1293132566=:6569-- From laurent+xfs@u-picardie.fr Thu Dec 23 13:32:44 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBNJWh8D232460 for ; Thu, 23 Dec 2010 13:32:44 -0600 X-ASG-Debug-ID: 1293132882-42e0002c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx1.u-picardie.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C56401CF52A8 for ; Thu, 23 Dec 2010 11:34:42 -0800 (PST) Received: from mx1.u-picardie.fr (mx1.u-picardie.fr [193.49.184.7]) by cuda.sgi.com with ESMTP id NVpati1CUS1j2tsz for ; Thu, 23 Dec 2010 11:34:42 -0800 (PST) Received: from mailx.u-picardie.fr (oban.u-picardie.fr [193.49.184.8]) by mx1.u-picardie.fr (Postfix) with ESMTP id D8238782BB; Thu, 23 Dec 2010 20:34:41 +0100 (CET) Received: from passoire.u-picardie.fr (passoire.u-picardie.fr [193.49.184.121]) by mailx.u-picardie.fr (Postfix) with ESMTP id CE15558124; Thu, 23 Dec 2010 20:34:41 +0100 (CET) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: Debian amavisd-new at u-picardie.fr Received: from mailx.u-picardie.fr ([193.49.184.8]) by passoire.u-picardie.fr (passoire.u-picardie.fr [193.49.184.121]) (amavisd-new, port 10024) with LMTP id mzwm7Ks0Pw9U; Thu, 23 Dec 2010 20:34:41 +0100 (CET) Received: from ezri.u-picardie.fr (ezri.u-picardie.fr [193.49.184.104]) by mailx.u-picardie.fr (Postfix) with ESMTP id 81F6B58123; Thu, 23 Dec 2010 20:34:41 +0100 (CET) Received: by ezri.u-picardie.fr (Postfix, from userid 1000) id 7C415606CA3; Thu, 23 Dec 2010 20:34:41 +0100 (CET) From: laurent+xfs@u-picardie.fr To: Emmanuel Florac Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: able to mount a fs, unable to repair it Subject: Re: able to mount a fs, unable to repair it References: <87r5d9uuez.fsf@ezri.u-picardie.fr> <20101223183531.19464601@galadriel.home> Date: Thu, 23 Dec 2010 20:34:41 +0100 In-Reply-To: <20101223183531.19464601@galadriel.home> (Emmanuel Florac's message of "Thu, 23 Dec 2010 18:35:31 +0100") Message-ID: <87zkrws2pa.fsf@ezri.u-picardie.fr> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mx1.u-picardie.fr[193.49.184.7] X-Barracuda-Start-Time: 1293132882 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50290 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name X-Virus-Status: Clean Emmanuel Florac writes: Bonsoir Emmanuel, > Le Thu, 23 Dec 2010 02:53:08 +0100 vous =E9criviez: > >> For a reason all my xfs FS got corrupted at the same time. >> My setup is: xen host using lvm on top of soft raid6 on top of jbod >> 3ware connected sata disks. >> Both the host and the VM fs got corrupted. > > RAID-6 is extremely stable on the 3Ware, while software RAID-6 is > dubbed experimental in the kernel. Software RAID can provide seducely > high performance when running benchmarks, but IMO it doesn't fly when > you need your CPU to do some other jobs, like running NFS daemons or > even worse, VMs. Under high CPU loads concurrently coming from the > software RAID and virtualisation stack, so many things may go > wrong... I can't agree more, I'm using both nfs AND VMs :) It is very slow and very cpu consuming. I'm moving away from xen to lxc on this home server, pretty sure it will help. > My advice : software RAID stinks under high CPU load/ high IO. Use > hardware RAID whenever possible because it provides more predictable > performance and remove many weird software interactions from the > picture. The 3w9550sx doesn't raid6, but I admit I've been thinking of using its raid5 instead of the slow soft raid6. Thanks for your advices :) --=20 Laurent From stan@hardwarefreak.com Thu Dec 23 13:52:17 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBNJqGCm235906 for ; Thu, 23 Dec 2010 13:52:17 -0600 X-ASG-Debug-ID: 1293134054-425e02c50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1CD48147DFF4 for ; Thu, 23 Dec 2010 11:54:14 -0800 (PST) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id bv5Je8ZSyxlag2UX for ; Thu, 23 Dec 2010 11:54:14 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 491C26C0B8 for ; Thu, 23 Dec 2010 13:54:14 -0600 (CST) Message-ID: <4D13A8E6.7090606@hardwarefreak.com> Date: Thu, 23 Dec 2010 13:54:14 -0600 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? References: <20101222175611.1c7d5190@harpe.intellique.com> <4D124B71.9030401@sandeen.net> <20101223012655.2681c596@galadriel.home> <20101223005630.GJ4907@dastard> <20101223195544.53d45f0b@galadriel.home> 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: 1293134055 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0208 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50291 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Justin Piszcz put forth on 12/23/2010 1:07 PM: > Main wonder I have is why when the partition is aligned to 1MiB, which is > the default in parted 2.2+ I believe, is it slower than with no partitions? Best guess? Those 3TB Hitachi drives use 512 byte translated native 4KB sectors. The 9750-24 ie card doesn't know how to properly align partitions on such drives, and/or you're using something other than fdisk or parted to create your partitions. Currently these are the only two partitioners that can align partitions properly on 512 byte translated/native 4KB sector drives. Thus you're taking a performance hit, same as with the WD "Advanced Format" drives which have 512 byte translated/native 4KB sectors. If you want maximum performance with least configuration headaches, avoid 512B/4KB sector hybrid drives. If you _need_ maximum drive capacity, live with the warts, or jump through hoops to get the partitions aligned, or, live without partitions if you can. -- Stan From stan@hardwarefreak.com Thu Dec 23 13:56:21 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBNJuLfw236704 for ; Thu, 23 Dec 2010 13:56:21 -0600 X-ASG-Debug-ID: 1293134299-42e001150000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3D15C1CF54DC for ; Thu, 23 Dec 2010 11:58:19 -0800 (PST) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id BFaBViFgJrC5ysQG for ; Thu, 23 Dec 2010 11:58:19 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 906C36C0B8 for ; Thu, 23 Dec 2010 13:58:19 -0600 (CST) Message-ID: <4D13A9DB.1010700@hardwarefreak.com> Date: Thu, 23 Dec 2010 13:58:19 -0600 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? References: <20101222175611.1c7d5190@harpe.intellique.com> <4D124B71.9030401@sandeen.net> <20101223012655.2681c596@galadriel.home> <20101223005630.GJ4907@dastard> <20101223195544.53d45f0b@galadriel.home> 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: 1293134300 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0002 1.0000 -2.0200 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50292 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Justin Piszcz put forth on 12/23/2010 1:29 PM: > Using a partition shows a slight degredation in the re-write speed but > an increase in performance for sequential output and input with the mode > set to perform. Looks like this is what I will be using as it is the > fastest > speeds overall except for the rewrite. As Dave mentioned earlier, performance may degrade significantly over time as the FS grows and ages, compared to running benchies against an empty filesystem today, especially if your mkfs.xfs parms were off the mark when creating. -- Stan From sandeen@sandeen.net Thu Dec 23 15:10:58 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBNLAwLA250142 for ; Thu, 23 Dec 2010 15:10:58 -0600 X-ASG-Debug-ID: 1293138776-0b5800ce0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 453381CF5AA7 for ; Thu, 23 Dec 2010 13:12:56 -0800 (PST) Received: from mail.sandeen.net (64-131-28-21.usfamily.net [64.131.28.21]) by cuda.sgi.com with ESMTP id 2rMHkOA0kQuli0WE for ; Thu, 23 Dec 2010 13:12:56 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id ED15D48406EC; Thu, 23 Dec 2010 15:12:55 -0600 (CST) Message-ID: <4D13BB57.80309@sandeen.net> Date: Thu, 23 Dec 2010 15:12:55 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: Justin Piszcz CC: Dave Chinner , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? References: <20101222175611.1c7d5190@harpe.intellique.com> <4D124B71.9030401@sandeen.net> <20101223012655.2681c596@galadriel.home> <20101223005630.GJ4907@dastard> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-28-21.usfamily.net[64.131.28.21] X-Barracuda-Start-Time: 1293138777 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50296 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 12/23/10 12:06 PM, Justin Piszcz wrote: > > On Thu, 23 Dec 2010, Justin Piszcz wrote: > > > Hi, > > How come parted using (optimal at 1mb alignment is slower than no > partition? because parted got it wrong, sounds like. > In addition, sunit and swidth set properly as mentioned > earlier appears to be _slower_ than defaults with no partitions. stripe unit over an incorrectly aligned partition won't help and I suppose could make it worse. align your partitions, using sector units, to a stripe width unit. Set the stripe width properly on the fs on top of that. -Eric > > http://home.comcast.net/~jpiszcz/20101223/final.html > > Justin. > From petre.rodan@simplex.ro Thu Dec 23 15:16:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBNLGVZI250834 for ; Thu, 23 Dec 2010 15:16:32 -0600 X-ASG-Debug-ID: 1293139109-0970025e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from passage.avira.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 56A6E147E9AF for ; Thu, 23 Dec 2010 13:18:29 -0800 (PST) Received: from passage.avira.com (passage.avira.com [89.238.222.20]) by cuda.sgi.com with ESMTP id R6YjUHWHRaC0jQ05 for ; Thu, 23 Dec 2010 13:18:29 -0800 (PST) Received: by passage.avira.com (Postfix/AVIRA, from userid 26) id 97A7F1249FA; Thu, 23 Dec 2010 23:18:28 +0200 (EET) Received: from localhost (localhost [127.0.0.1]) by passage.avira.com (Postfix/AVIRA) with ESMTP id 2740C1249F9 for ; Thu, 23 Dec 2010 23:18:28 +0200 (EET) Received: from passage.avira.com (localhost [127.0.0.1]) by localhost (AvMailGate-2.1.3-2) id 11214-A3JL1L; Thu, 23 Dec 2010 23:18:28 +0200 (EET) Received: from naliboat.bu.avira.com (dasapass.avira.com [89.238.222.18]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "mail.bu.avira.com", Issuer "Avira Intermediate Certificate Authority 2010-2020" (not verified)) by passage.avira.com (Postfix/AVIRA) with ESMTPS id 18B1B1249F9 for ; Thu, 23 Dec 2010 23:18:28 +0200 (EET) Received: (qmail 15431 invoked from network); 23 Dec 2010 21:18:27 -0000 Received: from unknown (HELO peter.simplex.ro) (prodan@10.7.0.16) by naliboat.bu.avira.com with ESMTPA; 23 Dec 2010 21:18:27 -0000 Date: Thu, 23 Dec 2010 23:16:50 +0200 From: Petre Rodan To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfssyncd and disk spin down Subject: Re: xfssyncd and disk spin down Message-ID: <20101223211650.GA19694@peter.simplex.ro> References: <20101223165532.GA23813@peter.simplex.ro> <4D13A30A.3090600@hardwarefreak.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4D13A30A.3090600@hardwarefreak.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-AntiVirus: checked by AntiVir MailGate (version: 2.1.3-2; AVE: 7.9.4.128; VDF: 7.11.0.153; host: passage.avira.com) X-Barracuda-Connect: passage.avira.com[89.238.222.20] X-Barracuda-Start-Time: 1293139110 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0432 1.0000 -1.7429 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.74 X-Barracuda-Spam-Status: No, SCORE=-1.74 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50297 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hello, On Thu, Dec 23, 2010 at 01:29:14PM -0600, Stan Hoeppner wrote: > Petre Rodan put forth on 12/23/2010 10:55 AM: > > > this hard drive has exceeded it's 300k load/unload maximum from the specs in only 140 days, which means it was woken up every 30s or so. not willingly. > > Contact WD and request a warranty replacement for the drive due to > exceeding the spec'd cycle max in less than 6 months. They may not > honor your request. Whether they do or not, I'd replace the drive as > the mechanism obviously has too much wear on it already, and within one > year of use will have well over double the spec'd cycles. If you > replace it with another 20EARS, replace the firmware immediately as > mentioned below to decrease the load/unload rate. (It would be nice if > they offered the ability to disable the sleep mode totally, but then it > wouldn't be "green" pfft). thanks for your input. I did run wdidle3 on that drive two days ago stopping the nonsense. but my original mail had a different target really. I have to recognize that I don't know much about the inner-workings of a filesystem, but I find it odd that once there is no input from the outside, a process keeps writing to the drive indefinitely. in my very narrow thinking the fact that these writes dissapear after a remount would prove their redundance. to wrap it up, I see no logic to the above and this is why I ask the list to tell me if this is a. something that can easily be fixed via an option I failed to find b. a critical part of xfs's internals that cannot be 'disabled' (with a short explanation) c. simply a bug with the little side-story with the WD 20EARS i was just portraying where this default behaviour can get to. I don't usually read marketing material, but WD acknowledges that their green drives are wrecked in Linux and they simply encourage customers to change their OS. I just have to ask why have we got to get to this point. the drive I was trying to get into standby in the first half of my mail is a different one, an enterprise ST31000340NS placed on an otherwise low power ProLiant MicroServer. Having 8W*12h*30 = 2880 Wh less to pay per hdd per month would be easily achievable if the standby mode would be reached when possible. cheers, peter From eflorac@intellique.com Thu Dec 23 15:43:02 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBNLh16j255800 for ; Thu, 23 Dec 2010 15:43:02 -0600 X-ASG-Debug-ID: 1293140697-44c800120000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E12AC147E73F for ; Thu, 23 Dec 2010 13:44:58 -0800 (PST) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id RxnWSPTniNGpidmG for ; Thu, 23 Dec 2010 13:44:58 -0800 (PST) Received: from galadriel.home (unknown [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP id 1F0B2A6277; Thu, 23 Dec 2010 22:44:52 +0100 (CET) Date: Thu, 23 Dec 2010 22:44:45 +0100 From: Emmanuel Florac To: laurent+xfs@u-picardie.fr Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: able to mount a fs, unable to repair it Subject: Re: able to mount a fs, unable to repair it Message-ID: <20101223224445.12ce6dde@galadriel.home> In-Reply-To: <87zkrws2pa.fsf@ezri.u-picardie.fr> References: <87r5d9uuez.fsf@ezri.u-picardie.fr> <20101223183531.19464601@galadriel.home> <87zkrws2pa.fsf@ezri.u-picardie.fr> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.20.1; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1293140700 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50299 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Thu, 23 Dec 2010 20:34:41 +0100 vous =E9criviez: > > My advice : software RAID stinks under high CPU load/ high IO. Use > > hardware RAID whenever possible because it provides more predictable > > performance and remove many weird software interactions from the > > picture. =20 >=20 > The 3w9550sx doesn't raid6, but I admit I've been thinking of using > its raid5 instead of the slow soft raid6. Ah that's a valid reason :) RAID-5 is reasonable with disks under 1TB and arrays up to 6 TB. Further it's a bet against the law of physics :) However, a reliable RAID-5 is probably safer than an experimental RAID-6 overall :) --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From eflorac@intellique.com Thu Dec 23 15:46:41 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBNLkfxU256535 for ; Thu, 23 Dec 2010 15:46:41 -0600 X-ASG-Debug-ID: 1293140917-19ee03970000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A28A621CB8D for ; Thu, 23 Dec 2010 13:48:38 -0800 (PST) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id gi33l2AmBxyETspj for ; Thu, 23 Dec 2010 13:48:38 -0800 (PST) Received: from galadriel.home (unknown [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP id ACE4FA6243; Thu, 23 Dec 2010 22:48:33 +0100 (CET) Date: Thu, 23 Dec 2010 22:48:32 +0100 From: Emmanuel Florac To: Stan Hoeppner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? Message-ID: <20101223224832.1abb3cb8@galadriel.home> In-Reply-To: <4D13A8E6.7090606@hardwarefreak.com> References: <20101222175611.1c7d5190@harpe.intellique.com> <4D124B71.9030401@sandeen.net> <20101223012655.2681c596@galadriel.home> <20101223005630.GJ4907@dastard> <20101223195544.53d45f0b@galadriel.home> <4D13A8E6.7090606@hardwarefreak.com> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.20.1; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1293140920 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50298 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Thu, 23 Dec 2010 13:54:14 -0600 vous =E9criviez: > Best guess? Those 3TB Hitachi drives use 512 byte translated native > 4KB sectors.=20 Yes, I'm sure that no new drive model comes with true 512B sectors anymore... --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From eflorac@intellique.com Thu Dec 23 15:48:52 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBNLmpNN256658 for ; Thu, 23 Dec 2010 15:48:52 -0600 X-ASG-Debug-ID: 1293141045-0b2b02320000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 266521CF5786 for ; Thu, 23 Dec 2010 13:50:49 -0800 (PST) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id 4TU2lLzM1VNvmaRp for ; Thu, 23 Dec 2010 13:50:49 -0800 (PST) Received: from galadriel.home (unknown [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP id E05AAA624F; Thu, 23 Dec 2010 22:50:41 +0100 (CET) Date: Thu, 23 Dec 2010 22:50:36 +0100 From: Emmanuel Florac To: Justin Piszcz Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? Message-ID: <20101223225036.4bef756e@galadriel.home> In-Reply-To: References: <20101222175611.1c7d5190@harpe.intellique.com> <4D124B71.9030401@sandeen.net> <20101223012655.2681c596@galadriel.home> <20101223005630.GJ4907@dastard> <20101223195544.53d45f0b@galadriel.home> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.20.1; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1293141051 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50300 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Thu, 23 Dec 2010 14:07:13 -0500 (EST) vous =E9criviez: > Main wonder I have is why when the partition is aligned to 1MiB, > which is the default in parted 2.2+ I believe, is it slower than with > no partitions? 1MiB possibly can't round well on the stripe boundaries. I suppose you could get better results with 64KB or 16KB stripes. Did you try with an LVM in between? --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From jpiszcz@lucidpixels.com Thu Dec 23 16:03:00 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBNM30eL257686 for ; Thu, 23 Dec 2010 16:03:00 -0600 X-ASG-Debug-ID: 1293141898-3d1e00e70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lucidpixels.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 604E41CF583D for ; Thu, 23 Dec 2010 14:04:58 -0800 (PST) Received: from lucidpixels.com (lucidpixels.com [75.144.35.66]) by cuda.sgi.com with ESMTP id W43wuv7HoZeFIvC7 for ; Thu, 23 Dec 2010 14:04:58 -0800 (PST) Received: by lucidpixels.com (Postfix, from userid 1001) id 7E3EC12055A; Thu, 23 Dec 2010 17:04:58 -0500 (EST) Date: Thu, 23 Dec 2010 17:04:58 -0500 (EST) From: Justin Piszcz To: Emmanuel Florac cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? In-Reply-To: <20101223225036.4bef756e@galadriel.home> Message-ID: References: <20101222175611.1c7d5190@harpe.intellique.com> <4D124B71.9030401@sandeen.net> <20101223012655.2681c596@galadriel.home> <20101223005630.GJ4907@dastard> <20101223195544.53d45f0b@galadriel.home> <20101223225036.4bef756e@galadriel.home> User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="655872-1092608683-1293141898=:17269" X-Barracuda-Connect: lucidpixels.com[75.144.35.66] X-Barracuda-Start-Time: 1293141899 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50300 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. --655872-1092608683-1293141898=:17269 Content-Type: TEXT/PLAIN; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: QUOTED-PRINTABLE Hi, I had not tested with 64KB or 16KB stripes: I used optimal (default I believe) in newer 2.2+ parted: -a alignment-type, --align alignment-type Set alignment for newly created partitions, valid align= ment types are: none Use the minimum alignment allowed by the disk type. cylinder Align partitions to cylinders. minimal Use minimum alignment as given by the disk topo= logy information. This and the opt value will use la= yout information provided by the disk to align the log= ical partition table addresses to actual physical block= s on the disks. The min value is the minimum aligment ne= eded to align the partition properly to physical blocks, w= hich avoids performance degradation. optimal Use optimum alignment as given by the disk topo= logy information. This aligns to a multiple of the phys= ical block size in a way that guarantees optimal performan= ce. I'm happy with the performance now.. I get 16GB ram tomorrow so hopefully= =20 that'll be enough if I need to xfs_repair. Justin. On Thu, 23 Dec 2010, Emmanuel Florac wrote: > Le Thu, 23 Dec 2010 14:07:13 -0500 (EST) vous =E9criviez: > >> Main wonder I have is why when the partition is aligned to 1MiB, >> which is the default in parted 2.2+ I believe, is it slower than with >> no partitions? > > 1MiB possibly can't round well on the stripe boundaries. I suppose you > could get better results with 64KB or 16KB stripes. Did you try with an > LVM in between? > > --=20 > ------------------------------------------------------------------------ > Emmanuel Florac | Direction technique > | Intellique > |=09 > | +33 1 78 94 84 02 > ------------------------------------------------------------------------ > --655872-1092608683-1293141898=:17269-- From stan@hardwarefreak.com Thu Dec 23 17:19:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBNNJ7Nb010291 for ; Thu, 23 Dec 2010 17:19:07 -0600 X-ASG-Debug-ID: 1293146466-6ca001f70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id CA5D321CB9A for ; Thu, 23 Dec 2010 15:21:06 -0800 (PST) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id NCy022x1DondhYeH for ; Thu, 23 Dec 2010 15:21:06 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 25F496C14F for ; Thu, 23 Dec 2010 17:21:06 -0600 (CST) Message-ID: <4D13D962.5060809@hardwarefreak.com> Date: Thu, 23 Dec 2010 17:21:06 -0600 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? References: <20101222175611.1c7d5190@harpe.intellique.com> <4D124B71.9030401@sandeen.net> <20101223012655.2681c596@galadriel.home> <20101223005630.GJ4907@dastard> <20101223195544.53d45f0b@galadriel.home> <4D13A8E6.7090606@hardwarefreak.com> <20101223224832.1abb3cb8@galadriel.home> In-Reply-To: <20101223224832.1abb3cb8@galadriel.home> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1293146466 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0698 1.0000 -1.5765 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.98 X-Barracuda-Spam-Status: No, SCORE=-0.98 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50306 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Emmanuel Florac put forth on 12/23/2010 3:48 PM: > Le Thu, 23 Dec 2010 13:54:14 -0600 vous écriviez: > >> Best guess? Those 3TB Hitachi drives use 512 byte translated native >> 4KB sectors. > > Yes, I'm sure that no new drive model comes with true 512B sectors > anymore... I believe most/all shipping drives of 1TB and smaller still have native 512 byte sectors, dependent on specific vendor/model line of course. It's mainly the 1.5TB and up drives with the hybrid 512/4096 byte sector abomination. It would be far more optimal if they'd just ship native 4K sector drives wouldn't it? Isn't most of Linux already patched for pure 4k sector drives? Is XFS ready for such native 4k sector drives? Are the various RAID cards/SAN array controllers? -- Stan From r.scobie@clear.net.nz Thu Dec 23 17:46:39 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBNNkc33015437 for ; Thu, 23 Dec 2010 17:46:39 -0600 X-ASG-Debug-ID: 1293148116-59d6030f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp3.clear.net.nz (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0488E147EB4F for ; Thu, 23 Dec 2010 15:48:36 -0800 (PST) Received: from smtp3.clear.net.nz (smtp3.clear.net.nz [203.97.33.64]) by cuda.sgi.com with ESMTP id bH6F0ySMlUOIrtTe for ; Thu, 23 Dec 2010 15:48:36 -0800 (PST) Received: from [210.246.8.113] (210-246-8-113.paradise.net.nz [210.246.8.113]) by smtp3.clear.net.nz (CLEAR Net Mail) with ESMTP id <0LDW00F8ZNGZW900@smtp3.clear.net.nz> for xfs@oss.sgi.com; Fri, 24 Dec 2010 12:48:36 +1300 (NZDT) Date: Fri, 24 Dec 2010 12:47:42 +1300 From: Richard Scobie X-ASG-Orig-Subj: Re: able to mount a fs, unable to repair it Subject: Re: able to mount a fs, unable to repair it To: xfs@oss.sgi.com Message-id: <4D13DF9E.4090507@clear.net.nz> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii; format=flowed Content-transfer-encoding: 7bit User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.13) Gecko/20080313 SeaMonkey/1.1.9 X-Barracuda-Connect: smtp3.clear.net.nz[203.97.33.64] X-Barracuda-Start-Time: 1293148118 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2393 1.0000 -0.6275 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.63 X-Barracuda-Spam-Status: No, SCORE=-0.63 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50307 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Emmanuel Florac wrote: > However, a reliable RAID-5 is probably safer than an experimental > RAID-6 overall. Looking at the 2.6.29.1 kernel running on this machine, the only md RAID mode marked as experimental is RAID-10. I have no experience using Xen, but have used md RAID6 extensively in heavily loaded situations for over three years without problems. Regards, Richard From stan@hardwarefreak.com Thu Dec 23 18:52:21 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBO0qLI1028076 for ; Thu, 23 Dec 2010 18:52:21 -0600 X-ASG-Debug-ID: 1293152059-669b00800000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C690521B477 for ; Thu, 23 Dec 2010 16:54:19 -0800 (PST) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id Hpuyi3M62X31lMxb for ; Thu, 23 Dec 2010 16:54:19 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 456F56C14F for ; Thu, 23 Dec 2010 18:54:19 -0600 (CST) Message-ID: <4D13EF3B.2050401@hardwarefreak.com> Date: Thu, 23 Dec 2010 18:54:19 -0600 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfssyncd and disk spin down Subject: Re: xfssyncd and disk spin down References: <20101223165532.GA23813@peter.simplex.ro> <4D13A30A.3090600@hardwarefreak.com> <20101223211650.GA19694@peter.simplex.ro> In-Reply-To: <20101223211650.GA19694@peter.simplex.ro> 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: 1293152059 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0226 1.0000 -1.8743 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.27 X-Barracuda-Spam-Status: No, SCORE=-1.27 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50312 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Petre Rodan put forth on 12/23/2010 3:16 PM: > but my original mail had a different target really. I have to recognize that I don't know much about the inner-workings of a filesystem, but I find it odd that once there is no input from the outside, a process keeps writing to the drive indefinitely. in my very narrow thinking the fact that these writes dissapear after a remount would prove their redundance. Ahh, quite right. Sorry Petre. This might shed some light on your issue. Old background thread: http://oss.sgi.com/archives/xfs/2003-09/msg00674.html Current documentation on this turnable knob: http://www.mjmwired.net/kernel/Documentation/filesystems/xfs.txt fs.xfs.xfssyncd_centisecs (Min: 100 Default: 3000 Max: 720000) The interval at which the xfssyncd thread flushes metadata out to disk. This thread will flush log activity out, and do some processing on unlinked inodes. Maybe related or also worth mentioning: fs.xfs.age_buffer_centisecs (Min: 100 Default: 1500 Max: 720000) The age at which xfsbufd flushes dirty metadata buffers to disk. As of 2.6.36, it looks like you can stretch this out to a more reasonable (for your application) 12 minutes if you like. I'm not sure if the max value is different than 2.6.32.2 as I don't have a box or VM available with 2.6.32.2. Try bumping these values to 720000 and see if that allows your disk to sleep for 12 mins. -- Stan From stan@hardwarefreak.com Thu Dec 23 18:59:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBO0xJjI029432 for ; Thu, 23 Dec 2010 18:59:20 -0600 X-ASG-Debug-ID: 1293152478-2535026d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 130D1147EEEF for ; Thu, 23 Dec 2010 17:01:18 -0800 (PST) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id Mcq9riURJ3wKeiBu for ; Thu, 23 Dec 2010 17:01:18 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 2395B6C14F for ; Thu, 23 Dec 2010 19:01:18 -0600 (CST) Message-ID: <4D13F0DE.50306@hardwarefreak.com> Date: Thu, 23 Dec 2010 19:01:18 -0600 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Anyone using XFS in production on > 20TiB volumes? Subject: Re: Anyone using XFS in production on > 20TiB volumes? References: <20101222175611.1c7d5190@harpe.intellique.com> <4D124B71.9030401@sandeen.net> <20101223012655.2681c596@galadriel.home> <20101223005630.GJ4907@dastard> <20101223195544.53d45f0b@galadriel.home> 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: 1293152479 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0859 1.0000 -1.4777 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.88 X-Barracuda-Spam-Status: No, SCORE=-0.88 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50311 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Justin Piszcz put forth on 12/23/2010 1:29 PM: > Please check the updated page: > http://home.comcast.net/~jpiszcz/20101223/final.html > > Using a partition shows a slight degredation in the re-write speed but > an increase in performance for sequential output and input with the mode > set to perform. Looks like this is what I will be using as it is the > fastest > speeds overall except for the rewrite. If your primary workloads for this array are mostly single user/thread streaming writes/reads then this may be fine. If they are multi-user or multi-threaded random re-write server loads, re-write is the most important metric and you should optimize for that scenario alone, as its performance is most dramatically impacted by parity RAID schemes such as RAID 6. -- Stan From stan@hardwarefreak.com Thu Dec 23 23:13:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBO5DCpm066373 for ; Thu, 23 Dec 2010 23:13:13 -0600 X-ASG-Debug-ID: 1293167710-469303bd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7D2B61A32E30 for ; Thu, 23 Dec 2010 21:15:10 -0800 (PST) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id zoO9lZQiVgBTpYSs for ; Thu, 23 Dec 2010 21:15:10 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 86D8A6C14F for ; Thu, 23 Dec 2010 23:15:10 -0600 (CST) Message-ID: <4D142C5E.2020004@hardwarefreak.com> Date: Thu, 23 Dec 2010 23:15:10 -0600 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfssyncd and disk spin down Subject: Re: xfssyncd and disk spin down References: <20101223165532.GA23813@peter.simplex.ro> <4D13A30A.3090600@hardwarefreak.com> <20101223211650.GA19694@peter.simplex.ro> <4D13EF3B.2050401@hardwarefreak.com> In-Reply-To: <4D13EF3B.2050401@hardwarefreak.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: 1293167711 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50328 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Stan Hoeppner put forth on 12/23/2010 6:54 PM: > http://www.mjmwired.net/kernel/Documentation/filesystems/xfs.txt > > fs.xfs.xfssyncd_centisecs (Min: 100 Default: 3000 Max: 720000) > The interval at which the xfssyncd thread flushes metadata > out to disk. This thread will flush log activity out, and > do some processing on unlinked inodes. > > Maybe related or also worth mentioning: > > fs.xfs.age_buffer_centisecs (Min: 100 Default: 1500 Max: 720000) > The age at which xfsbufd flushes dirty metadata buffers to disk. These can be found in /proc/sys/fs/xfs and you'd simply ~$ echo 720000 > /proc/sys/fs/xfs/xfssyncd_centisecs to get the maximum 12 minute interval. -- Stan From petre.rodan@simplex.ro Fri Dec 24 00:02:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBO62SVU075305 for ; Fri, 24 Dec 2010 00:02:28 -0600 X-ASG-Debug-ID: 1293170665-100f00b10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from passage.avira.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 778DD147F28B for ; Thu, 23 Dec 2010 22:04:26 -0800 (PST) Received: from passage.avira.com (passage.avira.com [89.238.222.20]) by cuda.sgi.com with ESMTP id ZTaoxvujhQ1F73Em for ; Thu, 23 Dec 2010 22:04:26 -0800 (PST) Received: by passage.avira.com (Postfix/AVIRA, from userid 26) id A7D81124A06; Fri, 24 Dec 2010 08:04:24 +0200 (EET) Received: from localhost (localhost [127.0.0.1]) by passage.avira.com (Postfix/AVIRA) with ESMTP id 45964124A05 for ; Fri, 24 Dec 2010 08:04:24 +0200 (EET) Received: from passage.avira.com (localhost [127.0.0.1]) by localhost (AvMailGate-2.1.3-2) id 2006-EcrAQy; Fri, 24 Dec 2010 08:04:24 +0200 (EET) Received: from naliboat.bu.avira.com (dasapass.avira.com [89.238.222.18]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "mail.bu.avira.com", Issuer "Avira Intermediate Certificate Authority 2010-2020" (not verified)) by passage.avira.com (Postfix/AVIRA) with ESMTPS id 3673B124A05 for ; Fri, 24 Dec 2010 08:04:24 +0200 (EET) Received: (qmail 6279 invoked from network); 24 Dec 2010 06:04:24 -0000 Received: from unknown (HELO peter.simplex.ro) (prodan@10.7.0.16) by naliboat.bu.avira.com with ESMTPA; 24 Dec 2010 06:04:24 -0000 Date: Fri, 24 Dec 2010 08:02:46 +0200 From: Petre Rodan To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfssyncd and disk spin down Subject: Re: xfssyncd and disk spin down Message-ID: <20101224060246.GA2308@peter.simplex.ro> References: <20101223165532.GA23813@peter.simplex.ro> <4D13A30A.3090600@hardwarefreak.com> <20101223211650.GA19694@peter.simplex.ro> <4D13EF3B.2050401@hardwarefreak.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4D13EF3B.2050401@hardwarefreak.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-AntiVirus: checked by AntiVir MailGate (version: 2.1.3-2; AVE: 7.9.4.128; VDF: 7.11.0.153; host: passage.avira.com) X-Barracuda-Connect: passage.avira.com[89.238.222.20] X-Barracuda-Start-Time: 1293170667 X-Barracuda-Bayes: INNOCENT GLOBAL 0.1485 1.0000 -1.1100 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.11 X-Barracuda-Spam-Status: No, SCORE=-1.11 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50331 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hello Stan, On Thu, Dec 23, 2010 at 06:54:19PM -0600, Stan Hoeppner wrote: > Petre Rodan put forth on 12/23/2010 3:16 PM: > > > but my original mail had a different target really. I have to recognize that I don't know much about the inner-workings of a filesystem, but I find it odd that once there is no input from the outside, a process keeps writing to the drive indefinitely. in my very narrow thinking the fact that these writes dissapear after a remount would prove their redundance. > > Ahh, quite right. Sorry Petre. This might shed some light on your > issue. Old background thread: > > http://oss.sgi.com/archives/xfs/2003-09/msg00674.html > > Current documentation on this turnable knob: > > http://www.mjmwired.net/kernel/Documentation/filesystems/xfs.txt I appreciate your quick replies, but rest assured that I did search the archives and the documentation that came with the kernel. I would be delighted to know the underlying reason why internal xfs processes need to flush things to the drive more than once. can't it be as easy as accept write command -> cache -> actual write to the hardware -> clean cache/log/dirty metadata -> sleep until next command comes (and not touch the drive in any way until then) what am I missing in this picture? if anything needs to be flushed, why do it over and over again, once is not enough ? what I found (see first mail from thread) is that a write to an xfs partition triggers an xfssyncd process to continually write to the drive for no apparent reason. and keeps writing at regulated intervals long after any other read or write request has been made from the outside. I left the drive untouched for 12 hours and xfssyncd was still pinging the drive. and there is no xfssyncd process pinging if I do not do initiate a write to the disk after the partition is mounted, so to me that means that xfs would function without constant writing to the underlying device. > fs.xfs.xfssyncd_centisecs (Min: 100 Default: 3000 Max: 720000) > fs.xfs.age_buffer_centisecs (Min: 100 Default: 1500 Max: 720000) just increasing the delay until an inevitable and seemingly redundant disk write is not what I want. I was searching for an option to make internal xfs processes not touch the drive after the buffers/log/dirty metadata have been flushed (once). thanks, peter From sandeen@sandeen.net Fri Dec 24 12:15:56 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_26, J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBOIFu49141805 for ; Fri, 24 Dec 2010 12:15:56 -0600 X-ASG-Debug-ID: 1293214674-69e802d20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EC36AF76005 for ; Fri, 24 Dec 2010 10:17:55 -0800 (PST) Received: from mail.sandeen.net (64-131-28-21.usfamily.net [64.131.28.21]) by cuda.sgi.com with ESMTP id ULrDTNbdZKDaWbK4 for ; Fri, 24 Dec 2010 10:17:55 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 3EBF34815713; Fri, 24 Dec 2010 12:17:54 -0600 (CST) Message-ID: <4D14E3D2.4000505@sandeen.net> Date: Fri, 24 Dec 2010 12:17:54 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: Petre Rodan CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfssyncd and disk spin down Subject: Re: xfssyncd and disk spin down References: <20101223165532.GA23813@peter.simplex.ro> In-Reply-To: <20101223165532.GA23813@peter.simplex.ro> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-28-21.usfamily.net[64.131.28.21] X-Barracuda-Start-Time: 1293214675 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50379 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 12/23/10 10:55 AM, Petre Rodan wrote: > > Hello, > > I have a problem with a hard drive that never managed to spin down. > this drive is a storage space, not a system disk, the only thing that > generated writes is the nfs server that exports its contents. it has > only one large xfs partition on it. > > upon closer inspection it turns out that after the first Write action > to that partition, an xfssyncd process continues to write to that > partition each 36 seconds and it doesn't stop doing that, even if > there are no more Writes from the exterior. this keeps the drive busy > with varying consequences. more about that later. Doesn't seem like that should happen. > I found that the only easy way to stop the xfssyncd process poking > the drive is to run a `mount -o remount /mnt/space`. this will > silence any internal xfs process to acessing the drive, thus allowing > it to spin down and only be woken up by a NFS access. > > here are some simple steps to replicate the problem: > > # echo 3 > /proc/sys/vm/drop_caches # free cached fs entities > # ( blktrace -d /dev/sdb -o - | blkparse -i - ) & > # mount -o remount /mnt/space > # find /mnt/space/ -type f > /dev/null # generate some non-cached Read requests > # # absolutely no writes have been performed to the drive, > # # it could spin down now if enough time would pass > # touch /mnt/space/foo > # # process 1352 will start writing to the drive at a 35-36s interval, > # # even if there has been no other write request. > > 8,16 1 36591 6306.873151576 1352 A WBS 976985862 + 2 <- (8,17) 976985799 > 8,16 1 36592 6306.873152998 1352 Q WBS 976985862 + 2 [xfssyncd/sdb1] > [..] > 8,16 1 36600 6342.875151286 1352 A WBS 976985864 + 2 <- (8,17) 976985801 > 8,16 1 36601 6342.875152938 1352 Q WBS 976985864 + 2 [xfssyncd/sdb1] > [..] > 8,16 1 36609 6378.877225211 1352 A WBS 976985866 + 2 <- (8,17) 976985803 > 8,16 1 36610 6378.877226935 1352 Q WBS 976985866 + 2 [xfssyncd/sdb1] > > there was no file at or near the 976985799 inode (I presume that's an > inode?) Nope that's a sector on the drive. > A WBS 976985862 + 2 <- (8,17) 976985799 976985799 is the sector on sdb1, mapped to 976985862 on sdb (63 sectors in, yay dos partition tables!) A means remapped (from sdb1 to sdb), Q means Queued. WBS means Write/Barrier/Synchronous. Also, you're stepping through, it looks like - 976985799, 976985801, 976985803, .... > I found that the only way to stop it is to remount the partition. I > also tried sync(1), but to no avail. > > so is there an XFS option somewhere that would make the filesystem be > more forgiving with the hardware beneath it? without loosing the > journal of course. I think we just need to figure out what's causing the writes, and what's being written. > I'm using a vanilla 2.6.36.2 kernel patched with grsecurity, default > mkfs.xfs options, rw,nosuid,nodev,noexec,noatime,attr2,noquota mount > options, and xfs_info looks like this:> > meta-data=/dev/sdb1 isize=256 agcount=4, agsize=61047500 blks > = sectsz=512 attr=2 > data = bsize=4096 blocks=244190000, imaxpct=25 > = sunit=0 swidth=0 blks > naming =version 2 bsize=4096 ascii-ci=0 > log =internal bsize=4096 blocks=32768, version=2 > = sectsz=512 sunit=0 blks, lazy-count=0 > realtime =none extsz=4096 blocks=0, rtextents=0 so what is sector 976985799 on the filesystem... An AG is 61047500 blocks long, or 488380000 sectors long. There are 4 of them, and the log is at the front of an AG in the middle of the fs. So the 1st AG starts at 0, 2nd at 488380000 sectors, 3rd at 976760000 sectors. Your writes are at 976985799-ish sectors, or 225799 sectors into the 3rd AG. The log is 262144 sectors long. So this looks like log writes. Makes sense with the WBS data too. xfssyncd forces the log, reclaims inodes, and logs a dummy transaction if needed. On an idle fs though I wouldn't expect that we need any of this, so probably need to dig a little to see what's going on. I don't think you need a mount option, I think we need an explanation and maybe a bugfix. :) I'll try to find time to look into it unless someone else knows what's going on off the top of their heads. -Eric From stan@hardwarefreak.com Fri Dec 24 16:58:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBOMwCMu180842 for ; Fri, 24 Dec 2010 16:58:13 -0600 X-ASG-Debug-ID: 1293231611-4be402830000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C19EF21E5B2 for ; Fri, 24 Dec 2010 15:00:12 -0800 (PST) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id PAF3G0pm3mxArxg2 for ; Fri, 24 Dec 2010 15:00:12 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id B50C26C14F for ; Fri, 24 Dec 2010 17:00:11 -0600 (CST) Message-ID: <4D1525FB.1010605@hardwarefreak.com> Date: Fri, 24 Dec 2010 17:00:11 -0600 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfssyncd and disk spin down Subject: Re: xfssyncd and disk spin down References: <20101223165532.GA23813@peter.simplex.ro> <4D13A30A.3090600@hardwarefreak.com> <20101223211650.GA19694@peter.simplex.ro> <4D13EF3B.2050401@hardwarefreak.com> <20101224060246.GA2308@peter.simplex.ro> In-Reply-To: <20101224060246.GA2308@peter.simplex.ro> 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: 1293231612 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2230 1.0000 -0.7090 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.11 X-Barracuda-Spam-Status: No, SCORE=-0.11 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50398 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Petre Rodan put forth on 12/24/2010 12:02 AM: >> fs.xfs.xfssyncd_centisecs (Min: 100 Default: 3000 Max: 720000) >> fs.xfs.age_buffer_centisecs (Min: 100 Default: 1500 Max: 720000) > > just increasing the delay until an inevitable and seemingly redundant disk write is not what I want. > I was searching for an option to make internal xfs processes not touch the drive after the buffers/log/dirty metadata have been flushed (once). I'm not a dev Petre but just another XFS user. This is the best "solution" I could come up with for your issue. I assumed this "unnecessary" regularly scheduled activity was a house cleaning measure and done intentionally; didn't dawn on me that it may be a bug. Sorry I wasn't able to fully address your issue. If/until there is a permanent fix for this you may want to bump this to 720000 anyway as an interim measure, if you haven't already, as it should yield a significantly better situation than what you have now. You'll at least get something like ~1400 minutes of sleep per day instead of none, decreasing your load/unload cycles from ~2880/day to ~120/day, if my math is correct. -- Stan From sandeen@sandeen.net Fri Dec 24 21:34:52 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBP3Yp1u223014 for ; Fri, 24 Dec 2010 21:34:52 -0600 X-ASG-Debug-ID: 1293248210-03b2031c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8CE75147EE25 for ; Fri, 24 Dec 2010 19:36:50 -0800 (PST) Received: from mail.sandeen.net (64-131-28-21.usfamily.net [64.131.28.21]) by cuda.sgi.com with ESMTP id Son7AeEReIlD3sXq for ; Fri, 24 Dec 2010 19:36:50 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 6E6C64815714; Fri, 24 Dec 2010 21:36:49 -0600 (CST) Message-ID: <4D1566D1.6090506@sandeen.net> Date: Fri, 24 Dec 2010 21:36:49 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: Stan Hoeppner CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfssyncd and disk spin down Subject: Re: xfssyncd and disk spin down References: <20101223165532.GA23813@peter.simplex.ro> <4D13A30A.3090600@hardwarefreak.com> <20101223211650.GA19694@peter.simplex.ro> <4D13EF3B.2050401@hardwarefreak.com> <20101224060246.GA2308@peter.simplex.ro> <4D1525FB.1010605@hardwarefreak.com> In-Reply-To: <4D1525FB.1010605@hardwarefreak.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-28-21.usfamily.net[64.131.28.21] X-Barracuda-Start-Time: 1293248211 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0049 1.0000 -1.9892 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.89 X-Barracuda-Spam-Status: No, SCORE=-1.89 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50417 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On 12/24/10 5:00 PM, Stan Hoeppner wrote: > Petre Rodan put forth on 12/24/2010 12:02 AM: > >>> fs.xfs.xfssyncd_centisecs (Min: 100 Default: 3000 Max: 720000) >>> fs.xfs.age_buffer_centisecs (Min: 100 Default: 1500 Max: 720000) >> >> just increasing the delay until an inevitable and seemingly redundant disk write is not what I want. >> I was searching for an option to make internal xfs processes not touch the drive after the buffers/log/dirty metadata have been flushed (once). > > I'm not a dev Petre but just another XFS user. This is the best > "solution" I could come up with for your issue. I assumed this > "unnecessary" regularly scheduled activity was a house cleaning measure > and done intentionally; didn't dawn on me that it may be a bug. > > Sorry I wasn't able to fully address your issue. If/until there is a > permanent fix for this you may want to bump this to 720000 anyway as an > interim measure, if you haven't already, as it should yield a > significantly better situation than what you have now. You'll at least > get something like ~1400 minutes of sleep per day instead of none, > decreasing your load/unload cycles from ~2880/day to ~120/day, if my > math is correct. Of course, then xfssyncd will not be doing its proper duty regularly ;) We just need to see why it's always finding work to do when idle. -Eric From stan@hardwarefreak.com Fri Dec 24 22:30:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBP4Uivj231884 for ; Fri, 24 Dec 2010 22:30:45 -0600 X-ASG-Debug-ID: 1293251564-3d0100c00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 31BA421E938 for ; Fri, 24 Dec 2010 20:32:44 -0800 (PST) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id FvA28SIY8GFUqPAm for ; Fri, 24 Dec 2010 20:32:44 -0800 (PST) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 532346C0B2 for ; Fri, 24 Dec 2010 22:32:44 -0600 (CST) Message-ID: <4D1573EC.9070603@hardwarefreak.com> Date: Fri, 24 Dec 2010 22:32:44 -0600 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfssyncd and disk spin down Subject: Re: xfssyncd and disk spin down References: <20101223165532.GA23813@peter.simplex.ro> <4D13A30A.3090600@hardwarefreak.com> <20101223211650.GA19694@peter.simplex.ro> <4D13EF3B.2050401@hardwarefreak.com> <20101224060246.GA2308@peter.simplex.ro> <4D1525FB.1010605@hardwarefreak.com> <4D1566D1.6090506@sandeen.net> In-Reply-To: <4D1566D1.6090506@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1293251565 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2719 1.0000 -0.4723 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.13 X-Barracuda-Spam-Status: No, SCORE=0.13 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50420 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Eric Sandeen put forth on 12/24/2010 9:36 PM: > On 12/24/10 5:00 PM, Stan Hoeppner wrote: >> Petre Rodan put forth on 12/24/2010 12:02 AM: >> >>>> fs.xfs.xfssyncd_centisecs (Min: 100 Default: 3000 Max: 720000) >>>> fs.xfs.age_buffer_centisecs (Min: 100 Default: 1500 Max: 720000) >>> >>> just increasing the delay until an inevitable and seemingly redundant disk write is not what I want. >>> I was searching for an option to make internal xfs processes not touch the drive after the buffers/log/dirty metadata have been flushed (once). >> >> I'm not a dev Petre but just another XFS user. This is the best >> "solution" I could come up with for your issue. I assumed this >> "unnecessary" regularly scheduled activity was a house cleaning measure >> and done intentionally; didn't dawn on me that it may be a bug. >> >> Sorry I wasn't able to fully address your issue. If/until there is a >> permanent fix for this you may want to bump this to 720000 anyway as an >> interim measure, if you haven't already, as it should yield a >> significantly better situation than what you have now. You'll at least >> get something like ~1400 minutes of sleep per day instead of none, >> decreasing your load/unload cycles from ~2880/day to ~120/day, if my >> math is correct. > > Of course, then xfssyncd will not be doing its proper duty regularly ;) Sure it will. Just not *as regularly*. You, Dave, Alex, Christoph, or someone made the regularity configurable didn't you? ;) > We just need to see why it's always finding work to do when idle. Seems like my grandmother must have been involved with the current code. She was always telling me "Idle hands are the Devil's work." ;) Or, whoever wrote the code was somehow influenced by my grandmother (his own). -- Stan From petre.rodan@simplex.ro Sat Dec 25 06:06:41 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBPC6ech044692 for ; Sat, 25 Dec 2010 06:06:41 -0600 X-ASG-Debug-ID: 1293278916-1720035f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from dal02.mx.dnspark.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9DCD41CF84CD for ; Sat, 25 Dec 2010 04:08:36 -0800 (PST) Received: from dal02.mx.dnspark.net (dal02.mx.dnspark.net [67.228.184.121]) by cuda.sgi.com with ESMTP id 11jPEeH9DWsKDceH for ; Sat, 25 Dec 2010 04:08:36 -0800 (PST) Received: from pandora.simplex.ro (unknown [188.25.55.5]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by dal02.mx.dnspark.net (Postfix) with ESMTPSA id 56619194312; Sat, 25 Dec 2010 06:08:35 -0600 (CST) Date: Sat, 25 Dec 2010 14:09:48 +0200 From: Petre Rodan To: Eric Sandeen Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfssyncd and disk spin down Subject: Re: xfssyncd and disk spin down Message-ID: <20101225120948.GA14200@pandora.simplex.ro> References: <20101223165532.GA23813@peter.simplex.ro> <4D14E3D2.4000505@sandeen.net> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="rJwd6BRFiFCcLxzm" Content-Disposition: inline In-Reply-To: <4D14E3D2.4000505@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: dal02.mx.dnspark.net[67.228.184.121] X-Barracuda-Start-Time: 1293278917 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50450 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --rJwd6BRFiFCcLxzm Content-Type: multipart/mixed; boundary="WIyZ46R2i8wDzkSu" Content-Disposition: inline --WIyZ46R2i8wDzkSu Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi Eric, On Fri, Dec 24, 2010 at 12:17:54PM -0600, Eric Sandeen wrote: > Doesn't seem like that should happen. music to my ears :) having this fixed would make me a happy bunny. > > 8,16 1 36591 6306.873151576 1352 A WBS 976985862 + 2 <- (8,17= ) 976985799 > >=20 > > there was no file at or near the 976985799 inode (I presume that's an > > inode?) >=20 > Nope that's a sector on the drive. great, this should make debugging easier. > I think we just need to figure out what's causing the writes, and > what's being written. not sure about the first thing, but do read on for the "what's written" cha= pter: # mount -o remount /dev/sdb1 # to start fresh with no xfssyncd's pok= ing arround # cp -r /usr/src/linux* /mnt/space # do some writes to the drive, then let= it completely unused for at least 30 minutes after the cp finished # at this point the only thing active o= n sdb1 is xfssyncd at 36s intervals # bin/blk_debug.sh > /dev/shm/stdout blk_debug.sh parses the output of blktrace, blkparse and for each line cont= aining 'A WBS' it uses dd to save 8 sectors from sdb starting with the mapp= ed value I get from blkparse blktrace -d /dev/sdb -o - | blkparse -i - | while read line; do echo "${line}" grep -q 'A WBS' <<< ${line} && { sect=3D$(echo "${line}" | awk '{ print $8 }' ) # fork a dd and let xfssyncd time to finish writing (=20 sleep 20 # force dd to read the drive, not a cache echo 3 > /proc/sys/vm/drop_caches dd if=3D/dev/sdb of=3D/dev/shm/dump_${sect} skip=3D${sect} bs= =3D512 count=3D8 && \ echo "* sectors ${sect}-$((${sect}+8)) saved into dump_${sect}" ) & } done I thought that since xfssyncd writes to sectors in increments of 2 it would= be possible to run a diff between 2 consecutive samples and get some infor= mation that may help you see something. I provide an attachment with the en= tire stdout, sector dumps and scripts. also available here: http://incoming= =2Eavira.com/NOSYNC/peter/xfssyncd_debug.tar.bz2 there might be a slight misalignment of a few sectors between dd's seek and= where it's been told to go, look closely at the blkparse. apparently xfssy= ncd is not 'appending' information, it looks more like a bucketload of a si= milarly-looking array of data each time. hope this helps, if there is anything amiss I could fix it and try again an= ytime. > On an idle fs though I wouldn't expect that we need any of this, so proba= bly > need to dig a little to see what's going on. I don't think you need a mo= unt > option, I think we need an explanation and maybe a bugfix. :) >=20 > I'll try to find time to look into it unless someone else knows what's go= ing > on off the top of their heads. thank you for your interest. I'll be glad to test kernel patches against 2.6.36.2 that you might come up= with. @Stan, thanks for your input, it's nice to see friendly communities gathere= d arround a mailing list again. Happy Holidays everyone. cheers, peter --=20 petre rodan Technical Manager Simplex SRL, Bucharest --WIyZ46R2i8wDzkSu Content-Type: application/x-bzip2 Content-Disposition: attachment; filename="xfssyncd_debug.tar.bz2" Content-Transfer-Encoding: base64 QlpoOTFBWSZTWTnkuicBOdH/////////////////////////////////////////////4Ik/ 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 d1JJJJJJKIiEiUkkkkkkkkkl9KAEzdVyHrhsUameKfgs3E4qD0UI06oqBbvysGUcoyXnK1C8 WPpu63bkKFOS9DFlPihB09EZT7Au6UbiJisp5eDUpIbiMiZe5ERNwRcDduqxGo0S4vZdSczb iVNIRD2SSSSqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqBIQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV VVVVVVVVVVVVVVVVVVV7Y1VFVVV8hknMAkAO3W+eemta1KznUkkkkkkszMzEszMzEkkkkkko iISTu6SSSSSSSSSSSSVVVVSSSSSSSSSu7u7SW7u7qSSSSSSUREJEpJJJJJJJJJIJJKZmZSSS SSSSSSzMzMSzMzMSSSSSSSUzMygkkkkkkkkkkkSklERCSSSSSSSSS3d3dV3d3aSSSSSSSVVV VSSSSSSSSSSSSd3STu6SSVVVVSSSStJQkSkkkkkkkkkkgkkpmZlJJJJJJJJLMzMxLMzMxJJJ JJJJTMzKCSSSSSSSSSSRKSUREJJJJJJJJJLd3d1Xd3dpJJJJJJJVVVVJJJJJJJJJJJJ3dJO7 pJJJJJJJJJJJJVVVVJJJJJJJJK7u7tJbu7upJJJJJJREQkSkkkkkkkkkkgkkpmZlJJJJJJJJ L9R8aWAYAsAwBYMB8k33D77/t+HiIiIjNTUQt1rMzMzMy22225maDAQzNW2223WZmZmZmZmf WKrrWw2CGtqrvdtttttu8zMzMzMzM0qrsMBDMVVVVd7tttttt3mZmZmZmZmlVbsGZvegzaqq qqqqutW2223eZmZmZmZma2GBmYFqqqqqqqu92222227zMzMzMzM2CGt4Fqqqqqqqu9222222 7zMzMzMzM2CGt4Fqqqqqqqu92222227zMzMzMzM2CCa2qqqqqqqu92222227zMzYmtqqqqqq qrvdtuKqqqqqqqqqquzeilpS0paUtKWlLSlpS0paUtKWlLSlpS0paUtKWlLSlpS0paUtKWlL SlpS0paUtKWlLSlpS0paUtKWlLTvIBIAeA8B7vu+77vvfe5mZme996kkkkkkpmZlBJJJJJJJ JJJLgAd+c5yIi55znOc5ziSSSSW7u7qu7u7SSSSSSSSqqqqSSSSSSSSSSSTu6Sd3SSSSSSSS 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 --WIyZ46R2i8wDzkSu-- --rJwd6BRFiFCcLxzm Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.16 (GNU/Linux) iEYEABECAAYFAk0V3wwACgkQixMPpwVd7zEU6QCgw5/ZhnZZb+rd7U4Jw57vIPZy u8oAn0gNDYA/rLNgxv3sUSF6bWGic7Pf =nSdr -----END PGP SIGNATURE----- --rJwd6BRFiFCcLxzm-- From jj@chaosbits.net Sat Dec 25 14:22:39 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBPKMdQB125009 for ; Sat, 25 Dec 2010 14:22:39 -0600 X-ASG-Debug-ID: 1293308678-276200db0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from swampdragon.chaosbits.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BC4F221F2B2; Sat, 25 Dec 2010 12:24:38 -0800 (PST) Received: from swampdragon.chaosbits.net (swampdragon.chaosbits.net [90.184.90.115]) by cuda.sgi.com with ESMTP id LFfN0aUzMvYwZ3FT; Sat, 25 Dec 2010 12:24:38 -0800 (PST) Received: by swampdragon.chaosbits.net (Postfix, from userid 1000) id 064E99403F; Sat, 25 Dec 2010 21:14:54 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by swampdragon.chaosbits.net (Postfix) with ESMTP id F32E29403B; Sat, 25 Dec 2010 21:14:53 +0100 (CET) Date: Sat, 25 Dec 2010 21:14:53 +0100 (CET) From: Jesper Juhl To: xfs@oss.sgi.com cc: xfs-masters@oss.sgi.com, linux-kernel@vger.kernel.org, Alex Elder X-ASG-Orig-Subj: [PATCH] XFS: Compare, don't assign in ASSERT() in xfs_trans_unreserve_and_mod_sb() Subject: [PATCH] XFS: Compare, don't assign in ASSERT() in xfs_trans_unreserve_and_mod_sb() Message-ID: User-Agent: Alpine 2.00 (LNX 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Barracuda-Connect: swampdragon.chaosbits.net[90.184.90.115] X-Barracuda-Start-Time: 1293308679 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50483 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi, In fs/xfs/xfs_trans.c::xfs_trans_unreserve_and_mod_sb() at the out: label we have this: ASSERT(error = 0); I believe a comparison was intended, not an assignment. If I'm right, the patch below fixes that up. Signed-off-by: Jesper Juhl --- xfs_trans.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) compile tested only. diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index f6d956b..0e312b9 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -1137,7 +1137,7 @@ out_undo_fdblocks: if (blkdelta) xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, -blkdelta, rsvd); out: - ASSERT(error = 0); + ASSERT(error == 0); return; } -- Jesper Juhl http://www.chaosbits.net/ Don't top-post http://www.catb.org/~esr/jargon/html/T/top-post.html Plain text mails only, please. From jhon@gmail.com Sun Dec 26 00:53:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.7 required=5.0 tests=BAYES_60,T_LOTS_OF_MONEY, URIBL_BLACK autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBQ6rojO188931 for ; Sun, 26 Dec 2010 00:53:50 -0600 X-ASG-Debug-ID: 1293346549-0334014b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from gateway07.websitewelcome.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id D5E9C1CF900A for ; Sat, 25 Dec 2010 22:55:50 -0800 (PST) Received: from gateway07.websitewelcome.com (gateway07.websitewelcome.com [69.56.176.23]) by cuda.sgi.com with SMTP id PrgRoCZz9cu7q4ZK for ; Sat, 25 Dec 2010 22:55:50 -0800 (PST) Received: (qmail 16529 invoked from network); 26 Dec 2010 06:54:58 -0000 Received: from gator173.hostgator.com (74.52.142.50) by gateway07.websitewelcome.com with SMTP; 26 Dec 2010 06:54:58 -0000 Received: from actiontz by gator173.hostgator.com with local (Exim 4.69) (envelope-from ) id 1PWkWD-00007N-5t for xfs@oss.sgi.com; Sun, 26 Dec 2010 00:55:49 -0600 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Product Recommended by mike Subject: Product Recommended by mike X-PHP-Script: www.workclothesonline.com/index.php for 112.201.244.172 MIME-Version: 1.0 From: mike X-Mailer: CubeCart Mailer Reply-To: jhon@gmail.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit Message-ID: Date: Sun, 26 Dec 2010 00:55:49 -0600 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - gator173.hostgator.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [32114 32116] / [47 12] X-AntiAbuse: Sender Address Domain - gmail.com X-Barracuda-Connect: gateway07.websitewelcome.com[69.56.176.23] X-Barracuda-Start-Time: 1293346550 X-Barracuda-Bayes: INNOCENT GLOBAL 0.5180 1.0000 0.7500 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.94 X-Barracuda-Spam-Status: No, SCORE=1.94 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=EARN_PER_WEEK X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50525 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.19 EARN_PER_WEEK BODY: Contains 'earn $something per week' X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dear maam/sir, Hi - My friend Abid has been quietly making truckloads of money with his *SPECIAL* website. Now for the first time ever he's offering limited copies of his exact website which makes him $40,000 per month! Here's your chance to grab your own website and make $40,000 per month like him. If you're lazy then this website is definitely for you. It's integrated with the latest cutting edge technology so it makes money on auto pilot. Once setup you won't even have to do anything and still rake in the cash day after day. Introducing the "Adsense Treasure" Website. With this website Abid makes over $40,000 per month. And now you have the chance to own an exact copy so you can make some seriously big bucks too. No B.S. No Nonsense. This is absolutely real. Click the link below for more info: http://www.magicadsense.co.cc/aff.php?e=xfs@oss.sgi.com I promise you won't have seen anything like it before. Thanks, WBT Marketing East Land Vill, Lilo-an, PH-6002 click the link below to unsubscribe: http://www.magicadsense.co.cc/un.php?e=xfs@oss.sgi.com ~~~~~~~~~~~~~~~~~~~~~~~~~~ To view this product please follow the link below: http://www.workclothesonline.com/index.php?_a=viewProd&productId=96 ~~~~~~~~~~~~~~~~~~~~~~~~~~ This email was sent from http://www.workclothesonline.com Sender's IP Address: 112.201.244.172 From jKwcnJzsbLQsHCysLJwcnLTGtO6mRg==@smtp-confirmations-w-01.aweber.com Sun Dec 26 01:13:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=BAYES_80,FREEMAIL_FROM, T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBQ7D6Ab190056 for ; Sun, 26 Dec 2010 01:13:06 -0600 X-ASG-Debug-ID: 1293347705-16b803590000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp-confirmations-w-01.aweber.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8987C21F989 for ; Sat, 25 Dec 2010 23:15:05 -0800 (PST) Received: from smtp-confirmations-w-01.aweber.com (smtp-confirmations-w-01.aweber.com [207.106.200.17]) by cuda.sgi.com with ESMTP id FFq0V3CeIUcwdKOx for ; Sat, 25 Dec 2010 23:15:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha1; d=aweber.com; s=dkim_s1024; c=relaxed/simple; q=dns/txt; i=@aweber.com; t=1293347704; h=Sender:Subject:Date:From:List-Unsubscribe:To:Content-type; bh=/APo1N/iVlEAd/9afEYZ5gIq8/o=; b=zXvd/xMthy/ScEhfmBgIvCHEpJuvoacjKUyFY3bsnQX/WBOlmyNuIFfolDfCHgUQ CQKttDjZWbhXTQuGg/d437SEO/sfuypBa+zekSmIZCx07fJCQG8Hq0DgXTAyetGu I1ZFpMdzYqo4tAjfT7N0yykSpo09LiorhkdG2g6l1ZA=; Received: (qmail 28312 invoked by uid 0); 26 Dec 2010 02:15:04 -0500 Date: 26 Dec 2010 02:15:04 -0500 Message-ID: <20101226071504.28309.qmail@aweber.com> To: "" From: "7Figure" Sender: verifications@aweber.com X-Mailer: AWeber 3.2 X-Subscription: Subscribed on 12/26/2010, via web form, by 194.65.95.235 X_Id: 1589976:confirmation:xfs@oss.sgi.com List-Unsubscribe: , X-Remote-Host: 194.65.95.235 Content-type: text/plain X-ASG-Orig-Subj: Confirm your request for information. Subject: Confirm your request for information. X-Barracuda-Connect: smtp-confirmations-w-01.aweber.com[207.106.200.17] X-Barracuda-Start-Time: 1293347706 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4951 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50525 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hello - We received your request for information from the 7FIGURE group. Before we begin sending you the information you requested, we want to be certain we have your permission. ----------------------------------------------------------- CONFIRM BY VISITING THE LINK BELOW: http://www.aweber.com/z/c/?jwcnzsby035mzg2zs50zuadb2tty036mg==3826 Click the link above to give us permission to send you information. It's fast and easy! If you cannot click the full URL above, please copy and paste it into your web browser. ----------------------------------------------------------- If you do not want to confirm, simply ignore this message. VL Business Hub Box 2 Ground Floor, Gaisano Mactan Pajo, Lapu-Lapu, Cebu 6015, PHILIPPINES Request generated by: IP: 194.65.95.235 Date: December 26, 2010 02:14 EST From SRS0++WWN+30+fromorbit.com=david@internode.on.net Sun Dec 26 20:17:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBR2H70i247973 for ; Sun, 26 Dec 2010 20:17:07 -0600 X-ASG-Debug-ID: 1293416346-0614015b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 70C7F1530F95 for ; Sun, 26 Dec 2010 18:19:07 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id lC06ihmMYz7Bbj6G for ; Sun, 26 Dec 2010 18:19:07 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51097243-1927428 for multiple; Mon, 27 Dec 2010 12:49:06 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PX2fw-00039f-Iz; Mon, 27 Dec 2010 13:19:04 +1100 Date: Mon, 27 Dec 2010 13:19:04 +1100 From: Dave Chinner To: Petre Rodan Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfssyncd and disk spin down Subject: Re: xfssyncd and disk spin down Message-ID: <20101227021904.GA24828@dastard> References: <20101223165532.GA23813@peter.simplex.ro> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101223165532.GA23813@peter.simplex.ro> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1293416348 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50602 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 23, 2010 at 06:55:32PM +0200, Petre Rodan wrote: > > Hello, > > I have a problem with a hard drive that never managed to spin > down. this drive is a storage space, not a system disk, the only > thing that generated writes is the nfs server that exports its > contents. it has only one large xfs partition on it. > > upon closer inspection it turns out that after the first Write > action to that partition, an xfssyncd process continues to write > to that partition each 36 seconds and it doesn't stop doing that, > even if there are no more Writes from the exterior. this keeps the > drive busy with varying consequences. more about that later. Should be fixed in 2.6.37 by the commit: 1a387d3 xfs: dummy transactions should not dirty VFS state Cheers, Dave. -- Dave Chinner david@fromorbit.com From petre.rodan@simplex.ro Mon Dec 27 00:13:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBR6DC24003062 for ; Mon, 27 Dec 2010 00:13:13 -0600 X-ASG-Debug-ID: 1293430512-29e400780000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from dal02.mx.dnspark.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 802D41531449 for ; Sun, 26 Dec 2010 22:15:12 -0800 (PST) Received: from dal02.mx.dnspark.net (dal02.mx.dnspark.net [67.228.184.121]) by cuda.sgi.com with ESMTP id ifrmZkQILC0I1ZtN for ; Sun, 26 Dec 2010 22:15:12 -0800 (PST) Received: from pandora.simplex.ro (unknown [188.25.55.5]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by dal02.mx.dnspark.net (Postfix) with ESMTPSA id 7F01C194332; Mon, 27 Dec 2010 00:15:11 -0600 (CST) Date: Mon, 27 Dec 2010 08:16:29 +0200 From: Petre Rodan To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfssyncd and disk spin down Subject: Re: xfssyncd and disk spin down Message-ID: <20101227061629.GA2275@pandora.simplex.ro> References: <20101223165532.GA23813@peter.simplex.ro> <20101227021904.GA24828@dastard> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="WIyZ46R2i8wDzkSu" Content-Disposition: inline In-Reply-To: <20101227021904.GA24828@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: dal02.mx.dnspark.net[67.228.184.121] X-Barracuda-Start-Time: 1293430513 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50617 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --WIyZ46R2i8wDzkSu Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hello Dave, On Mon, Dec 27, 2010 at 01:19:04PM +1100, Dave Chinner wrote: > On Thu, Dec 23, 2010 at 06:55:32PM +0200, Petre Rodan wrote: > >=20 > > Hello, [..] > > upon closer inspection it turns out that after the first Write > > action to that partition, an xfssyncd process continues to write > > to that partition each 36 seconds and it doesn't stop doing that, > > even if there are no more Writes from the exterior. this keeps the > > drive busy with varying consequences. more about that later. >=20 > Should be fixed in 2.6.37 by the commit: >=20 > 1a387d3 xfs: dummy transactions should not dirty VFS state nice that someone else was also keen on having this bug fixed, but this par= ticular fix is already present in 2.6.36 [1], [2] unfortunately something is still written to the log every 36s, as per the f= irst mail in this thread. I guess we're getting closer. [1] http://www.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.36 [2] http://git.kernel.org/?p=3Dlinux/kernel/git/stable/linux-2.6.36.y.git;a= =3Dcommit;h=3D871eae4891a844e1fd065467b940f98dbf7aad1c cheers, peter --WIyZ46R2i8wDzkSu Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.16 (GNU/Linux) iEYEABECAAYFAk0YLz0ACgkQixMPpwVd7zGMqACfeWaW8a37KFpgq9boy2Uhlexp SZUAn2s+c38widpGyLgYqMTq7OxP3ac2 =U46I -----END PGP SIGNATURE----- --WIyZ46R2i8wDzkSu-- From SRS0++WWN+30+fromorbit.com=david@internode.on.net Mon Dec 27 08:06:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_53 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBRE64wJ022541 for ; Mon, 27 Dec 2010 08:06:04 -0600 X-ASG-Debug-ID: 1293458883-1c71026c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9F0D21531846 for ; Mon, 27 Dec 2010 06:08:03 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id 5HVQovrdRqheTqwS for ; Mon, 27 Dec 2010 06:08:03 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51127630-1927428 for multiple; Tue, 28 Dec 2010 00:38:02 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PXDjq-0003vG-Hv; Tue, 28 Dec 2010 01:07:50 +1100 Date: Tue, 28 Dec 2010 01:07:50 +1100 From: Dave Chinner To: Petre Rodan Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfssyncd and disk spin down Subject: Re: xfssyncd and disk spin down Message-ID: <20101227140750.GB24828@dastard> References: <20101223165532.GA23813@peter.simplex.ro> <20101227021904.GA24828@dastard> <20101227061629.GA2275@pandora.simplex.ro> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101227061629.GA2275@pandora.simplex.ro> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1293458885 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50649 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 27, 2010 at 08:16:29AM +0200, Petre Rodan wrote: > > Hello Dave, > > On Mon, Dec 27, 2010 at 01:19:04PM +1100, Dave Chinner wrote: > > On Thu, Dec 23, 2010 at 06:55:32PM +0200, Petre Rodan wrote: > > > > > > Hello, > [..] > > > upon closer inspection it turns out that after the first Write > > > action to that partition, an xfssyncd process continues to write > > > to that partition each 36 seconds and it doesn't stop doing that, > > > even if there are no more Writes from the exterior. this keeps the > > > drive busy with varying consequences. more about that later. > > > > Should be fixed in 2.6.37 by the commit: > > > > 1a387d3 xfs: dummy transactions should not dirty VFS state > > nice that someone else was also keen on having this bug fixed, but this particular fix is already present in 2.6.36 [1], [2] > > unfortunately something is still written to the log every 36s, as per the first mail in this thread. Turn on the XFS tracing so we can see what is being written every 36s. When the problem shows up: # echo 1 > /sys/kernel/debug/tracing/events/xfs/enable # sleep 100 # cat /sys/kernel/debug/tracing/trace > trace.out # echo 0 > /sys/kernel/debug/tracing/events/xfs/enable And post the trace.out file for us to look at. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0++WWN+30+fromorbit.com=david@internode.on.net Mon Dec 27 08:12:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBRECDfE022858 for ; Mon, 27 Dec 2010 08:12:13 -0600 X-ASG-Debug-ID: 1293459250-2acc01760000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0A48C22165F; Mon, 27 Dec 2010 06:14:11 -0800 (PST) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id wRyEHaHC7J0GK4YA; Mon, 27 Dec 2010 06:14:11 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51644094-1927428 for multiple; Tue, 28 Dec 2010 00:44:00 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PXDpm-0003vz-1d; Tue, 28 Dec 2010 01:13:58 +1100 Date: Tue, 28 Dec 2010 01:13:57 +1100 From: Dave Chinner To: Jesper Juhl Cc: xfs@oss.sgi.com, xfs-masters@oss.sgi.com, linux-kernel@vger.kernel.org, Alex Elder X-ASG-Orig-Subj: Re: [PATCH] XFS: Compare, don't assign in ASSERT() in xfs_trans_unreserve_and_mod_sb() Subject: Re: [PATCH] XFS: Compare, don't assign in ASSERT() in xfs_trans_unreserve_and_mod_sb() Message-ID: <20101227141357.GC24828@dastard> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1293459253 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0001 1.0000 -2.0203 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50648 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, Dec 25, 2010 at 09:14:53PM +0100, Jesper Juhl wrote: > Hi, > > In fs/xfs/xfs_trans.c::xfs_trans_unreserve_and_mod_sb() at the out: label > we have this: > ASSERT(error = 0); > I believe a comparison was intended, not an assignment. If I'm right, the > patch below fixes that up. Already fixed in this patch pending for 2.6.38: http://git.kernel.org/?p=linux/kernel/git/dgc/xfsdev.git;a=commitdiff;h=831ef3cf682a1f9d8fc7c16dace55137751c0410 Cheers, Dave. -- Dave Chinner david@fromorbit.com From aelder@sgi.com Mon Dec 27 08:56:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBREu1VU024498 for ; Mon, 27 Dec 2010 08:56:01 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay1.corp.sgi.com (Postfix) with ESMTP id C77918F8074; Mon, 27 Dec 2010 06:58:00 -0800 (PST) Received: from [127.0.0.1] ([198.149.20.12]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Mon, 27 Dec 2010 08:57:36 -0600 Subject: Re: [PATCH 06/34] xfs: dynamic speculative EOF preallocation From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1292916570-25015-7-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> <1292916570-25015-7-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Mon, 27 Dec 2010 08:57:36 -0600 Message-ID: <1293461856.2192.36.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: quoted-printable X-OriginalArrivalTime: 27 Dec 2010 14:57:36.0709 (UTC) FILETIME=[663D9F50:01CBA5D6] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2010-12-21 at 18:29 +1100, Dave Chinner wrote: > From: Dave Chinner >=20 > Currently the size of the speculative preallocation during delayed > allocation is fixed by either the allocsize mount option of a > default size. We are seeing a lot of cases where we need to > recommend using the allocsize mount option to prevent fragmentation > when buffered writes land in the same AG. This looks good. Logarithmic reduction in the size as the file system gets close to full seems like a reasonable heuristic. I have a few minor comments below, which you can address at your option. In any case: Reviewed-by: Alex Elder >=20 > Rather than using a fixed preallocation size by default (up to 64k), > make it dynamic by basing it on the current inode size. That way the > EOF preallocation will increase as the file size increases. Hence > for streaming writes we are much more likely to get large > preallocations exactly when we need it to reduce fragementation. >=20 > For default settings, the size of the initial extents is determined > by the number of parallel writers and the amount of memory in the > machine. For 4GB RAM and 4 concurrent 32GB file writes: >=20 > EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET = TOTAL > 0: [0..1048575]: 1048672..2097247 0 (1048672..2097247) = 1048576 > 1: [1048576..2097151]: 5242976..6291551 0 (5242976..6291551) = 1048576 > 2: [2097152..4194303]: 12583008..14680159 0 (12583008..14680159) = 2097152 > 3: [4194304..8388607]: 25165920..29360223 0 (25165920..29360223) = 4194304 > 4: [8388608..16777215]: 58720352..67108959 0 (58720352..67108959) = 8388608 > 5: [16777216..33554423]: 117440584..134217791 0 (117440584..134217791= ) 16777208 > 6: [33554424..50331511]: 184549056..201326143 0 (184549056..201326143= ) 16777088 > 7: [50331512..67108599]: 251657408..268434495 0 (251657408..268434495= ) 16777088 >=20 > and for 16 concurrent 16GB file writes: >=20 > EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET = TOTAL > 0: [0..262143]: 2490472..2752615 0 (2490472..2752615) = 262144 > 1: [262144..524287]: 6291560..6553703 0 (6291560..6553703) = 262144 > 2: [524288..1048575]: 13631592..14155879 0 (13631592..14155879) = 524288 > 3: [1048576..2097151]: 30408808..31457383 0 (30408808..31457383) = 1048576 > 4: [2097152..4194303]: 52428904..54526055 0 (52428904..54526055) = 2097152 > 5: [4194304..8388607]: 104857704..109052007 0 (104857704..109052007= ) 4194304 > 6: [8388608..16777215]: 209715304..218103911 0 (209715304..218103911= ) 8388608 > 7: [16777216..33554423]: 452984848..469762055 0 (452984848..469762055= ) 16777208 >=20 > Because it is hard to take back specualtive preallocation, cases > where there are large slow growing log files on a nearly full > filesystem may cause premature ENOSPC. Hence as the filesystem nears > full, the maximum dynamic prealloc size =D1=96s reduced according to this > table (based on 4k block size): >=20 > freespace max prealloc size > >5% full extent (8GB) > 4-5% 2GB (8GB >> 2) > 3-4% 1GB (8GB >> 3) > 2-3% 512MB (8GB >> 4) > 1-2% 256MB (8GB >> 5) > <1% 128MB (8GB >> 6) On really small filesystems this might be excessive. On the other hand, you're already basing the size on the file size so that should limit things just fine. > This should reduce the amount of space held in speculative > preallocation for such cases. >=20 > The allocsize mount option turns off the dynamic behaviour and fixes > the prealloc size to whatever the mount option specifies. i.e. the > behaviour is unchanged. >=20 > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_fsops.c | 1 + > fs/xfs/xfs_iomap.c | 84 +++++++++++++++++++++++++++++++++++++++++++++-= ----- > fs/xfs/xfs_mount.c | 21 +++++++++++++ > fs/xfs/xfs_mount.h | 14 ++++++++ > 4 files changed, 110 insertions(+), 10 deletions(-) >=20 > diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c > index be34ff2..6d17206 100644 > --- a/fs/xfs/xfs_fsops.c > +++ b/fs/xfs/xfs_fsops.c > @@ -374,6 +374,7 @@ xfs_growfs_data_private( > mp->m_maxicount =3D icount << mp->m_sb.sb_inopblog; > } else > mp->m_maxicount =3D 0; > + xfs_set_low_space_thresholds(mp); > =20 > /* update secondary superblocks. */ > for (agno =3D 1; agno < nagcount; agno++) { > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index 22b62a1..f36d2c8 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -267,6 +267,9 @@ error_out: > * If the caller is doing a write at the end of the file, then extend th= e > * allocation out to the file system's write iosize. We clean up any ex= tra > * space left over when the file is closed in xfs_inactive(). > + * > + * If we find we already have delalloc preallocation beyond EOF, don't d= o more > + * preallocation as it it not needed. > */ > STATIC int > xfs_iomap_eof_want_preallocate( > @@ -282,6 +285,7 @@ xfs_iomap_eof_want_preallocate( > xfs_filblks_t count_fsb; > xfs_fsblock_t firstblock; > int n, error, imaps; > + int found_delalloc =3D 0; > =20 > *prealloc =3D 0; > if ((offset + count) <=3D ip->i_size) > @@ -306,12 +310,60 @@ xfs_iomap_eof_want_preallocate( > return 0; > start_fsb +=3D imap[n].br_blockcount; > count_fsb -=3D imap[n].br_blockcount; > + > + if (imap[n].br_startblock =3D=3D DELAYSTARTBLOCK) > + found_delalloc =3D 1; > } > } > - *prealloc =3D 1; > + if (!found_delalloc) > + *prealloc =3D 1; Isn't this a separate change, possibly worthy of its own commit? > return 0; > } > =20 > +/* > + * If we don't have a user specified preallocation size, dynamically inc= rease > + * the preallocation size as the size of the file grows. Cap the maximum= size > + * at a single extent or less if the filesystem is near full. The closer= the > + * filesystem is to full, the smaller the maximum prealocation. > + */ > +STATIC xfs_fsblock_t > +xfs_iomap_prealloc_size( > + struct xfs_mount *mp, > + struct xfs_inode *ip) > +{ > + xfs_fsblock_t alloc_blocks =3D 0; > + > + if (!(mp->m_flags & XFS_MOUNT_DFLT_IOSIZE)) { > + int shift =3D 0; > + int64_t freesp; > + > + alloc_blocks =3D XFS_B_TO_FSB(mp, ip->i_size); Why not i_size_read()? Only matters for 32-bit, but you're using do_div() below so you do seem to care about it sometimes. > + alloc_blocks =3D XFS_FILEOFF_MIN(MAXEXTLEN, > + rounddown_pow_of_two(alloc_blocks)); > + > + freesp =3D percpu_counter_read_positive( > + &mp->m_icsb[XFS_ICSB_FDBLOCKS]); > + if (freesp < mp->m_low_space[XFS_LOWSP_5_PCNT]) { > + shift =3D 2; > + if (freesp < mp->m_low_space[XFS_LOWSP_4_PCNT]) > + shift++; > + if (freesp < mp->m_low_space[XFS_LOWSP_3_PCNT]) > + shift++; > + if (freesp < mp->m_low_space[XFS_LOWSP_2_PCNT]) > + shift++; > + if (freesp < mp->m_low_space[XFS_LOWSP_1_PCNT]) > + shift++; > + } > + if (shift) > + alloc_blocks >>=3D shift; > + } > + > + if (alloc_blocks < mp->m_writeio_blocks) > + alloc_blocks =3D mp->m_writeio_blocks; > + > + return alloc_blocks; > +} > + > int > xfs_iomap_write_delay( > xfs_inode_t *ip, > @@ -344,6 +396,7 @@ xfs_iomap_write_delay( > extsz =3D xfs_get_extsz_hint(ip); > offset_fsb =3D XFS_B_TO_FSBT(mp, offset); > =20 > + Extra blank line. > error =3D xfs_iomap_eof_want_preallocate(mp, ip, offset, count, > imap, XFS_WRITE_IMAPS, &prealloc); > if (error) > @@ -351,9 +404,11 @@ xfs_iomap_write_delay( > =20 > retry: > if (prealloc) { > + xfs_fsblock_t alloc_blocks =3D xfs_iomap_prealloc_size(mp, ip); > + > aligned_offset =3D XFS_WRITEIO_ALIGN(mp, (offset + count - 1)); > ioalign =3D XFS_B_TO_FSBT(mp, aligned_offset); > - last_fsb =3D ioalign + mp->m_writeio_blocks; > + last_fsb =3D ioalign + alloc_blocks; > } else { > last_fsb =3D XFS_B_TO_FSB(mp, ((xfs_ufsize_t)(offset + count))); > } > @@ -371,22 +426,31 @@ retry: > XFS_BMAPI_DELAY | XFS_BMAPI_WRITE | > XFS_BMAPI_ENTIRE, &firstblock, 1, imap, > &nimaps, NULL); > - if (error && (error !=3D ENOSPC)) > + switch (error) { > + case 0: > + case ENOSPC: > + case EDQUOT: > + break; This (above and below, in this hunk) is also a separate change, possibly worthy of its own small commit. > + default: > return XFS_ERROR(error); > + } > =20 > /* > - * If bmapi returned us nothing, and if we didn't get back EDQUOT, > - * then we must have run out of space - flush all other inodes with > - * delalloc blocks and retry without EOF preallocation. > + * If bmapi returned us nothing, we got either ENOSPC or EDQUOT. For > + * ENOSPC, * flush all other inodes with delalloc blocks to free up > + * some of the excess reserved metadata space. For both cases, retry > + * without EOF preallocation. > */ > if (nimaps =3D=3D 0) { > trace_xfs_delalloc_enospc(ip, offset, count); > if (flushed) > - return XFS_ERROR(ENOSPC); > + return XFS_ERROR(error ? error : ENOSPC); > =20 > - xfs_iunlock(ip, XFS_ILOCK_EXCL); > - xfs_flush_inodes(ip); > - xfs_ilock(ip, XFS_ILOCK_EXCL); > + if (error =3D=3D ENOSPC) { > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + xfs_flush_inodes(ip); > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + } > =20 > flushed =3D 1; > error =3D 0; > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index d5710232..f1b094d 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -1101,6 +1101,24 @@ xfs_set_rw_sizes(xfs_mount_t *mp) > } > =20 > /* > + * precalculate the low space thresholds for dynamic speculative preallo= cation. > + */ > +void > +xfs_set_low_space_thresholds( > + struct xfs_mount *mp) > +{ > + int i; > + > + for (i =3D 0; i < XFS_LOWSP_MAX; i++) { > + __uint64_t space =3D mp->m_sb.sb_dblocks; > + > + do_div(space, 100); How about computing this once, outside the loop? > + mp->m_low_space[i] =3D space * (i + 1); > + } > +} > + > + > +/* > * Set whether we're using inode alignment. > */ > STATIC void > @@ -1322,6 +1340,9 @@ xfs_mountfs( > */ > xfs_set_rw_sizes(mp); > =20 > + /* set the low space thresholds for dynamic preallocation */ > + xfs_set_low_space_thresholds(mp); > + > /* > * Set the inode cluster size. > * This may still be overridden by the file system > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > index 03ad25c6..7b42e04 100644 > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -75,6 +75,16 @@ enum { > XFS_ICSB_MAX, > }; > =20 > +/* dynamic preallocation free space thresholds, 5% down to 1% */ > +enum { > + XFS_LOWSP_1_PCNT =3D 0, Why not make 1% be 1, 2% be 2, etc.? > + XFS_LOWSP_2_PCNT, > + XFS_LOWSP_3_PCNT, > + XFS_LOWSP_4_PCNT, > + XFS_LOWSP_5_PCNT, > + XFS_LOWSP_MAX, > +}; > + > typedef struct xfs_mount { > struct super_block *m_super; > xfs_tid_t m_tid; /* next unused tid for fs */ > @@ -169,6 +179,8 @@ typedef struct xfs_mount { > on the next remount,rw */ > struct shrinker m_inode_shrink; /* inode reclaim shrinker */ > struct percpu_counter m_icsb[XFS_ICSB_MAX]; > + int64_t m_low_space[XFS_LOWSP_MAX]; > + /* low free space thresholds */ > } xfs_mount_t; > =20 > /* > @@ -333,6 +345,8 @@ extern void xfs_icsb_sync_counters(struct xfs_mount *= ); > extern int xfs_icsb_modify_inodes(struct xfs_mount *, int, int64_t); > extern int xfs_icsb_modify_free_blocks(struct xfs_mount *, int64_t, int)= ; > =20 > +extern void xfs_set_low_space_thresholds(struct xfs_mount *); > + > #endif /* __KERNEL__ */ > =20 > extern void xfs_mod_sb(struct xfs_trans *, __int64_t); From aelder@sgi.com Mon Dec 27 08:59:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBREx6ag024619 for ; Mon, 27 Dec 2010 08:59:06 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay2.corp.sgi.com (Postfix) with ESMTP id 26BEB30406B; Mon, 27 Dec 2010 07:01:06 -0800 (PST) Received: from [127.0.0.1] ([198.149.20.12]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Mon, 27 Dec 2010 09:00:56 -0600 Subject: Re: [PATCH 06/34] xfs: dynamic speculative EOF preallocation From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1292916570-25015-7-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> <1292916570-25015-7-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Mon, 27 Dec 2010 09:00:56 -0600 Message-ID: <1293462056.3851.1.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: quoted-printable X-OriginalArrivalTime: 27 Dec 2010 15:00:56.0586 (UTC) FILETIME=[DD606EA0:01CBA5D6] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2010-12-21 at 18:29 +1100, Dave Chinner wrote:=20 > From: Dave Chinner >=20 > Currently the size of the speculative preallocation during delayed > allocation is fixed by either the allocsize mount option of a > default size. We are seeing a lot of cases where we need to > recommend using the allocsize mount option to prevent fragmentation > when buffered writes land in the same AG. This looks good. Logarithmic reduction in the size as the file system gets close to full seems like a reasonable heuristic. A few more minor comments below, which you can address at your option. In any case: Reviewed-by: Alex Elder >=20 > Rather than using a fixed preallocation size by default (up to 64k), > make it dynamic by basing it on the current inode size. That way the > EOF preallocation will increase as the file size increases. Hence > for streaming writes we are much more likely to get large > preallocations exactly when we need it to reduce fragementation. >=20 > For default settings, the size of the initial extents is determined > by the number of parallel writers and the amount of memory in the > machine. For 4GB RAM and 4 concurrent 32GB file writes: >=20 > EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET = TOTAL > 0: [0..1048575]: 1048672..2097247 0 (1048672..2097247) = 1048576 > 1: [1048576..2097151]: 5242976..6291551 0 (5242976..6291551) = 1048576 > 2: [2097152..4194303]: 12583008..14680159 0 (12583008..14680159) = 2097152 > 3: [4194304..8388607]: 25165920..29360223 0 (25165920..29360223) = 4194304 > 4: [8388608..16777215]: 58720352..67108959 0 (58720352..67108959) = 8388608 > 5: [16777216..33554423]: 117440584..134217791 0 (117440584..134217791= ) 16777208 > 6: [33554424..50331511]: 184549056..201326143 0 (184549056..201326143= ) 16777088 > 7: [50331512..67108599]: 251657408..268434495 0 (251657408..268434495= ) 16777088 >=20 > and for 16 concurrent 16GB file writes: >=20 > EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET = TOTAL > 0: [0..262143]: 2490472..2752615 0 (2490472..2752615) = 262144 > 1: [262144..524287]: 6291560..6553703 0 (6291560..6553703) = 262144 > 2: [524288..1048575]: 13631592..14155879 0 (13631592..14155879) = 524288 > 3: [1048576..2097151]: 30408808..31457383 0 (30408808..31457383) = 1048576 > 4: [2097152..4194303]: 52428904..54526055 0 (52428904..54526055) = 2097152 > 5: [4194304..8388607]: 104857704..109052007 0 (104857704..109052007= ) 4194304 > 6: [8388608..16777215]: 209715304..218103911 0 (209715304..218103911= ) 8388608 > 7: [16777216..33554423]: 452984848..469762055 0 (452984848..469762055= ) 16777208 >=20 > Because it is hard to take back specualtive preallocation, cases > where there are large slow growing log files on a nearly full > filesystem may cause premature ENOSPC. Hence as the filesystem nears > full, the maximum dynamic prealloc size =D1=96s reduced according to this > table (based on 4k block size): >=20 > freespace max prealloc size > >5% full extent (8GB) > 4-5% 2GB (8GB >> 2) > 3-4% 1GB (8GB >> 3) > 2-3% 512MB (8GB >> 4) > 1-2% 256MB (8GB >> 5) > <1% 128MB (8GB >> 6) On really small filesystems this might be excessive. On the other hand, you're already basing the size on the file size so that should limit things just fine. > This should reduce the amount of space held in speculative > preallocation for such cases. >=20 > The allocsize mount option turns off the dynamic behaviour and fixes > the prealloc size to whatever the mount option specifies. i.e. the > behaviour is unchanged. >=20 > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_fsops.c | 1 + > fs/xfs/xfs_iomap.c | 84 +++++++++++++++++++++++++++++++++++++++++++++-= ----- > fs/xfs/xfs_mount.c | 21 +++++++++++++ > fs/xfs/xfs_mount.h | 14 ++++++++ > 4 files changed, 110 insertions(+), 10 deletions(-) >=20 > diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c > index be34ff2..6d17206 100644 > --- a/fs/xfs/xfs_fsops.c > +++ b/fs/xfs/xfs_fsops.c > @@ -374,6 +374,7 @@ xfs_growfs_data_private( > mp->m_maxicount =3D icount << mp->m_sb.sb_inopblog; > } else > mp->m_maxicount =3D 0; > + xfs_set_low_space_thresholds(mp); > =20 > /* update secondary superblocks. */ > for (agno =3D 1; agno < nagcount; agno++) { > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index 22b62a1..f36d2c8 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -267,6 +267,9 @@ error_out: > * If the caller is doing a write at the end of the file, then extend th= e > * allocation out to the file system's write iosize. We clean up any ex= tra > * space left over when the file is closed in xfs_inactive(). > + * > + * If we find we already have delalloc preallocation beyond EOF, don't d= o more > + * preallocation as it it not needed. > */ > STATIC int > xfs_iomap_eof_want_preallocate( > @@ -282,6 +285,7 @@ xfs_iomap_eof_want_preallocate( > xfs_filblks_t count_fsb; > xfs_fsblock_t firstblock; > int n, error, imaps; > + int found_delalloc =3D 0; > =20 > *prealloc =3D 0; > if ((offset + count) <=3D ip->i_size) > @@ -306,12 +310,60 @@ xfs_iomap_eof_want_preallocate( > return 0; > start_fsb +=3D imap[n].br_blockcount; > count_fsb -=3D imap[n].br_blockcount; > + > + if (imap[n].br_startblock =3D=3D DELAYSTARTBLOCK) > + found_delalloc =3D 1; > } > } > - *prealloc =3D 1; > + if (!found_delalloc) > + *prealloc =3D 1; Isn't this a separate change, possibly worthy of its own commit? > return 0; > } > =20 > +/* > + * If we don't have a user specified preallocation size, dynamically inc= rease > + * the preallocation size as the size of the file grows. Cap the maximum= size > + * at a single extent or less if the filesystem is near full. The closer= the > + * filesystem is to full, the smaller the maximum prealocation. > + */ > +STATIC xfs_fsblock_t > +xfs_iomap_prealloc_size( > + struct xfs_mount *mp, > + struct xfs_inode *ip) > +{ > + xfs_fsblock_t alloc_blocks =3D 0; > + > + if (!(mp->m_flags & XFS_MOUNT_DFLT_IOSIZE)) { > + int shift =3D 0; > + int64_t freesp; > + > + alloc_blocks =3D XFS_B_TO_FSB(mp, ip->i_size); Why not i_size_read()? Only matters for 32-bit, but you're using do_div() below so you do seem to care about it sometimes. > + alloc_blocks =3D XFS_FILEOFF_MIN(MAXEXTLEN, > + rounddown_pow_of_two(alloc_blocks)); > + > + freesp =3D percpu_counter_read_positive( > + &mp->m_icsb[XFS_ICSB_FDBLOCKS]); > + if (freesp < mp->m_low_space[XFS_LOWSP_5_PCNT]) { > + shift =3D 2; > + if (freesp < mp->m_low_space[XFS_LOWSP_4_PCNT]) > + shift++; > + if (freesp < mp->m_low_space[XFS_LOWSP_3_PCNT]) > + shift++; > + if (freesp < mp->m_low_space[XFS_LOWSP_2_PCNT]) > + shift++; > + if (freesp < mp->m_low_space[XFS_LOWSP_1_PCNT]) > + shift++; > + } > + if (shift) > + alloc_blocks >>=3D shift; > + } > + > + if (alloc_blocks < mp->m_writeio_blocks) > + alloc_blocks =3D mp->m_writeio_blocks; > + > + return alloc_blocks; > +} > + > int > xfs_iomap_write_delay( > xfs_inode_t *ip, > @@ -344,6 +396,7 @@ xfs_iomap_write_delay( > extsz =3D xfs_get_extsz_hint(ip); > offset_fsb =3D XFS_B_TO_FSBT(mp, offset); > =20 > + Extra blank line. > error =3D xfs_iomap_eof_want_preallocate(mp, ip, offset, count, > imap, XFS_WRITE_IMAPS, &prealloc); > if (error) > @@ -351,9 +404,11 @@ xfs_iomap_write_delay( > =20 > retry: > if (prealloc) { > + xfs_fsblock_t alloc_blocks =3D xfs_iomap_prealloc_size(mp, ip); > + > aligned_offset =3D XFS_WRITEIO_ALIGN(mp, (offset + count - 1)); > ioalign =3D XFS_B_TO_FSBT(mp, aligned_offset); > - last_fsb =3D ioalign + mp->m_writeio_blocks; > + last_fsb =3D ioalign + alloc_blocks; > } else { > last_fsb =3D XFS_B_TO_FSB(mp, ((xfs_ufsize_t)(offset + count))); > } > @@ -371,22 +426,31 @@ retry: > XFS_BMAPI_DELAY | XFS_BMAPI_WRITE | > XFS_BMAPI_ENTIRE, &firstblock, 1, imap, > &nimaps, NULL); > - if (error && (error !=3D ENOSPC)) > + switch (error) { > + case 0: > + case ENOSPC: > + case EDQUOT: > + break; This (above and below, in this hunk) is also a separate change, possibly worthy of its own small commit. > + default: > return XFS_ERROR(error); > + } > =20 > /* > - * If bmapi returned us nothing, and if we didn't get back EDQUOT, > - * then we must have run out of space - flush all other inodes with > - * delalloc blocks and retry without EOF preallocation. > + * If bmapi returned us nothing, we got either ENOSPC or EDQUOT. For > + * ENOSPC, * flush all other inodes with delalloc blocks to free up > + * some of the excess reserved metadata space. For both cases, retry > + * without EOF preallocation. > */ > if (nimaps =3D=3D 0) { > trace_xfs_delalloc_enospc(ip, offset, count); > if (flushed) > - return XFS_ERROR(ENOSPC); > + return XFS_ERROR(error ? error : ENOSPC); > =20 > - xfs_iunlock(ip, XFS_ILOCK_EXCL); > - xfs_flush_inodes(ip); > - xfs_ilock(ip, XFS_ILOCK_EXCL); > + if (error =3D=3D ENOSPC) { > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + xfs_flush_inodes(ip); > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + } > =20 > flushed =3D 1; > error =3D 0; > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index d5710232..f1b094d 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -1101,6 +1101,24 @@ xfs_set_rw_sizes(xfs_mount_t *mp) > } > =20 > /* > + * precalculate the low space thresholds for dynamic speculative preallo= cation. > + */ > +void > +xfs_set_low_space_thresholds( > + struct xfs_mount *mp) > +{ > + int i; > + > + for (i =3D 0; i < XFS_LOWSP_MAX; i++) { > + __uint64_t space =3D mp->m_sb.sb_dblocks; > + > + do_div(space, 100); How about computing this once, outside the loop? > + mp->m_low_space[i] =3D space * (i + 1); > + } > +} > + > + > +/* > * Set whether we're using inode alignment. > */ > STATIC void > @@ -1322,6 +1340,9 @@ xfs_mountfs( > */ > xfs_set_rw_sizes(mp); > =20 > + /* set the low space thresholds for dynamic preallocation */ > + xfs_set_low_space_thresholds(mp); > + > /* > * Set the inode cluster size. > * This may still be overridden by the file system > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > index 03ad25c6..7b42e04 100644 > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -75,6 +75,16 @@ enum { > XFS_ICSB_MAX, > }; > =20 > +/* dynamic preallocation free space thresholds, 5% down to 1% */ > +enum { > + XFS_LOWSP_1_PCNT =3D 0, Why not make 1% be 1, 2% be 2, etc.? > + XFS_LOWSP_2_PCNT, > + XFS_LOWSP_3_PCNT, > + XFS_LOWSP_4_PCNT, > + XFS_LOWSP_5_PCNT, > + XFS_LOWSP_MAX, > +}; > + > typedef struct xfs_mount { > struct super_block *m_super; > xfs_tid_t m_tid; /* next unused tid for fs */ > @@ -169,6 +179,8 @@ typedef struct xfs_mount { > on the next remount,rw */ > struct shrinker m_inode_shrink; /* inode reclaim shrinker */ > struct percpu_counter m_icsb[XFS_ICSB_MAX]; > + int64_t m_low_space[XFS_LOWSP_MAX]; > + /* low free space thresholds */ > } xfs_mount_t; > =20 > /* > @@ -333,6 +345,8 @@ extern void xfs_icsb_sync_counters(struct xfs_mount *= ); > extern int xfs_icsb_modify_inodes(struct xfs_mount *, int, int64_t); > extern int xfs_icsb_modify_free_blocks(struct xfs_mount *, int64_t, int)= ; > =20 > +extern void xfs_set_low_space_thresholds(struct xfs_mount *); > + > #endif /* __KERNEL__ */ > =20 > extern void xfs_mod_sb(struct xfs_trans *, __int64_t); From petre.rodan@simplex.ro Mon Dec 27 11:16:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_53 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBRHGM0f031303 for ; Mon, 27 Dec 2010 11:16:22 -0600 X-ASG-Debug-ID: 1293470300-4ff101770000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from passage.avira.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 83F271DBB078 for ; Mon, 27 Dec 2010 09:18:21 -0800 (PST) Received: from passage.avira.com (passage.avira.com [89.238.222.20]) by cuda.sgi.com with ESMTP id SnMunOQVWWwWyAmY for ; Mon, 27 Dec 2010 09:18:21 -0800 (PST) Received: by passage.avira.com (Postfix/AVIRA, from userid 26) id 80A7F124A09; Mon, 27 Dec 2010 19:18:19 +0200 (EET) Received: from localhost (localhost [127.0.0.1]) by passage.avira.com (Postfix/AVIRA) with ESMTP id 2313D124A07 for ; Mon, 27 Dec 2010 19:18:19 +0200 (EET) Received: from passage.avira.com (localhost [127.0.0.1]) by localhost (AvMailGate-2.1.3-2) id 22509-50Nj7l; Mon, 27 Dec 2010 19:18:18 +0200 (EET) Received: from naliboat.bu.avira.com (dasapass.avira.com [89.238.222.18]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "mail.bu.avira.com", Issuer "Avira Intermediate Certificate Authority 2010-2020" (not verified)) by passage.avira.com (Postfix/AVIRA) with ESMTPS id CC428124A08 for ; Mon, 27 Dec 2010 19:18:18 +0200 (EET) Received: (qmail 4919 invoked from network); 27 Dec 2010 17:18:18 -0000 Received: from unknown (HELO pandora.simplex.ro) (prodan@10.7.0.16) by naliboat.bu.avira.com with ESMTPA; 27 Dec 2010 17:18:18 -0000 Date: Mon, 27 Dec 2010 19:19:39 +0200 From: Petre Rodan To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfssyncd and disk spin down Subject: Re: xfssyncd and disk spin down Message-ID: <20101227171939.GA7759@pandora.simplex.ro> References: <20101223165532.GA23813@peter.simplex.ro> <20101227021904.GA24828@dastard> <20101227061629.GA2275@pandora.simplex.ro> <20101227140750.GB24828@dastard> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="b5gNqxB1S1yM7hjW" Content-Disposition: inline In-Reply-To: <20101227140750.GB24828@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-AntiVirus: checked by AntiVir MailGate (version: 2.1.3-2; AVE: 7.9.4.128; VDF: 7.11.0.201; host: passage.avira.com) X-Barracuda-Connect: passage.avira.com[89.238.222.20] X-Barracuda-Start-Time: 1293470302 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50660 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --b5gNqxB1S1yM7hjW Content-Type: multipart/mixed; boundary="G4iJoqBmSsgzjUCe" Content-Disposition: inline --G4iJoqBmSsgzjUCe Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hello Dave, On Tue, Dec 28, 2010 at 01:07:50AM +1100, Dave Chinner wrote: > Turn on the XFS tracing so we can see what is being written every > 36s. When the problem shows up: >=20 > # echo 1 > /sys/kernel/debug/tracing/events/xfs/enable > # sleep 100 > # cat /sys/kernel/debug/tracing/trace > trace.out > # echo 0 > /sys/kernel/debug/tracing/events/xfs/enable >=20 > And post the trace.out file for us to look at. attached. you can disregard all the lvm partitions ('dev 254:.*') since they are on a= different drive, probably only 8:17 is of interest. bye, peter --G4iJoqBmSsgzjUCe Content-Type: application/x-bzip2 Content-Disposition: attachment; filename="trace.out.bz2" Content-Transfer-Encoding: base64 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 2SeFVf1yVcJOAXIiZETKq4CgwUw2WwyWwwWwcmJBNEuaU3KU3KU3KblzNCjkMFsMFsMFsKY4 DA2YLYUWwwWMMFsC22mmOFZQYDBTCy2GC2FMdTa36aa0yogvrypttUG5NWSlsLZKaX82VN42 SK9UsKb536+gAAA97Xk1rzXJa9S5FU3LermSxbQslvJwxLcLXACoUgJP7NlQ/Pv+P4rdfq/3 WPyY+fxw+tysfJ+fcxr5uaN+/RRyIkgqXIQJCSSM/w7KTcymAgYxQMAQRBBZZowRtNoyLaka sDG0Rm+X5cub53nqne8qqsECiqJBkKKaGJELsq4JFFkq1WzbLWzaxGmq1NJSVmJWMKS3sWEy El489+3f08+l/XxV38fGX13nZuS3x8T5vnbdqvnnnp+1UzO713d++u2pczvbt+eZW7vvvnbv vedydW09yq5fnp+1UzO713d++xVe++Xar5556ftVMzu9d3fvs/7ERERfol+zJkyZMm5NcmTJ kyZMmTJkyZMm5cuZMm5NyZMlJk3Jks3LmTclJuTJv1VeaNtlNZNGmq00aTRo0aNGjRo0aNGj Ro0aTRo0aNGjRpkzJmEpc0rMmFGGUxgpMRHhKymNUtTKopmqrMpm22uK2tW5NLlLiIiIiIic q+dAAAAAADm7a/b1pzW0u2tlZV5eXbtZ9GPhAyaDyaD/Ypf338/fP4x/Umvo3V73OXdA2ZsM 2Zm2mqU3LpT683PRxM59TndczYNTA4ax/bp3/XlnkFUu8b/pjIZYjqD+7pPh97/XMV2qhCFK sgrFiIiQhCAkRhopaWRZBESKsVYXKEUhTVYi1BRtVYQy0GaZWVZsrnRzvObnLq1s2ittTSSg CwSKhdy0VLVRq6QaqlSP0UfgrBYYsoDbY4xjjbTM2tYiZtrstUlupc7yO7iiZq12bW2iMVV+ q/TJMplMplESSTKZTKZREkkymUymURJJJMplMimV/01zkXNXLlzXOXOXJJlLDLDMZjQ2dszP bfTpSs+6PiuHmOgy4+PuzLb1rfzM79GtMx2PrtL3ehe5t7JJF2NCsIIpA6xCBRUiVKJKKztd YxjBoxjGDRjGMGjGMYMaMYwdrhysSmFHvYMYqmMGYl52Z4LTWMaH+FcIl1k/wrm6nNaZjHSY utsLcWITEmJO1VbpNxOVwuVtcLhf0vV2vxf0uBcLhcLhcLpdC9Xq9XCJxEwuFwuFyuO/8MOk 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 gxWMyjGMhddryZhzeZuhnxZPJdcccb8B083gdnlP0e52q97mSPYZ3p297JMJhoD7+3x13YrI qqqmma1ZJFVUNd12wIUzwzwzcwzMPMsmEPPiSSSSTvNVVVVV0NjBjOSjeSZkpEqrDGZRjJM0 iVV5rstbLWy1stbLWws4AQuq0AgBWBNibpOSSOGC3LSOyOcDEDBgyGTBQwKj6rqMgSMjEaJA 04gIiDwz12Tiqqqp7GemSSqqq56DIXxfUtanxzDDumB1mEspgVhlaGFZmVpmVgUKa7Q343dM 1spQDoA2ORwNqKng2Pnskkkkms5qlVVVXplMhnrb5LWy1stbLWy1uNkMELMFFFFkLKIOAjQi Rw4aNGjaJiTY0ZG8y0lYb29qampsKxK2mpk0MaaxMYa3zMU4wDGJWIQu0kGRLvFUFhSYpFJh MAbDOGeck1VVVU+DOMklVVVxM8M8MoZhh4ZTPPUkkkknecVVVVV6ZTIZ5t8lrZa2WtlrZa2c M82Tiqqqp6M4ySVVVXJ9z7f2vt/aZ9362/3v7Zkz/CpV7NDrInfVTbxndNK27zOy7bKOy3mR 4mHeTrW25Wu7maunZnN5ndm7jtKZrDcGSando3DW6e6bt822+t86NGqLybDvLmz1R5OaNlUZ trUqx8uIvNvHlt91bwrNketuPeO2eNU/8f7su2h9VZ8HUuPqnxi40ZXWXzow6ed6028u8yWN 3N4xce3NfPnygRm6sys7U6o6erapbjTt11LHMfZyTpzVVCY+lsUw6mc5Z67fa8rLunt4428O R1bttu7x9dsvBSola0t14+ww7LfO3VdUusuZvdu5VU9cJaJSoVXRVx7rUWQ5fN7S3j3IJdmO u7a0qm7yNpnunAzMcfdbj58d3M3dx63WNLOmF2qdXfJ9FMpjry8VPbbbeW3Qrdead23t1U0v VjZgxF61pRhFdTymWVXXzeOsdlTLjuus6e3dbfXxl2W77d15zdcpXcddzo8bbeuGRt9XJ5j5 11Y9Nx5fS6b2zVtu+vLbbfW3ThsqaazKht1XY705jm4rsnFGydtx5iN06OzehCo2jQmKdZZV 63eGU60nM87ebdRTBBxRztfbVMihvdzb6+x26ZqnTdMlK7ra3LvZj3qqnpXG5SxTXvWFuc3H beU4rpuOvSsbUzMdVXbzqLciq2c7beOnmR075LMqJWYK6bmcCaNXrvapkUN4IUcCnPMqmXQW 8umum22zZPYq14LDpXp8aebae7XHe7ODaQxVT511y+6pheTKeQvvOqSJ7epxhJdblFSj2cbN Vyusdc8uPTJNBKSrO4OG71h872LObfG9fR7za3h3ddXvZl3Z27T59e8ai4tc+rHlddtDdrX0 qqj7tPamaKfS918aLLqilU5t926GVunrw53RxhZsvTe2uq8vctKdW83XTt2NY713azNXJK5U kSonW27bx5gdK63G2cm7vbrtnq05zjw4Fz2RIqW6OzhDMbNXrxGzlou+NhXWZaybMsFadvTq cWZNvszjhXFXt1zwjDu1yrZsEEDm1j6Prm3uqkgYNxzbE61qczWquI3lOzT1xy1tlZtCnVA1 2402+3mI95OZuSnmWNPLH0vKFq1hUhu+tdWWNuTfl05bxCWG0r33HEX9rMw+3C88KqOs09JF elb16s6Nlji1Z1cx2W+l2Ls9NvIJps3czI30KhnRhZlDjKb3rS01WXncxdSAi8XZk6dhsLXt y46dQ7coEayxxQl5Tu7UHTsHcVVcFjNVbC0Y51jXbrXS1PjFVYeeY+diapuGtJ3azMqngt09 Wqu3HVIY3HHbEmzELly6sla+uVjdaM4zYxBvRCuuXVkrXdytvszo6qLstuGoC7yqu+Jzn1Ss e3wPcavl1HL2pMwuklF11nLsVZdAVXIHdqjvPN7q3NvsTQpzcUmCh1JiltblZSUPGO1Hu5fc tHcetvdW0dqu3KzugKrBtBGnuzM687dGKtu19g6tfyDV5f2Wc+l1lmsL+29WBgt0hcLqr1sb BlTltYHyHJypt3fZgW12zSV3abDK4dpl7Bryju1itbalyO8ktYtjhVObt3Rs7alWV066vd6u OYmpe3SFC92dlGX2PufLcxyszeVN2RumkDdlx1KxWrl7mN7TprG61oTaB26m9MfVlCbbXbcN XmbyrnSI3evJtJR9euR26Mo2YyiTy5tJVTtmYYbZUe61xuy4wrTvmVuujMp1dCsNdOrE9d49 ttmWbOp1NUzaq91ZaEfbnLa2MxRB52Ptusa7dGpA0dW24Wd43K3O47Q667ucYWVhg12yarNr nu5L2csUyZ1725RM3bJNoJLEVXC5owFXNe11dls5NWF3l8wjF121sWzJmPm6TxaI1tbmRIYO Oyd2ICOxuoEVs29zo3W7wkGhU+mAkKRSszLdrcqg+5xvLDHdJzePae0MwdoVhMTQnjg2UxuL Equl9ozRTY4di3ChOTw2oLf2cEYROxWT027vOkR3eXWrxu1Yq956yiMpGiemdz2w4VfJctvF tcKyawiB000TkznWdId3dSxZZ3Fo3FTFYvZbNE5Nt0uLWVfJWtsVi0U855CiOBcJ6Z3XrDJz OxdHcy8q8jx1CgdBcJ3tx0uDOVfJNCbca7DZjody5yFeoI6TvbzrODm7upYhV08w6urI7ewo hdioldtus6RGr5K9tbkTHOuyMoiCzRK3KdXs5Vr5KlV3vRWG1j3OAsN0d3ltvcF1V3yWIUDa 0a+p207VYztnq7fp1hT55qr5dlbXxVcoM3tfQonAnCc7eebYc285JoSrTu3l0t19Yx9jyHSF yVHnNXVumZWnkqUveSrej3gzCP+jtqzz++QnV0RzPkrVJZiwZSx7ZXqCPE52c6yy5l5yVrL3 MTkie7hXqCcJzl1XjF9V5qWIU3LoPleVCvWE9J3t683hlVu6liFC2edkHtSYrO100OGWjZPT euZYS5vkqWYHbiRd4uEy9ytNWhyGpd2bc7icZXUqG0KWsryu1TLzrdLi0ZXJUqG3qqXa58yi YLy2X227XGlKfJdovceaOd07Z0hUlrve7HXWWjmYlS4adT2sd1sYddKOE7FmdsjezOu8oYbs d2Zxzl27W42hXJu3x4oU4Ya2xe5fUqas8NR17Q1jhMT7bzG3Hd7tNvtdZmN1Tt61FHHWZ3N9 fc+tKldX0kbtbUrcB29C3pCTlTly1HOIOo9VQ43C8ltzJZgzfW9bvDpoThbWDLsVpMNW8czl uSduRq1MvkDjuTGw+7ntDcru7depDMreR1GZLHLnzrsGbi43Wq9c0U9rvUEqfV3QLQ718y2k cNu87Obcd3ec+b7u7m28d3bUUcd3vc3193W1NykkVYm5Z0lvBtdmHiXm361NQui6bVw8b3lx 3M3nLybb56tjq+opZOy+VxuPC8rXkh6ZtGp3QXO2jT6Ks1Cqe8Wi3SV52J7K5QpA0YXV8nlt bucNPcTWVUSOVKdLpt1u1Ue6Oo0aLCW4VVLHk2q7O1qxddp9MzuY42osfR0U9u8E6YMOKjpw JdCtpa9jh29zYZQwzpKtXVpqpTpbM1dzhp1SOw7cqJJRTKXLLSusL0Qytl6rq0lUp0uvertr FfaNry7mH1dz5g5A0Wtqr2xWog2ghRXXR0LPdKpB52HOV915KLqEU0Je7psvLrhS7s15jhum xmdgkmhXFpeVVS+B4i6b7JWt0xcfdTcPcKva0EUJOwZrc6U25Yvld6u15puqvNp4xy7Lqt52 ZSL233531tqKKWRbCJokTVJWFf+oWVKo/5inqKf31UKf3V/Ql+bEVoqqP7pKVP2qqtP3/5iq qf/ykWv2QpTrSSsSVlMxVmVVkida6SlKf4VUKfwKFX8Sq+vSvDiv9FBoqSmdYDZWCVYrsKkj +xSP661tW1f55tq1WvpKxGJExImYxgjCYUTES4OYJMs1VGxRsUU2qWrVtIGS80KvN+6yxYZO xK2wmWSov9FK3lT3FVS2UjYqqNpdxUkbV6zSkcFf3Fble/+tSOqkYpHwKrVVCnalHeVRHuiF GlVOWikPSvUqqM5Ur1hSDzKq8VIvihVsZKojsoPPZKrpVdaZRYxEt8rxSWUpWvRKj0eKSyKT asFSR2Iu/lXjNhIr3pVZSX8CP+CmJNg3yRlMVMlgRgrGBGFXluTIZmEyZiYkUYpXzUHxFSR0 h6FVR6cTFVVYkrBRlJgwqMoYIwWEdPVtXwRLpW3iiXmV49K3Kqj2dPIqSnElKnCS+U7TZUbJ VcKR/1KFXvmFVeLyzOEK70AWlI8hklKnwKql6Ff1ehVUvbaiVHWvJSO6XUxJcVypF5qRtXQr +NECbFdaKOikaK+UITCuFIumv41qSSmFVRopHrPn/Z2c1lBXRQfbyHgkE2r50UdlR7f/B4qR /2Uj4ol6dEU995MMnvpSfIVJHWttuWtb8IkkSJiL9Gttr9dEuqQT4FSU2UreqIn8xSZNSUmT bWS2tkqkyUmtpMlbWTSaTVSZNVktZNtbbJpNJpNZK2k1tJSa22ymqTJttbJkrWS22S2TW1Sb VqSoxljKhjJEYypMZIr/0l+tYBkwmTEqxYrFlZMTE2rKlNZTWU0sqUpbStSmsprKaWVKVqU1 NU1Fs2lZqU2qbWayms2mqaGsU201FUa1lNBYYVkxTDCyplLAYpkVprS1GsaxrKs1izS1kyGV MgyphWGDMoypixZWYqZUpkFiYqTMGMI2baFRU2ypTZtopUmTBMsqwYYMqYphMUwm1ptTao20 amVqamZqmyzS2lLaU1KbZTZTZtaVTS2lbMtlMplLWUtmaZTNrNtNpVlNWbVNNsyKalNNtKU1 NlTTSlTSpWypUqaVNKlbKmm2zaZopmimbbRbNLLaUtpoqltKa0qjWK1GsaxrFajWNTaUaxrF WxrFLaaxrG1otRrRaNVFptpaLRqorRaNSVUmpLLaVLaUlLaaW0qTUm2pLJZLJbaTJkppkKsg gi2lCWsmTJktZMmTJjbRkyZMlrJkltNLaUi2lNtNJVhBBKxSG1kKQpCkNrIUhSFItpRtZCkK QpCjbQUhbIIJVhBBBKsIIJTRtppbSkW0o20tppCJqRY1LGYmZmRgysRP6vQ96VXRUeNVCn2K r5JLwKqjCvWVRHKkeZXCkX4qDiv6ER/Sp/VE/41ixYsWLESIkWLFixYsbTWmy2WzZs2bLZWz WmzZs2bNmtNqmtNmzZs2a1/e/LX+q3+EmyUIlFq5ttW21/BtZiSrERr+mSrVD8JTsgn9jZre Srsk6EndJpJok0k0k0SaSaqrSqtVVoVoK0K3CicV4Ku1D/e6q6ZVapguMkP9Wgro44cFVkyK vCRrcLfoNUyWKzLMYMGOQEYobJKtpS2EGEa5yVsLaVGKyQxZCrIg8mvLJkKxZUmLKMWKLCNo IxnfmI5Q1E1JVsg27VhhYYjqDul0pvAyGLGFYM4iePRy4UTfpZvtwarKYrAGVkZWWIliU4I0 Uq7n/iqrpI6ldlITP+nNayl6PClXZRbSVeH0NNG1tllYNaLBqqFsVYsJWLFi5wsMqxMLypu1 rbe61fvX+O/kiTKMUaSTX+TnNGM5zmiKX8+rd0ra/l+4PXOAAAAAAAAAAAAAB59fn58+l5/L n1+v5XdesagbgnIp/l7uHJKoo83/jIQklGoMxky/tTsqd/HUraXhNQ3J5KtJRu1vjX2gyshi 575Xayl721eb7f5fut+IAAAAAAAAAAAAAANrmu3k5O1rxxcOeQ32mnze91OjGOJ4VHVVra86 HoPPt5q/YiPe6zt40U3Ykq6XnWQzB5NGOZu+vdB9R/uUNkUI8ElWX1if4DzlElsP3C1SA6gi fSrv5tnaq+e+EPtXNToq4xNSNcWz5bIUOjItXq+l82fHXhxW/DPf8N3y3+7MYzM2dK2qNlJ0 n0nWdTsnMzJmTMnYdgo/c330aet+y9/vTY0bGrY1rZ5Wuym13XPJ4SmyyXdR36OvS9h2aofD 7L90YsGLFixYsXReDJ2dpT9/+hDsPmOY9PEnwfyE03mXFecJsTuOWp7RyT8FCfOXZRGa1IWK UFkQF7CVVilV969vuAAAAAAAAAAAAAAD876T9frdrw9fH/IeChPjx6Z0YxmZ4m/t8qV87myg Ojkm1z5yHp4pe+3eESaHpKZiCcyHRkhv6rnfRPAeJon26XHor3yiSykB/ETh9I7SnWVI+e6q J1eVKH6StPliU89K+aI+agUbIjFJwTdEbX/kkq44rILESwBkmBlYelDCRfErvTGUhLav1qyq WyU2VjWgSMLUStBLVWqGqWlpqLVYx+NVxdnf/iieChP0dElXMRR892Zl3syfT6ZmZmZkn2Of kKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq/e+vnZT0WuNazMzoDnCb4PzqILt vt8dfd2J2+3u8Na1rNazWta3j8h8CE+yJ+uq8qAetAylVYQZSoyqGUAwgwpMIMJ2lOe34b5W YxlU2tkxixGjRWbZW1gZKsyZlZ9mp5TaZPJ6cZHulP0eGir08Hs7JTjo90piXHa82sS3eFp4 4jhg9yHT4RdfO6ugXFXDTsT4F2z8wpqGUTVUq5ZbiOXP2O5OuOXOu6Uo6tLGJbi5FChQ0MGi EYEYl1Q2MGlLECbU7C5VH096dfLT4hR8OXFlUXncc1Xl4g07sJxzIfZS+8feFE8lCaJUk9ie k5qPrVc19yroKf91JI0/NW/dkxGLFWLFYsRixZQ7rzSVeZOv3+O/tGXCMMmGYh+P9761VVVV VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVebkkyTD5FySTDOvngOZpBMwcexaqcU+Od Pv1rWqzI/P87/aoH2JKvwkK2G/YyCb/tH37JJJJosyNJ/dF/qo/3DqvopCfyUodO8yQ2b2yz KsdnsYvBVvOCP0SGMkfDaai2UZMKOjS0yp8afyPcz35Nfq2mlmtdcfiIky/d7mmSSSSSSbt2 aaG5uaGgbu7pqJ+H7H6XXaa/d3eIcMOme5nhjJJJJJN54YIkD9bttihKsiAQJeNKjIgYokbl 3OTNM3DSmkzczpMhy0nXs6esH3Uu7S+gbHY2PLokqqJJJJJJJK5fJi85yOS+Xy3enlvluW4A Dt8vl5eBobm5oaBuG5dyYaYeHvriquCmererfS3u3AAds2q3lySSSSZkkmZJJmSSZkmZmSUp mZhJJJJJmSSZkkmZJmZhSmZJJJJJmSSZkkmZJJmSZmZJJJJJmSSZkkmZJJmSZmZJJJSkkmZJ JmSSZmZJJmUpmZmYSZma2lkxJiTEmJMqrKqwVgrM1klWpKsVbUORvUPeVkrfjer+WSnzSVcG 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 W0VnZiXOW5mWO20wdLfa8mTq5Hhr1zdgugUHbnFjKx9eojcZTzOrrBQOFzDF0fZixbu7Atg7 quCcdasFY7oE7mZkCzKrL6A5WxcDK6sBOVfZAtgl1sB/5K2G9v4XtdtO8B3687cqt0VtJiUy 3mR1wqh00EQ8HAdXQuIGJS5mAnu7Cwu4dlWJNezFfVs3uSXdNc3rHbeCVt1LwdVPMBIy7xx5 d9YwNx9H2U7lYIdFzJtZVjpmxJMveqqzbVYOil4cU8cmIUgSxJru7uIzFS2zmbpLmO9u7sXk qNVfmkkLs3Oe7WChSl1RHb3dm6bVPgTT1zN5SCz3K+I1XK5LxcaKsbtO5xNhGqzaVWMllijR 5t+7kk7qn2Vt9NyHk3YoxUK2gvXzbo80a7q7bF1nYHTlws1hr1t6da1uysuuVqX2VmntzjfU u4YakFIvDRwPkG6LlVlzOpnXebimaeysqWO5TdkzMXJVrubdccfafWtMGuldduBdRrA5z0b0 Nve0bnLMyd0FeubnZkyzg2acFTF1Z2BcyeXKGsLW5siy10VZUmXNO8cDy+FPdvK6qvr7MxXq zdEd9tyKrVJVbuc9ydTszZtVlu6V0HlrunAzuiZveym67dTVrK3lqPI4OFRxyKrTyzku+Jvn aXXYxSbysLAciy6zW9Yqy73NYzawzmsp4DtLcrTvdWODUU0YNxiVj65zup4D3kTqiGAo3Upn +hGSqX7kXwRf40oV/0U/2x/NlFqoqv+qoVf5opvt+8Co/6pJ/fz/YKlXmttGttY21KtrDWKL RWVLrtW6v4Vp1iJX9f/SlCsiov4qLrWyn/ZA81JK50jZYVDDulQXWisCH7cKKXpLQoBUmqps rVTVWvAipxmZLMzGVMSkMFgeVIeJ/mr+0tLJgydSrtlcmJJ/3qlwqPjFKm1FbVFVsGnhKgvX KK4I/uI3I/jRXOitlaor4qLalCuiLzIC7wkWpE+WpVHR8I9qiq/vdKpfGSpT1hV5ST50oV3Q N0U6K6MLKyJhlQeVUyAfAId6eFUypLmp1VpKgutF28NKBfJFMFOr+Lzxqj/lWRcpc8lZWVGS xUYxgrAbD0pmTKyzBiRWVS+qB80qC7K+FRVd3CZRCwpMEmSGMYGVVZQyhkxVkYV3+UE94J6E d1N6iq+PipJXTyqFXCqej/Dwr04KcIp4or3eyVFmQq9d6o8JUq1RW6sVCr6RSp1I9IpUwVRf Ku1FehV8a4STzRX+DmR1f5lQluR5CHLeitiOyFW2K+DK2I7K6Cpg61yCSsqKrdRXn6aV24xZ YYZJRzQPCnFd0Kuyt65K+QQ6lM9FbV2or/CivaCcVI8Keh1rKkvilQXNRagvDMMGWMxjGYy8 QT6QTohV6VJK2ql1VyVIH9TKimMMMTFiIxlRjBjBFjKoxlBjEMZFLSatkya1bJpK2TWtJtqy VslWq/O22236GmyFkLIa2QshZCyGtkqabFkLIWQsbaFtKLIWQshZKsWQshZCyVYshZCyVjUo VUhqQ1JbbZtlbUjbTZbTayLaUtpkMjZkLWQyGQyoY20GQtkMqGSrGRbSisgtQpDayFIUlNCk NrIUhSFIbWQpCkKQo20NtKltKRbSm2m2RLJZLJrYtFkslm2lFaVSsaslUmkrWStk0mbNJbSW 0baJJJtmktZUyYTJqbbKW0tNWUtZay1M2ZszZazZmzNmbMbaWZs0bLFqzayjYtG0sNlWbGxs bKs2NjYtSrNjY1LMa2UtpWytlNW2002NjYptpjY2NizbTbGybFmmKVZqyhRRSrKKprLYs0il WUUUUNtMUUUTbMFhimHsinIp0zvShXyUXuqneoquFaI7yAudFeCOSSdFfggcq1X+6Ur/f/e/ 4Yar+xX+5WKxWKxWSZJgGAZJkmKxWSZJisVkmSbF/fP/jMQSUmRNq5tbWrcatqv1Ns/4tEpa lK3v60paqv7JHVVWtkpdKHJQ60NUNKGqGitCtFakmkk1JNUNKGqHFUlcO9ToD9rxdVdGZgtW IURFJpENjT2wEcwQXxAKyia10k2RmZbJVLErYlLZI2QMlqftym0XPeRaGUmMRLIhjyxhSxWB hWgDZVeeFXipslLepbOysjKOx2S/0j0QyizSh85IyY0sAF42FrFiyJYpgZWWQTJRisW9VqKl nD+v/wFyg6dUJWevQaYpzlbfV7Wtrq1tb4XrJMEGCCC1i2tNNKU0tpppavOmCxiYqT7WhRR2 of7//GhIJP+aFVRXOc5yNfg+Hp47+/avOat+H4gAAAAAAAAAAdeRGf4fvHCz/pOmFT6xiSEU hFMcTBhTD/isurLBZG+smUvOTqv+OaTxF50ie69XtrzWvX5fD6gAAAAAAAAAAPa9FVvRvazF 2V1JnZ0i3G1twPCvTuV/VKVuunSPag3wlLr4HLONc/wn3VL/VPvuzSq3UgXyJSwffU/y23/5 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 //i7kinChIZ5NUoI --G4iJoqBmSsgzjUCe-- --b5gNqxB1S1yM7hjW Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.16 (GNU/Linux) iEYEABECAAYFAk0YyqsACgkQixMPpwVd7zGMBgCcDRXF63G1PIkG5fN5jtFKd8a5 dFIAn3tNBMFOWYdCMpPyKC3tuv8h7Pk5 =j6S2 -----END PGP SIGNATURE----- --b5gNqxB1S1yM7hjW-- From BATV+d132b42b15336141c1ec+2683+infradead.org+hch@bombadil.srs.infradead.org Tue Dec 28 10:07:43 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBSG7e9g174465 for ; Tue, 28 Dec 2010 10:07:42 -0600 X-ASG-Debug-ID: 1293552582-3ea4015d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0EC451613EEB; Tue, 28 Dec 2010 08:09:42 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id BB0kxAbSInmjQG8S; Tue, 28 Dec 2010 08:09:42 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PXc7I-0000GZ-LG; Tue, 28 Dec 2010 16:09:40 +0000 Date: Tue, 28 Dec 2010 11:09:40 -0500 From: Christoph Hellwig To: Alex Elder Cc: xfs@oss.sgi.com, lczerner@redhat.com X-ASG-Orig-Subj: Re: xfs: add FITRIM support Subject: Re: xfs: add FITRIM support Message-ID: <20101228160940.GA28295@infradead.org> References: <20101125112304.GA4195@infradead.org> <1293054073.2408.374.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1293054073.2408.374.camel@doink> 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[18.85.46.34] X-Barracuda-Start-Time: 1293552583 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 22, 2010 at 03:41:13PM -0600, Alex Elder wrote: > > + error = xfs_alloc_read_agf(mp, NULL, agno, > > + XFS_ALLOC_FLAG_TRYLOCK, &agbp); > > + if (error || !agbp) { > > + if (error == EAGAIN) > > + error = 0; > > EAGAIN is ignored because it's an advisory interface, right? > How hard are we expected to try? What I really mean is, > is the benefit of FITRIM enough that we should try again > later when we can get a buffer or lock on it? That was the idea when I wrote this code. But back then we called it regularly from a kernel thread. For FITRIM it makes more sense to just remove the trylock. > I don't know where (or if) FITRIM is precisely documented. > But I question whether truncating down the start offset is > the correct thing to do. If the starting byte offset given > were not block-aligned, it seems like you should not assume > that the caller wanted the bytes below unmapped. (This is > a broader question, not related directly to your change.) > > Similarly, on the length it is probably best to truncate > it, because it avoids any bytes beyond the specified range > getting unmapped. (I.e., in my mind what you did is the > right way to do it.) But these interpretations are > dependent on the specific interpretation of FITRIM... Good question. Adding Lukas to the Cc. I tried to talk him into writing a manpage to document the interface better, but that's only been a few days before the holidays. This is something we should documented. I don't quite understand the need for the range interface anyway. > You don't update range anywhere, so the copyout below > is not really doing anything useful. However I think > it should stay, and the number of bytes actually > trimmed should be updated and returned to the user. > That seems to be what ext4 does (the only reference > I found at the moment for what FITRIM is supposed > to return). Yes, I guess I should update the range. From BATV+05f3ec64611280fa9bf8+2684+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 29 06:50:24 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBTCoLZr064384 for ; Wed, 29 Dec 2010 06:50:24 -0600 X-ASG-Debug-ID: 1293627145-668f035e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 925281D0151D for ; Wed, 29 Dec 2010 04:52:25 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 0sLT2UedMmsc5lY4 for ; Wed, 29 Dec 2010 04:52:25 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PXvVu-00012w-2j; Wed, 29 Dec 2010 12:52:22 +0000 Date: Wed, 29 Dec 2010 07:52:22 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 30/34] xfs: convert l_tail_lsn to an atomic variable. Subject: Re: [PATCH 30/34] xfs: convert l_tail_lsn to an atomic variable. Message-ID: <20101229125221.GA1035@infradead.org> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> <1292916570-25015-31-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292916570-25015-31-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[18.85.46.34] X-Barracuda-Start-Time: 1293627145 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 21, 2010 at 06:29:26PM +1100, Dave Chinner wrote: > From: Dave Chinner > > log->l_tail_lsn is currently protected by the log grant lock. The > lock is only needed for serialising readers against writers, so we > don't really need the lock if we make the l_tail_lsn variable an > atomic. Converting the l_tail_lsn variable to an atomic64_t means we > can start to peel back the grant lock from various operations. > > Also, provide functions to safely crack an atomic LSN variable into > it's component pieces and to recombined the components into an > atomic variable. Use them where appropriate. > > This also removes the need for explicitly holding a spinlock to read > the l_tail_lsn on 32 bit platforms. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig > /* log->l_tail_lsn = 0x100000000LL; cycle = 1; current block = 0 */ > - log->l_tail_lsn = xlog_assign_lsn(1, 0); > - atomic64_set(&log->l_last_sync_lsn, xlog_assign_lsn(1, 0)); > + xlog_assign_atomic_lsn(&log->l_tail_lsn, 1, 0); > + xlog_assign_atomic_lsn(&log->l_last_sync_lsn, 1, 0); It might be worth to remove the rather pointless comment above. > BTOBB(XLOG_MAX_ICLOGS << (xfs_sb_version_haslogv2(&log->l_mp->m_sb) ? \ > XLOG_MAX_RECORD_BSHIFT : XLOG_BIG_RECORD_BSHIFT)) > > - > static inline xfs_lsn_t xlog_assign_lsn(uint cycle, uint block) spurious whitespace change From BATV+05f3ec64611280fa9bf8+2684+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 29 06:51:57 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBTCpvMa064481 for ; Wed, 29 Dec 2010 06:51:57 -0600 X-ASG-Debug-ID: 1293627240-04ef01590000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 07DBD1D01529 for ; Wed, 29 Dec 2010 04:54:00 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id EgoCCs7dQ72xzGrn for ; Wed, 29 Dec 2010 04:54:00 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PXvXU-00014I-Jc; Wed, 29 Dec 2010 12:54:00 +0000 Date: Wed, 29 Dec 2010 07:54:00 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: use KM_NOFS for allocations during attribute list operations Subject: Re: [PATCH] xfs: use KM_NOFS for allocations during attribute list operations Message-ID: <20101229125400.GB1035@infradead.org> References: <1292892993-12424-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1292892993-12424-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[18.85.46.34] X-Barracuda-Start-Time: 1293627241 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Dec 21, 2010 at 11:56:33AM +1100, Dave Chinner wrote: > From: Dave Chinner > > When listing attributes, we are doiing memory allocations under the > inode ilock using only KM_SLEEP. This allows memory allocation to > recurse back into the filesystem and do writeback, which may the > ilock we already hold on the current inode. THis will deadlock. > Hence use KM_NOFS for such allocations outside of transaction > context to ensure that reclaim recursion does not occur. > > Reported-by: Nick Piggin > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From BATV+05f3ec64611280fa9bf8+2684+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 29 06:54:47 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBTCslaY065052 for ; Wed, 29 Dec 2010 06:54:47 -0600 X-ASG-Debug-ID: 1293627410-79e702180000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id F06A91D0153D for ; Wed, 29 Dec 2010 04:56:50 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 6MRekr9Ne7Xo7aVF for ; Wed, 29 Dec 2010 04:56:50 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PXvaE-0001iO-FU; Wed, 29 Dec 2010 12:56:50 +0000 Date: Wed, 29 Dec 2010 07:56:50 -0500 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 06/34] xfs: dynamic speculative EOF preallocation Subject: Re: [PATCH 06/34] xfs: dynamic speculative EOF preallocation Message-ID: <20101229125650.GC1035@infradead.org> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> <1292916570-25015-7-git-send-email-david@fromorbit.com> <20101221151511.GA26127@infradead.org> <20101221214240.GB4907@dastard> <20101221234412.GC4907@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101221234412.GC4907@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[18.85.46.34] X-Barracuda-Start-Time: 1293627410 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean The xfstests patch looks good, Reviewed-by: Christoph Hellwig From BATV+05f3ec64611280fa9bf8+2684+infradead.org+hch@bombadil.srs.infradead.org Wed Dec 29 07:07:02 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_64 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBTD71WQ067289 for ; Wed, 29 Dec 2010 07:07:01 -0600 X-ASG-Debug-ID: 1293628145-7a2f02b20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 84F401D017AC for ; Wed, 29 Dec 2010 05:09:05 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id mtxRgbTwy2XEYIVa for ; Wed, 29 Dec 2010 05:09:05 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PXvm3-0003cH-PL; Wed, 29 Dec 2010 13:09:03 +0000 Date: Wed, 29 Dec 2010 08:09:03 -0500 From: Christoph Hellwig To: Honza Fikar Cc: Eric Sandeen , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: no rw xfs file systems in mtab: /proc/mounts Subject: Re: no rw xfs file systems in mtab: /proc/mounts Message-ID: <20101229130903.GD1035@infradead.org> References: <4D13648B.8000105@sandeen.net> <4D138457.8020008@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4D138457.8020008@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: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1293628145 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Can you please apply the debug patch below and see what output fsr gives with it? Index: xfsprogs-dev/fsr/xfs_fsr.c =================================================================== --- xfsprogs-dev.orig/fsr/xfs_fsr.c 2010-12-29 14:02:59.618003862 +0100 +++ xfsprogs-dev/fsr/xfs_fsr.c 2010-12-29 14:04:32.795004496 +0100 @@ -405,10 +405,16 @@ initallfs(char *mtab) while ((mp = getmntent(fp))) { int rw = 0; - if (strcmp(mp->mnt_type, MNTTYPE_XFS ) != 0 || - stat64(mp->mnt_fsname, &sb) == -1 || - !S_ISBLK(sb.st_mode)) + if (strcmp(mp->mnt_type, MNTTYPE_XFS ) != 0) continue; + if (stat64(mp->mnt_fsname, &sb) == -1) { + printf("fsr: cannot stat %s\n", mp->mnt_fsname); + continue; + } + if (!S_ISBLK(sb.st_mode)) { + printf("fsr: %s is not a block device\n", mp->mnt_fsname); + continue; + } cp = strtok(mp->mnt_opts,","); do { @@ -416,8 +422,7 @@ initallfs(char *mtab) rw++; } while ((cp = strtok(NULL, ",")) != NULL); if (rw == 0) { - if (dflag) - fsrprintf(_("Skipping %s: not mounted rw\n"), + printf(_("Skipping %s: not mounted rw\n"), mp->mnt_fsname); continue; } From aelder@sgi.com Wed Dec 29 09:48:24 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBTFmOMr083802 for ; Wed, 29 Dec 2010 09:48:24 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay1.corp.sgi.com (Postfix) with ESMTP id 100AA8F8065; Wed, 29 Dec 2010 07:50:24 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 29 Dec 2010 09:49:24 -0600 Subject: Re: [PATCH 30/34] xfs: convert l_tail_lsn to an atomic variable. From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1292916570-25015-31-git-send-email-david@fromorbit.com> References: <1292916570-25015-1-git-send-email-david@fromorbit.com> <1292916570-25015-31-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Wed, 29 Dec 2010 09:49:24 -0600 Message-ID: <1293637764.1961.44.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 29 Dec 2010 15:49:24.0897 (UTC) FILETIME=[F7B0F910:01CBA76F] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, 2010-12-21 at 18:29 +1100, Dave Chinner wrote: > From: Dave Chinner > > log->l_tail_lsn is currently protected by the log grant lock. The > lock is only needed for serialising readers against writers, so we > don't really need the lock if we make the l_tail_lsn variable an > atomic. Converting the l_tail_lsn variable to an atomic64_t means we > can start to peel back the grant lock from various operations. > > Also, provide functions to safely crack an atomic LSN variable into > it's component pieces and to recombined the components into an > atomic variable. Use them where appropriate. > > This also removes the need for explicitly holding a spinlock to read > the l_tail_lsn on 32 bit platforms. > > Signed-off-by: Dave Chinner Looks good. A few things to consider, below. Reviewed by: Alex Elder > --- > fs/xfs/linux-2.6/xfs_trace.h | 2 +- > fs/xfs/xfs_log.c | 56 ++++++++++++++++++----------------------- > fs/xfs/xfs_log_priv.h | 37 +++++++++++++++++++++++---- > fs/xfs/xfs_log_recover.c | 14 ++++------ > 4 files changed, 63 insertions(+), 46 deletions(-) . . . > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > index 70790eb..d118bf8 100644 > --- a/fs/xfs/xfs_log.c > +++ b/fs/xfs/xfs_log.c . . . > @@ -2828,11 +2821,11 @@ xlog_state_release_iclog( > > if (iclog->ic_state == XLOG_STATE_WANT_SYNC) { > /* update tail before writing to iclog */ I personally don't like comments above local variable definitions. So I ask that you rearrange this. > - xlog_assign_tail_lsn(log->l_mp); > + xfs_lsn_t tail_lsn = xlog_assign_tail_lsn(log->l_mp); Insert a blank line here too. > sync++; > iclog->ic_state = XLOG_STATE_SYNCING; > - iclog->ic_header.h_tail_lsn = cpu_to_be64(log->l_tail_lsn); > - xlog_verify_tail_lsn(log, iclog, log->l_tail_lsn); > + iclog->ic_header.h_tail_lsn = cpu_to_be64(tail_lsn); > + xlog_verify_tail_lsn(log, iclog, tail_lsn); > /* cycle incremented when incrementing curr_block */ > } > spin_unlock(&log->l_icloglock); . . . > @@ -3445,9 +3438,10 @@ xlog_verify_grant_tail( > * check the byte count. > */ Do you suppose the compiler optimizes all of the following out with a non-debug build? If not maybe it could be put into a debug-only helper function. > xlog_crack_grant_head(&log->l_grant_write_head, &cycle, &space); > - if (CYCLE_LSN(tail_lsn) != cycle) { > - ASSERT(cycle - 1 == CYCLE_LSN(tail_lsn)); > - ASSERT(space <= BBTOB(BLOCK_LSN(tail_lsn))); > + xlog_crack_atomic_lsn(&log->l_tail_lsn, &tail_cycle, &tail_blocks); > + if (tail_cycle != cycle) { > + ASSERT(cycle - 1 == tail_cycle); > + ASSERT(space <= BBTOB(tail_blocks)); > } > } > > diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h > index 958f356..d34af1c 100644 > --- a/fs/xfs/xfs_log_priv.h > +++ b/fs/xfs/xfs_log_priv.h > @@ -53,7 +53,6 @@ struct xfs_mount; > BTOBB(XLOG_MAX_ICLOGS << (xfs_sb_version_haslogv2(&log->l_mp->m_sb) ? \ > XLOG_MAX_RECORD_BSHIFT : XLOG_BIG_RECORD_BSHIFT)) > > - Kill this hunk. > static inline xfs_lsn_t xlog_assign_lsn(uint cycle, uint block) > { > return ((xfs_lsn_t)cycle << 32) | block; . . . > @@ -566,6 +566,31 @@ int xlog_write(struct log *log, struct xfs_log_vec *log_vector, > xlog_in_core_t **commit_iclog, uint flags); > > /* > + * When we crack an atomic LSN, we sample it first so that the value will not > + * change while we are cracking it into the component values. This means we > + * will always get consistent component values to work from. This should always > + * be used to smaple and crack LSNs taht are stored and updated in atomic sample that > + * variables. > + */ > +static inline void > +xlog_crack_atomic_lsn(atomic64_t *lsn, uint *cycle, uint *block) . . . From aelder@sgi.com Wed Dec 29 10:27:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBTGRcOa089216 for ; Wed, 29 Dec 2010 10:27:38 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id CC88BAC00D; Wed, 29 Dec 2010 08:29:38 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 29 Dec 2010 10:29:38 -0600 Subject: Re: [PATCH 5/5] percpu_counter: only disable preemption if needed in add_unless_lt() From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <20101223063138.GF18264@dastard> References: <1293076602.2408.434.camel@doink> <20101223063138.GF18264@dastard> Content-Type: text/plain; charset="UTF-8" Date: Wed, 29 Dec 2010 10:29:38 -0600 Message-ID: <1293640178.1961.62.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 29 Dec 2010 16:29:38.0428 (UTC) FILETIME=[964493C0:01CBA775] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, 2010-12-23 at 17:31 +1100, Dave Chinner wrote: > On Wed, Dec 22, 2010 at 09:56:42PM -0600, Alex Elder wrote: > > In __percpu_counter_add_unless_lt() we don't need to disable > > preemption unless we're manipulating a per-cpu variable. That only > > happens in a limited case, so narrow the scope of that preemption to > > surround that case. This makes the "out" label rather unnecessary, > > so replace a couple "goto out" calls to just return. . . . > > Regardless of the other changes, this is not valid. That is: You're right. I was thinking about updates to fbc->count being protected by the spinlock, but that doesn't address the cached value getting stale if this CPU gets preempted and another thread passes through this code before the first one gets resumed. I'm also looking at the other patches and your responses and will be done with it today. I don't want to hold up your pull request any longer. If you found anything of value in the little series I posted feel free to incorporate it into your own changes. -Alex > amount = -1; > count = fbc->count; > ..... > > > > count (i.e > lots more than error will catch), so the current value of > count in this context is wrong and cannot be trusted> > > > > if (count - error + amount > threshold) { > on a stale count value> > > .... > } > > Effectively, if we want to be able to use lockless optimisations, we > need to ensure that the value of the global counter that we read > remains within the given error bounds until we have finished making > the lockless modification. That is done via disabling preemption > across the entire function... > > Cheers, > > Dave. From aelder@sgi.com Wed Dec 29 14:54:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBTKs5u5123040 for ; Wed, 29 Dec 2010 14:54:06 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id D9590AC005; Wed, 29 Dec 2010 12:56:06 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 29 Dec 2010 14:56:06 -0600 Subject: Re: [PATCH 2/5] percpu_counter: avoid potential underflow in add_unless_lt From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: XFS Mailing List In-Reply-To: <20101223063957.GG18264@dastard> References: <1293076587.2408.431.camel@doink> <20101223063957.GG18264@dastard> Content-Type: text/plain; charset="UTF-8" Date: Wed, 29 Dec 2010 14:56:05 -0600 Message-ID: <1293656165.1961.469.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 29 Dec 2010 20:56:06.0163 (UTC) FILETIME=[CFB35630:01CBA79A] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, 2010-12-23 at 17:39 +1100, Dave Chinner wrote: > On Wed, Dec 22, 2010 at 09:56:27PM -0600, Alex Elder wrote: > > In __percpu_counter_add_unless_lt(), an assumption is made that > > under certain conditions it's possible to determine that an amount > > can be safely added to a counter, possibly without having to acquire > > the lock. This assumption is not valid, however. > > > > These lines encode the assumption: > > if (count + amount > threshold + error) { > > __percpu_counter_add(fbc, amount, batch); > > > > Inside __percpu_counter_add(), the addition is performed > > without acquiring the lock if the *sum* of the batch size > > and the CPU-local delta is within the batch size. Otherwise > > it does the addition after acquiring the lock. > > > > The problem is that *that* sum may actually end up being greater > > than the batch size, forcing the addition to be performed under > > protection of the lock. And by the time the lock is acquired, the > > value of fbc->count may have been updated such that adding the given > > amount allows the result to go negative. > > > > Fix this by open-coding the portion of the __percpu_counter_add() > > that avoids the lock. > > > > Signed-off-by: Alex Elder > > > > --- > > lib/percpu_counter.c | 11 ++++++++--- > > 1 file changed, 8 insertions(+), 3 deletions(-) > > > > Index: b/lib/percpu_counter.c > > =================================================================== > > --- a/lib/percpu_counter.c > > +++ b/lib/percpu_counter.c > > @@ -243,9 +243,14 @@ int __percpu_counter_add_unless_lt(struc > > * we can safely add, and might be able to avoid locking. > > */ > > if (count + amount > threshold + error) { > > - __percpu_counter_add(fbc, amount, batch); > > - ret = 1; > > - goto out; > > + s32 *pcount = this_cpu_ptr(fbc->counters); > > + > > + count = *pcount + amount; > > + if (abs(count) < batch) { > > + *pcount = count; > > + ret = 1; > > + goto out; > > + } > > } > > The problem with this is that it never zeros pcount. That means > after a bunch of increments or decrements, abs(*pcount) == 31, > and ever further increment/decrement will drop through to the path > that requires locking. Then we simply have a very expensive global > counter. I see what you mean. Perhaps the code (below this) that acquires the lock should zero *pcount while it's updating fbc->count. It's already paying the price of the lock anyway, might as well get the most value out of doing so. Anyway, I have stuff of greater significance in the next note... > We need to take the lock to zero the pcount value because it has to > be added to fbc->count. i.e. if you want this path to remain mostly > lockless, then it needs to do exactly what __percpu_counter_add() > does.... > > Cheers, > > Dave. From aelder@sgi.com Wed Dec 29 14:54:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBTKsSOv123066 for ; Wed, 29 Dec 2010 14:54:28 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3A542304039; Wed, 29 Dec 2010 12:56:28 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 29 Dec 2010 14:56:28 -0600 Subject: Re: [PATCH 1/5] percpu_counter: fix test in __percpu_counter_add_unless_lt() From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: XFS Mailing List In-Reply-To: <20101223060652.GE18264@dastard> References: <1293076575.2408.425.camel@doink> <20101223060652.GE18264@dastard> Content-Type: text/plain; charset="UTF-8" Date: Wed, 29 Dec 2010 14:56:28 -0600 Message-ID: <1293656188.1961.470.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 29 Dec 2010 20:56:28.0741 (UTC) FILETIME=[DD287750:01CBA79A] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, 2010-12-23 at 17:06 +1100, Dave Chinner wrote: > On Wed, Dec 22, 2010 at 09:56:15PM -0600, Alex Elder wrote: > > In __percpu_counter_add_unless_lt(), there is a test to see if > > a call to __percpu_counter_add() can be made, knowing the result > > will not be less than the given threshhold and the called function > > will do the addition without taking a lock. . . . > > =================================================================== > > --- a/lib/percpu_counter.c > > +++ b/lib/percpu_counter.c > > @@ -239,10 +239,10 @@ int __percpu_counter_add_unless_lt(struc > > goto out; > > > > /* > > - * If the counter is over the threshold and the change is less than the > > - * batch size, we might be able to avoid locking. > > + * If the updated counter will be over the threshold we know > > + * we can safely add, and might be able to avoid locking. > > */ > > - if (count > threshold + error && abs(amount) < batch) { > > + if (count + amount > threshold + error) { > > __percpu_counter_add(fbc, amount, batch); > > ret = 1; > > goto out; > > What you have is what I first implemented following your exact > logic. However, after having several assert failures n the XFS code, > I realised that the logic fails when there are concurrent modifications > with abs(amount) > batch. To demonstrate, take the initial conditions: I think we're both wrong. First I'll point out a think-o you did, then I'll lay out a counterexample to your approach. > threshold = 0 > amount = -39 (for ease of maths) > batch = 32 > error = 256 (2 * 32 * 4 cpus) > > with the per CPU counter values: > > fbc->count = 296 > > CPU 0 1 2 3 > value -31 -31 -31 -31 > > And the start the concurrent modification such that every racing CPU > sees fbc->count = 296 at their initial sample. All evaluate it as: > > count = 296 > if (296 - 39 > 0 + 256) { > > and so take the __percpu_counter_add() path. Assuming CPUs 1-3 > complete before CPU 0, the counter changes value like: > > > cpu 1 pcp_cnt_add_lt(-39) > CPU 0 1 2 3 > value -31 0 -31 -31 > fbc->count = 216 No. fbc->count + *pcount + amount = 296 + (-31) + (-39) = 226. You're mis-computing (*pcount + amount), which is -70, not -80. > cpu 2 pcp_cnt_add_lt(-39) > CPU 0 1 2 3 > value -31 0 0 -31 > fbc->count = 136 fbc->count = 156 > cpu 3 pcp_cnt_add_lt(-39) > CPU 0 1 2 3 > value -31 0 0 0 > fbc->count = 56 fbc->count = 86 > And the we run the counter add on CPU 0: > > __percpu_counter_add(fbc, -39, 32); > > CPU 0 1 2 3 > value 0 0 0 0 > fbc->count = -24 fbc->count = 16, so all is well. > And we've just blown through the threshold. We modified the counter > and pushed the result less than the threshold which we are not > supposed to be, and worst yet is the fact we returning a positive > number indicating that we _didn't_ bust the threshold. Now here's an example that will fail with your version, which is: if (count > threshold + error && abs(amount) < batch) { __percpu_counter_add(fbc, amount, batch); My example is not symmetric like yours is. threshold = 0 batch = 32 4 cpus, so (your) error = 2 * 4 * 32 = 256 We'll start with 0 for all per-cpu counter values for simplicity, but we'll not assume that the amount being added by all CPU's is the same. So here are both the current per-cpu counter values and the amount each racing CPU is going to try to add. fbc->count = 257 CPU 0 1 2 3 value 0 0 0 0 amount -31 -76 -76 -76 As in your example, all CPU's enter at the same time and start with the same initial value from fbc->count, 257. First, CPU 0 checks the condition and finds it holds: if (count > threshold + error && abs(amount) < batch) { 257 > 0 + 256 && abs(-31) < 32 Now, before CPU 0 gets its chance to call __percpu_counter_add(), CPU's 1, 2, and 3 reach this point, find the condition does not hold, and proceed with adding their values to fbc->count under lock. Net result is: (-76 * 3 = -228; 257 - 228 = 29) fbc->count = 29 CPU 0 1 2 3 value 0 0 0 0 amount -31 (done) (done) (done) Now CPU 0 proceeds with its __percpu_counter_add(), and inside that it finds that *pcount + amount = -31, which is < batch and > -batch, so it simply records the result in the local "delta" counter for CPU 0. Net result: fbc->count = 29 CPU 0 1 2 3 value -31 0 0 0 amount (done) (done) (done) (done) So although the test made it seem OK to add the value, the "net" result has gone negative. I.e, percpu_counter_sum() would produce -2. The whole point of these bounds checking things is to ensure the net value (not just fbc->count) of the counter stays above the threshold. The same problem exists if the amount being added on CPU 0 was -76 like the others. The add would be done under lock, but the result would still go below the threshold. Your approach embeds in it an assumption that "amount" will be within a certain range across all CPU's--specifically, less than the batch size (I think). The real problem is that we're caching the value of fbc->count, and as soon as we've done that it could be out of date. To get around it we need to examine it under lock--preferably a reader/writer lock I suppose. You'll notice that fbc->count is only ever read under the protection of the spinlock everywhere else in the file. Locking is avoided only when checking whether it is possible to add to a per-cpu value, and that is done with preemption disabled. It may be that the only way around this is to compute the accurate sum except in the simple case where we know that the maximum possible net value of the counter will produce a too-low value when the amount is added. Otherwise you have to compute the sum under lock, and then complete the assignment only if the threshold condition is met. I think that--unless you impose a range bound on "amount"--you can't escape the fact that other CPU's can screw up the result by updating fbc->count after you've sampled it. I have a little more below. > Analysis of the failures lead me to this lead me to this logic > for the unlocked check in my proposed patch: > > We can do unlocked modifications concurrently on all CPUs IFF > > 1. the code cannot be preempted between sampling fbc->count > and calling __percpu_counter_add() This I agree with (you convinced me in your response to my patch 5/5). > 2. -batch < amount < batch This isn't right, or maybe just isn't relevant. The reason is that it neither takes into account this CPU's counter value, nor what a concurrent call on the other CPU's might be adding to the net value. > 3. the error bound is set to 2 * batch * nr_cpus I think this assumes that all the CPU's are adding a limited amount to the counter. And I still think you're doubling the error bound unnecessarily (but that may reflect the implied limit). Below I have a version of the code that I think would work, but it unfortunately requires a lock in the (presumably) normal case. > To demonstrate the worst case initial conditions, but being bound by > the above rules: . . . -Alex int __percpu_counter_add_unless_lt( struct percpu_counter *fbc, s64 amount, s64 threshold, s32 batch) { s64 error = batch * num_online_cpus(); s64 new_count; int cpu; int ret = -1; /* * The maximum value the counter holds is bounded by its * current count plus the error magnitude computed above. * If that plus the amount to be added is less than the * threshold, we can't do the add because the result would * be too low. */ if (percpu_counter_read(fbc) + error + amount < threshold) return -1; /* * Otherwise, compute the accurate sum. If and adding the * given amount doesn't exceed the threshold, add it. In * that case, just add the amount to the global counter. */ spin_lock(&fbc->lock); new_count = fbc->count + amount; for_each_online_cpu(cpu) { s32 *pcount = per_cpu_ptr(fbc->counters, cpu); new_count += *pcount; } if (new_count >= threshold) { ret = new_count > threshold; fbc->count = fbc_count + amount; } spin_unlock(&fbc->lock); return ret; } From aelder@sgi.com Wed Dec 29 15:47:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBTLlKBh131643 for ; Wed, 29 Dec 2010 15:47:20 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1B885AC008; Wed, 29 Dec 2010 13:49:20 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 29 Dec 2010 15:49:20 -0600 Subject: Re: [PATCH 1/5] percpu_counter: fix test in __percpu_counter_add_unless_lt() From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: XFS Mailing List In-Reply-To: <1293656188.1961.470.camel@doink> References: <1293076575.2408.425.camel@doink> <20101223060652.GE18264@dastard> <1293656188.1961.470.camel@doink> Content-Type: text/plain; charset="UTF-8" Date: Wed, 29 Dec 2010 15:49:20 -0600 Message-ID: <1293659360.1961.474.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 29 Dec 2010 21:49:20.0699 (UTC) FILETIME=[3FCAD8B0:01CBA7A2] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, 2010-12-29 at 14:56 -0600, Alex Elder wrote: > if (new_count >= threshold) { > ret = new_count > threshold; > fbc->count = fbc_count + amount; > } > spin_unlock(&fbc->lock); > > return ret; > } I obviously didn't test the code I sent, but you get what I mean... Here is the way one of the lines above should look: fbc->count = fbc->count + amount; Or even better: fbc->count += amount; -Alex From BATV+34dcfc6113cf705b5c2c+2685+infradead.org+hch@bombadil.srs.infradead.org Thu Dec 30 05:39:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBUBdRv3240569 for ; Thu, 30 Dec 2010 05:39:30 -0600 X-ASG-Debug-ID: 1293709291-3cf503a30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3D9F211072BC for ; Thu, 30 Dec 2010 03:41:31 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id DTiSnRqkK02p6XWQ for ; Thu, 30 Dec 2010 03:41:31 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1PYGsr-0001t0-CT; Thu, 30 Dec 2010 11:41:29 +0000 Date: Thu, 30 Dec 2010 06:41:29 -0500 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com, Lukas Czerner X-ASG-Orig-Subj: Re: xfs: add FITRIM support Subject: Re: xfs: add FITRIM support Message-ID: <20101230114129.GA4321@infradead.org> References: <20101125112304.GA4195@infradead.org> <20101223014409.GL4907@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101223014409.GL4907@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[18.85.46.34] X-Barracuda-Start-Time: 1293709292 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 23, 2010 at 12:44:09PM +1100, Dave Chinner wrote: > Hmmmm - if we are given a range to trim, wouldn't we do better to > walk the by-bno btree instead? i.e, we have two different cases > here - trim an entire AG, and trim part of an AG given by {start, end}. > > We only need these range checks on the AGs that are only partially > trimmed, and it would seem more efficient to me to walk the by-bno > tree for those rather than walk the by-size tree trying to find > range matches. It might be, but I'm not sure it's really worth the complexity. I can't really find any good use case for a partially trim anyway. Ccing Lukas to figure out what his intent with this was. > Hmmm - so we hold the agf locked for the entire trim? That's a bit > ugly. Given this is best effort, we could avoid this by changing it > to something like: > > longest = 0; > do { > lock agf > force log > if (!longest) > longest = agf->longest > init cursor > do { > xfs_alloc_lookup_le(longest) > alloc_get_rec(&fbno, &flen) > check flen > busy search > discard > decrement cursor > } while (flen == longest) > destroy cursor > unlock agf > longest = flen; > } while(1) This doesn't seem overly efficient. Unless we have lots of extents with same size we keep having to allocate new cursors all the time. I'm not too worried about busy systems - FITRIM is explicitly called and we should expect admins not to call it during the most busy time of the day. And even in it's current form it's already much better than wiper.sh in that respect. I think adding a periodical break using a modified scheme is fine, but I'd really like to get the code out into some more testers hands for now. From ajeet.yadav.77@gmail.com Thu Dec 30 06:26:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBUCQYuK242784 for ; Thu, 30 Dec 2010 06:26:35 -0600 X-ASG-Debug-ID: 1293712117-63f102f40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-qw0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D092515351D2 for ; Thu, 30 Dec 2010 04:28:37 -0800 (PST) Received: from mail-qw0-f53.google.com (mail-qw0-f53.google.com [209.85.216.53]) by cuda.sgi.com with ESMTP id Hb9W33PcCOjvGrGs for ; Thu, 30 Dec 2010 04:28:37 -0800 (PST) Received: by qwe5 with SMTP id 5so12243814qwe.26 for ; Thu, 30 Dec 2010 04:28:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:date:message-id :subject:from:to:content-type; bh=zyx88CEHdWnyZb+Mb+IqBv1ux+NpHKvF38cp6e4PK1c=; b=LEsaAWkA6AnXhRUsM31k8ZxVRBVoJEdXjLa/0eHrcztc/edjSCbVgEdjzxoF+ynedg 9U/XLPgEJ2KVFLPdcK2orK+kIoihAvWoG7H5bpEyyRHSUXYRMRB1s4Wy58y6nZLb6pBB EqircbVwjiN8SBR8Wp65xFmVXc3OZ9Drs1hfY= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=k2uX+jcmHzship9sKP3pRr9PUMVlSNt30edPc9bFQx9amCMY7s9GwqAiIyBjPtFfDN JqWZ7lPSwRZZSt85ss/b68r/iIa5rgg9e7QitddfID6VyeGy4+ZNvbxVhw0w8B5h1Ggh owvxOT2UPxPAmACkWn4bcBdTv6t9XqvgTunrw= MIME-Version: 1.0 Received: by 10.224.61.6 with SMTP id r6mr15430005qah.104.1293712116605; Thu, 30 Dec 2010 04:28:36 -0800 (PST) Received: by 10.220.165.198 with HTTP; Thu, 30 Dec 2010 04:28:36 -0800 (PST) Date: Thu, 30 Dec 2010 17:58:36 +0530 Message-ID: X-ASG-Orig-Subj: XFS handling of synchronous buffers in case of EIO error Subject: XFS handling of synchronous buffers in case of EIO error From: Ajeet Yadav To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=0015175cded426e1c604989fd31a X-Barracuda-Connect: mail-qw0-f53.google.com[209.85.216.53] X-Barracuda-Start-Time: 1293712117 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50925 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.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --0015175cded426e1c604989fd31a Content-Type: text/plain; charset=ISO-8859-1 Kernel: 2.6.30.9 I am trouble shooting a hang in XFS during umount. Test scenerio: Copy large number of files files using below script, and remove the USB after 3-5 second index=0 while [ "$?" == 0 ] do index=$((index+1)) sync cp $1/1KB.txt $2/"$index".test done In rare scenerio during USB unplug the umount process hang at xfs_buf_lock. Below log shows the hung process We have put printk to buffer handling functions xfs_buf_iodone_callbacks(), xfs_buf_error_relse(), xfs_buf_relse() and xfs_buf_rele() We always observed the hang only comes when bp->b_relse = xfs_buf_error_relse(). i.e when xfs_buf_iodone_callbacks() execute XFS_BUF_SET_BRELSE_FUNC(bp,xfs_buf_error_relse); XFS_BUF_DONE(bp); XFS_BUF_FINISH_IOWAIT(bp); buf its never called by xfs_buf_relse() because b_hold = 3. Also we have seen that this problem always comes when bp->relse != NULL && bp->hold > 1. I do not know whether below prints will help you, but I have taken printk for super block buffer tracing S-functionname ( Start of function) E-functionname (End of function) I think the problem is related to xfs_buf_iodone_callbacks synchronous buffer error handling path and release buffer. ------------------------------------------------ buf_lock (Here buffer lock success, taken after down()) S-xfs_buf_rele - 3 (Start of xfs_buf_rele(), b_hold = 3) Call Trace: [<8032c1bc>] dump_stack+0x8/0x34 from[<801cab2c>] xfs_buf_rele+0xc8/0x28c [<801cab2c>] xfs_buf_rele+0xc8/0x28c from[<801cad9c>] xfs_buf_delwri_dequeue+0xac/0x13c [<801cad9c>] xfs_buf_delwri_dequeue+0xac/0x13c from[<801cb798>] xfs_bwrite+0x5c/0x128 [<801cb798>] xfs_bwrite+0x5c/0x128 from[<801d5b48>] xfs_sync_fsdata+0xbc/0x17c [<801d5b48>] xfs_sync_fsdata+0xbc/0x17c from[<801d690c>] xfs_quiesce_data+0x34/0x68 [<801d690c>] xfs_quiesce_data+0x34/0x68 from[<801d2b34>] xfs_fs_sync_fs+0x30/0xec [<801d2b34>] xfs_fs_sync_fs+0x30/0xec<7>hub 2-0:1.0: state 7 ports 1 chg 0000 evt 0002 usb 2-1: USB disconnect, address 3 from[<800b7ff0>] sync_filesystems+0x118/0x19c [<800b7ff0>] sync_filesystems+0x118/0x19c from[<800db490>] do_sync+0x38/0x7c [<800db490>] do_sync+0x38/0x7c from[<800db510>] sys_sync+0x10/0x20 [<800db510>] sys_sync+0x10/0x20 from[<8000ff44>] stack_done+0x20/0x3c E-xfs_buf_rele (End of function) S-xfs_bdstrat_cb S-xfs_buf_rele - 3 S-xfs_buf_iodone_callbacks Device sda2, XFS metadata write error block 0x0 in sda2 E-xfs_buf_iodone_callbacks Call Trace: [<8032c1bc>] dump_stack+0x8/0x34 from[<801cab2c>] xfs_buf_rele+0xc8/0x28c [<801cab2c>] xfs_buf_rele+0xc8/0x28c from[<801cb2fc>] xfs_buf_iorequest+0xe8/0x104 [<801cb2fc>] xfs_buf_iorequest+0xe8/0x104 from[<801cbd2c>] xfs_bdstrat_cb+0x140/0x178 [<801cbd2c>] xfs_bdstrat_cb+0x140/0x178 from[<801cb7ac>] xfs_bwrite+0x70/0x128 [<801cb7ac>] xfs_bwrite+0x70/0x128 from[<801d5b48>] xfs_sync_fsdata+0xbc/0x17c [<801d5b48>] xfs_sync_fsdata+0xbc/0x17c from[<801d690c>] xfs_quiesce_data+0x34/0x68 [<801d690c>] xfs_quiesce_data+0x34/0x68 from[<801d2b34>] xfs_fs_sync_fs+0x30/0xec [<801d2b34>] xfs_fs_sync_fs+0x30/0xec from[<800b7ff0>] sync_filesystems+0x118/0x19c [<800b7ff0>] sync_filesystems+0x118/0x19c from[<800db490>] do_sync+0x38/0x7c [<800db490>] do_sync+0x38/0x7c from[<800db510>] sys_sync+0x10/0x20 [<800db510>] sys_sync+0x10/0x20 from[<8000ff44>] stack_done+0x20/0x3c E-xfs_buf_rele E-xfs_bdstrat_cb xfs_force_shutdown(sda2,0x1) called from line 1020 of file fs/xfs/linux-2.6/xfs_buf.c. Return address = 0x801cb7f0 Filesystem "sda2": I/O Error Detected. Shutting down filesystem: sda2 Please umount the filesystem, and rectify the problem(s) S-xfs_buf_relse S-xfs_buf_rele - 2 Call Trace: [<8032c1bc>] dump_stack+0x8/0x34 from[<801cab2c>] xfs_buf_rele+0xc8/0x28c [<801cab2c>] xfs_buf_rele+0xc8/0x28c from[<801cb828>] xfs_bwrite+0xec/0x128 [<801cb828>] xfs_bwrite+0xec/0x128 from[<801d5b48>] xfs_sync_fsdata+0xbc/0x17c [<801d5b48>] xfs_sync_fsdata+0xbc/0x17c from[<801d690c>] xfs_quiesce_data+0x34/0x68 [<801d690c>] xfs_quiesce_data+0x34/0x68 from[<801d2b34>] xfs_fs_sync_fs+0x30/0xec [<801d2b34>] xfs_fs_sync_fs+0x30/0xec from[<800b7ff0>] sync_filesystems+0x118/0x19c [<800b7ff0>] sync_filesystems+0x118/0x19c from[<800db490>] do_sync+0x38/0x7c [<800db490>] do_sync+0x38/0x7c from[<800db510>] sys_sync+0x10/0x20 [<800db510>] sys_sync+0x10/0x20 from[<8000ff44>] stack_done+0x20/0x3c E-xfs_buf_rele E-xfs_buf_relse cp: cannot stat '/dtv/usb/sda2/6.test': Input/output error Filesystem "sda2": xfs_log_force: error 5 returned. INFO: task khubd:56 blocked for more than 120 seconds. "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. khubd D [86a516a8] 8032cb2c 0 56 2 237 26 (kernel thread) Stack : 00000000 801a2a6c 8643ebe0 86b43a8c 86a51830 8032cb2c 7fffffff 86a516a8 00000002 00000001 86b6dc00 80243a10 e0364448 8032c344 e0373f10 8032cb2c 00000087 0000000b 86b43ab8 801d61bc 3b9aca00 8032d16c 00000008 8019f0dc 86b43a88 00008000 8643ebe0 8616d900 0000000b 00000000 00000000 86bae000 86b43b08 801d62e0 7fffffff 86a516a8 00000002 8032e374 00000000 8008fae4 ... Call Trace: [<8032ca74>] __schedule+0x618/0x6b8 from[<8032cb2c>] schedule+0x18/0x3c [<8032cb2c>] schedule+0x18/0x3c from[<8032d16c>] schedule_timeout+0x2c/0x1c0 [<8032d16c>] schedule_timeout+0x2c/0x1c0 from[<8032e374>] __down+0x8c/0xdc [<8032e374>] __down+0x8c/0xdc from[<8004500c>] down+0x40/0x88 [<8004500c>] down+0x40/0x88 from[<801c9c10>] xfs_buf_lock+0xcc/0x178 [<801c9c10>] xfs_buf_lock+0xcc/0x178 from[<801b6550>] xfs_getsb+0x38/0x54 [<801b6550>] xfs_getsb+0x38/0x54 from[<801d5b00>] xfs_sync_fsdata+0x74/0x17c [<801d5b00>] xfs_sync_fsdata+0x74/0x17c from[<801d690c>] xfs_quiesce_data+0x34/0x68 [<801d690c>] xfs_quiesce_data+0x34/0x68 from[<801d2b34>] xfs_fs_sync_fs+0x30/0xec [<801d2b34>] xfs_fs_sync_fs+0x30/0xec from[<800b878c>] __fsync_super+0xa4/0xc8 [<800b878c>] __fsync_super+0xa4/0xc8 from[<800b87c4>] fsync_super+0x14/0x28 [<800b87c4>] fsync_super+0x14/0x28 from[<800e5cc4>] fsync_bdev+0x28/0x64 [<800e5cc4>] fsync_bdev+0x28/0x64 from[<801faaa8>] invalidate_partition+0x28/0x60 [<801faaa8>] invalidate_partition+0x28/0x60 from[<801001b0>] del_gendisk+0x40/0xf0 [<801001b0>] del_gendisk+0x40/0xf0 from[<8025cb50>] sd_remove+0x40/0xc8 [<8025cb50>] sd_remove+0x40/0xc8 from[<80259b5c>] scsi_bus_remove+0x44/0x5c [<80259b5c>] scsi_bus_remove+0x44/0x5c from[<802463d4>] __device_release_driver+0x80/0xbc [<802463d4>] __device_release_driver+0x80/0xbc from[<80246540>] device_release_driver+0x28/0x40 [<80246540>] device_release_driver+0x28/0x40 from[<802457b8>] bus_remove_device+0xb0/0xf0 [<802457b8>] bus_remove_device+0xb0/0xf0 from[<80243b30>] device_del+0x120/0x1a8 [<80243b30>] device_del+0x120/0x1a8 from[<80259f50>] __scsi_remove_device+0x40/0x98 [<80259f50>] __scsi_remove_device+0x40/0x98 from[<802569cc>] scsi_forget_host+0x88/0xfc [<802569cc>] scsi_forget_host+0x88/0xfc from[<8024f34c>] scsi_remove_host+0xf8/0x1ac [<8024f34c>] scsi_remove_host+0xf8/0x1ac from[] quiesce_and_remove_host+0x9c/0x12c [usb_storage] [] quiesce_and_remove_host+0x9c/0x12c [usb_storage] from[] usb_stor_disconnect+0x20/0x3c [usb_storage] [] usb_stor_disconnect+0x20/0x3c [usb_storage] from[] usb_unbind_interface+0x68/0x128 [usbcore] [] usb_unbind_interface+0x68/0x128 [usbcore] from[<802463d4>] __device_release_driver+0x80/0xbc [<802463d4>] __device_release_driver+0x80/0xbc from[<80246540>] device_release_driver+0x28/0x40 [<80246540>] device_release_driver+0x28/0x40 from[<802457b8>] bus_remove_device+0xb0/0xf0 [<802457b8>] bus_remove_device+0xb0/0xf0 from[<80243b30>] device_del+0x120/0x1a8 [<80243b30>] device_del+0x120/0x1a8 from[] usb_disable_device+0x14c/0x234 [usbcore] [] usb_disable_device+0x14c/0x234 [usbcore] from[] usb_disconnect+0x170/0x37c [usbcore] [] usb_disconnect+0x170/0x37c [usbcore] from[] hub_thread+0x85c/0x18f8 [usbcore] [] hub_thread+0x85c/0x18f8 [usbcore] from[<8003ff3c>] kthread+0x5c/0xa0 [<8003ff3c>] kthread+0x5c/0xa0 from[<80008908>] kernel_thread_helper+0x10/0x18 ------------------------------------------------------------------------------------- INFO: task usb_mount:395 blocked for more than 120 seconds. "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. usb_mount D [86163ae8] 8032cb2c 0 395 371 (user thread) Stack : ffffff9c 86b71ef0 00400ae0 800c0150 86163c70 8032cb2c 86163ae8 00000002 86bbbf18 86bbbf00 00000000 00000000 86b71f00 86b71ef8 7f8b0670 8032cb2c 86bbb780 800b2510 00000001 86bbbf00 86bbbf00 8032f024 86bbbf00 800b21c0 86bbbf00 86bbbf00 86b6dc44 86b6dc44 86163ae8 00000002 86b6dc00 86b6dc00 803fe190 800b9350 86bbbf00 86bbbf18 86bbbef8 86bbbf00 86bbbef8 86bbbef8 ... Call Trace: [<8032ca74>] __schedule+0x618/0x6b8 from[<8032cb2c>] schedule+0x18/0x3c [<8032cb2c>] schedule+0x18/0x3c from[<8032f024>] __down_write_nested+0x104/0x128 [<8032f024>] __down_write_nested+0x104/0x128 from[<800b9350>] deactivate_super+0x70/0x110 [<800b9350>] deactivate_super+0x70/0x110 from[<800d122c>] sys_umount+0x310/0x358 [<800d122c>] sys_umount+0x310/0x358 from[<8000ff44>] stack_done+0x20/0x3c ------------------------------------------------------------------------------------- Filesystem "sda2": xfs_log_force: error 5 returned. --0015175cded426e1c604989fd31a Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Kernel: 2.6.30.9
=A0
I am trouble shooting a hang in XFS during umount.
Test scenerio: Copy large number of files files using below script, an= d remove the USB after 3-5 second
=A0
index=3D0
while [ "$?" =3D=3D 0 ]
do
=A0=A0=A0=A0= =A0=A0=A0 index=3D$((index+1))
=A0=A0=A0=A0=A0=A0=A0 sync
=A0=A0=A0= =A0=A0=A0=A0 cp $1/1KB.txt $2/"$index".test
done
=A0
In rare scenerio during USB unplug the umount process hang at xfs_buf_= lock. Below log shows the hung process
=A0
We have put printk to buffer handling functions xfs_buf_iodone_callbac= ks(), xfs_buf_error_relse(), xfs_buf_relse() and xfs_buf_rele()
=A0
We always observed the hang only comes when bp->b_relse =3D xfs_buf= _error_relse(). i.e when xfs_buf_iodone_callbacks() execute=A0
XFS_BUF_SET_BRELSE_FUNC(bp,xfs_buf_error_relse);
XFS_BUF_DONE(bp);<= br>XFS_BUF_FINISH_IOWAIT(bp);=A0
=A0
buf its never called=A0by xfs_buf_relse() because=A0b_hold =3D 3.
=A0
Also we have seen that this problem always comes when bp->relse != =3D NULL && bp->hold > 1.
=A0
I do not know whether below prints will help you, but I have taken pri= ntk for super block buffer tracing
S-functionname ( Start of function)
E-functionname (End of function)
=A0
I think the problem is related to=A0xfs_buf_iodone_callbacks synchrono= us buffer error handling path and release buffer.
------------------------------------------------
buf_lock=A0=A0 (Here buffer lock success, taken after down())
S-xfs= _buf_rele - 3=A0 (Start of xfs_buf_rele(), b_hold =3D 3)
Call Trace:
[<8032c1bc>] dump_stack+0x8/0x34 from[<801cab2= c>] xfs_buf_rele+0xc8/0x28c
[<801cab2c>] xfs_buf_rele+0xc8/0x28= c from[<801cad9c>] xfs_buf_delwri_dequeue+0xac/0x13c
[<801cad9c= >] xfs_buf_delwri_dequeue+0xac/0x13c from[<801cb798>] xfs_bwrite+0= x5c/0x128
[<801cb798>] xfs_bwrite+0x5c/0x128 from[<801d5b48>] xfs_sync_fs= data+0xbc/0x17c
[<801d5b48>] xfs_sync_fsdata+0xbc/0x17c from[<8= 01d690c>] xfs_quiesce_data+0x34/0x68
[<801d690c>] xfs_quiesce_d= ata+0x34/0x68 from[<801d2b34>] xfs_fs_sync_fs+0x30/0xec
[<801d2b34>] xfs_fs_sync_fs+0x30/0xec<7>hub 2-0:1.0: state 7 po= rts 1 chg 0000 evt 0002
usb 2-1: USB disconnect, address 3
=A0from[<800b7ff0>] sync_filesystems+0x118/0x19c
[<800b7ff= 0>] sync_filesystems+0x118/0x19c from[<800db490>] do_sync+0x38/0x7= c
[<800db490>] do_sync+0x38/0x7c from[<800db510>] sys_sync+0= x10/0x20
[<800db510>] sys_sync+0x10/0x20 from[<8000ff44>] stack_done+0x2= 0/0x3c

E-xfs_buf_rele=A0 (End of function)
=A0
S-xfs_bdstrat_cb
S-xfs_buf_rele - 3
S-xfs_buf_iodone_callbacks
Device sda2, XFS m= etadata write error block 0x0 in sda2

E-xfs_buf_iodone_callbacks
Call Trace:
[<8032c1bc>] du= mp_stack+0x8/0x34 from[<801cab2c>] xfs_buf_rele+0xc8/0x28c
[<80= 1cab2c>] xfs_buf_rele+0xc8/0x28c from[<801cb2fc>] xfs_buf_ioreques= t+0xe8/0x104
[<801cb2fc>] xfs_buf_iorequest+0xe8/0x104 from[<801cbd2c>] xfs_= bdstrat_cb+0x140/0x178
[<801cbd2c>] xfs_bdstrat_cb+0x140/0x178 fro= m[<801cb7ac>] xfs_bwrite+0x70/0x128
[<801cb7ac>] xfs_bwrite+= 0x70/0x128 from[<801d5b48>] xfs_sync_fsdata+0xbc/0x17c
[<801d5b48>] xfs_sync_fsdata+0xbc/0x17c from[<801d690c>] xfs_qu= iesce_data+0x34/0x68
[<801d690c>] xfs_quiesce_data+0x34/0x68 from[= <801d2b34>] xfs_fs_sync_fs+0x30/0xec
[<801d2b34>] xfs_fs_syn= c_fs+0x30/0xec from[<800b7ff0>] sync_filesystems+0x118/0x19c
[<800b7ff0>] sync_filesystems+0x118/0x19c from[<800db490>] do_s= ync+0x38/0x7c
[<800db490>] do_sync+0x38/0x7c from[<800db510>= ] sys_sync+0x10/0x20
[<800db510>] sys_sync+0x10/0x20 from[<8000= ff44>] stack_done+0x20/0x3c

E-xfs_buf_rele
E-xfs_bdstrat_cb
xfs_force_shutdown(sda2,0x1)= called from line 1020 of file fs/xfs/linux-2.6/xfs_buf.c.=A0 Return addres= s =3D 0x801cb7f0
Filesystem "sda2": I/O Error Detected.=A0 Shu= tting down filesystem: sda2
Please umount the filesystem, and rectify the problem(s)
S-xfs_buf_relse
S-xfs_buf_rele - 2
Call Trace:
[<8032c1bc>] dump_stack+0x8/0x34 from[<801cab2= c>] xfs_buf_rele+0xc8/0x28c
[<801cab2c>] xfs_buf_rele+0xc8/0x28= c from[<801cb828>] xfs_bwrite+0xec/0x128
[<801cb828>] xfs_bw= rite+0xec/0x128 from[<801d5b48>] xfs_sync_fsdata+0xbc/0x17c
[<801d5b48>] xfs_sync_fsdata+0xbc/0x17c from[<801d690c>] xfs_qu= iesce_data+0x34/0x68
[<801d690c>] xfs_quiesce_data+0x34/0x68 from[= <801d2b34>] xfs_fs_sync_fs+0x30/0xec
[<801d2b34>] xfs_fs_syn= c_fs+0x30/0xec from[<800b7ff0>] sync_filesystems+0x118/0x19c
[<800b7ff0>] sync_filesystems+0x118/0x19c from[<800db490>] do_s= ync+0x38/0x7c
[<800db490>] do_sync+0x38/0x7c from[<800db510>= ] sys_sync+0x10/0x20
[<800db510>] sys_sync+0x10/0x20 from[<8000= ff44>] stack_done+0x20/0x3c

E-xfs_buf_rele
E-xfs_buf_relse
cp: cannot stat '/dtv/usb= /sda2/6.test': Input/output error
Filesystem "sda2": xfs_l= og_force: error 5 returned.
INFO: task khubd:56 blocked for more than 12= 0 seconds.
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables th= is message.
khubd=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 D [86a516a8] 8032cb2c= =A0=A0=A0=A0 0=A0=A0=A0 56=A0=A0=A0=A0=A0 2=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0 237=A0=A0=A0=A0=A0 26=A0=A0=A0=A0=A0 (kernel thread)
Stack : 0000000= 0 801a2a6c 8643ebe0 86b43a8c 86a51830 8032cb2c 7fffffff 86a516a8
=A0=A0=A0=A0=A0=A0=A0 00000002 00000001 86b6dc00 80243a10 e0364448 8032c344= e0373f10 8032cb2c
=A0=A0=A0=A0=A0=A0=A0 00000087 0000000b 86b43ab8 801d= 61bc 3b9aca00 8032d16c 00000008 8019f0dc
=A0=A0=A0=A0=A0=A0=A0 86b43a88 = 00008000 8643ebe0 8616d900 0000000b 00000000 00000000 86bae000
=A0=A0=A0=A0=A0=A0=A0 86b43b08 801d62e0 7fffffff 86a516a8 00000002 8032e374= 00000000 8008fae4
=A0=A0=A0=A0=A0=A0=A0 ...
Call Trace:
[<8032= ca74>] __schedule+0x618/0x6b8 from[<8032cb2c>] schedule+0x18/0x3c<= br>[<8032cb2c>] schedule+0x18/0x3c from[<8032d16c>] schedule_ti= meout+0x2c/0x1c0
[<8032d16c>] schedule_timeout+0x2c/0x1c0 from[<8032e374>] __dow= n+0x8c/0xdc
[<8032e374>] __down+0x8c/0xdc from[<8004500c>] d= own+0x40/0x88
[<8004500c>] down+0x40/0x88 from[<801c9c10>] x= fs_buf_lock+0xcc/0x178
[<801c9c10>] xfs_buf_lock+0xcc/0x178 from[<801b6550>] xfs_getsb= +0x38/0x54
[<801b6550>] xfs_getsb+0x38/0x54 from[<801d5b00>]= xfs_sync_fsdata+0x74/0x17c
[<801d5b00>] xfs_sync_fsdata+0x74/0x17= c from[<801d690c>] xfs_quiesce_data+0x34/0x68
[<801d690c>] xfs_quiesce_data+0x34/0x68 from[<801d2b34>] xfs_fs= _sync_fs+0x30/0xec
[<801d2b34>] xfs_fs_sync_fs+0x30/0xec from[<= 800b878c>] __fsync_super+0xa4/0xc8
[<800b878c>] __fsync_super+0= xa4/0xc8 from[<800b87c4>] fsync_super+0x14/0x28
[<800b87c4>] fsync_super+0x14/0x28 from[<800e5cc4>] fsync_bdev+= 0x28/0x64
[<800e5cc4>] fsync_bdev+0x28/0x64 from[<801faaa8>]= invalidate_partition+0x28/0x60
[<801faaa8>] invalidate_partition+= 0x28/0x60 from[<801001b0>] del_gendisk+0x40/0xf0
[<801001b0>] del_gendisk+0x40/0xf0 from[<8025cb50>] sd_remove+0= x40/0xc8
[<8025cb50>] sd_remove+0x40/0xc8 from[<80259b5c>] s= csi_bus_remove+0x44/0x5c
[<80259b5c>] scsi_bus_remove+0x44/0x5c fr= om[<802463d4>] __device_release_driver+0x80/0xbc
[<802463d4>] __device_release_driver+0x80/0xbc from[<80246540>]= device_release_driver+0x28/0x40
[<80246540>] device_release_drive= r+0x28/0x40 from[<802457b8>] bus_remove_device+0xb0/0xf0
[<8024= 57b8>] bus_remove_device+0xb0/0xf0 from[<80243b30>] device_del+0x1= 20/0x1a8
[<80243b30>] device_del+0x120/0x1a8 from[<80259f50>] __scsi_rem= ove_device+0x40/0x98
[<80259f50>] __scsi_remove_device+0x40/0x98 f= rom[<802569cc>] scsi_forget_host+0x88/0xfc
[<802569cc>] scsi= _forget_host+0x88/0xfc from[<8024f34c>] scsi_remove_host+0xf8/0x1ac [<8024f34c>] scsi_remove_host+0xf8/0x1ac from[<e039d6bc>] quies= ce_and_remove_host+0x9c/0x12c [usb_storage]
[<e039d6bc>] quiesce_a= nd_remove_host+0x9c/0x12c [usb_storage] from[<e039d83c>] usb_stor_dis= connect+0x20/0x3c [usb_storage]
[<e039d83c>] usb_stor_disconnect+0x20/0x3c [usb_storage] from[<e03= 67c58>] usb_unbind_interface+0x68/0x128 [usbcore]
[<e0367c58>] = usb_unbind_interface+0x68/0x128 [usbcore] from[<802463d4>] __device_r= elease_driver+0x80/0xbc
[<802463d4>] __device_release_driver+0x80/0xbc from[<80246540>]= device_release_driver+0x28/0x40
[<80246540>] device_release_drive= r+0x28/0x40 from[<802457b8>] bus_remove_device+0xb0/0xf0
[<8024= 57b8>] bus_remove_device+0xb0/0xf0 from[<80243b30>] device_del+0x1= 20/0x1a8
[<80243b30>] device_del+0x120/0x1a8 from[<e0364854>] usb_disabl= e_device+0x14c/0x234 [usbcore]
[<e0364854>] usb_disable_device+0x1= 4c/0x234 [usbcore] from[<e035d6b8>] usb_disconnect+0x170/0x37c [usbco= re]
[<e035d6b8>] usb_disconnect+0x170/0x37c [usbcore] from[<e035f264&g= t;] hub_thread+0x85c/0x18f8 [usbcore]
[<e035f264>] hub_thread+0x85= c/0x18f8 [usbcore] from[<8003ff3c>] kthread+0x5c/0xa0
[<8003ff3= c>] kthread+0x5c/0xa0 from[<80008908>] kernel_thread_helper+0x10/0= x18
----------------------------------------------------------------------= ---------------
INFO: task usb_mount:395 blocked for more than 120 secon= ds.
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disa= bles this message.
usb_mount=A0=A0=A0=A0=A0=A0=A0 D [86163ae8] 8032cb2c=A0=A0=A0=A0 0=A0=A0 39= 5=A0=A0=A0 371=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0 (user thread)
Stack : ffffff9c 86b71ef0 00400ae= 0 800c0150 86163c70 8032cb2c 86163ae8 00000002
=A0=A0=A0=A0=A0=A0=A0 86b= bbf18 86bbbf00 00000000 00000000 86b71f00 86b71ef8 7f8b0670 8032cb2c
=A0=A0=A0=A0=A0=A0=A0 86bbb780 800b2510 00000001 86bbbf00 86bbbf00 8032f024= 86bbbf00 800b21c0
=A0=A0=A0=A0=A0=A0=A0 86bbbf00 86bbbf00 86b6dc44 86b6= dc44 86163ae8 00000002 86b6dc00 86b6dc00
=A0=A0=A0=A0=A0=A0=A0 803fe190 = 800b9350 86bbbf00 86bbbf18 86bbbef8 86bbbf00 86bbbef8 86bbbef8
=A0=A0=A0=A0=A0=A0=A0 ...
Call Trace:
[<8032ca74>] __schedule+0= x618/0x6b8 from[<8032cb2c>] schedule+0x18/0x3c
[<8032cb2c>] = schedule+0x18/0x3c from[<8032f024>] __down_write_nested+0x104/0x128[<8032f024>] __down_write_nested+0x104/0x128 from[<800b9350>]= deactivate_super+0x70/0x110
[<800b9350>] deactivate_super+0x70/0x110 from[<800d122c>] sys_u= mount+0x310/0x358
[<800d122c>] sys_umount+0x310/0x358 from[<800= 0ff44>] stack_done+0x20/0x3c
----------------------------------------------------------------------= ---------------
Filesystem "sda2": xfs_log_force: error 5 retu= rned.
--0015175cded426e1c604989fd31a-- From aelder@sgi.com Thu Dec 30 14:37:43 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBUKbgJf028821 for ; Thu, 30 Dec 2010 14:37:43 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6AC81AC012 for ; Thu, 30 Dec 2010 12:39:44 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 30 Dec 2010 14:39:44 -0600 Subject: [PATCH 00/12] xfsprogs: fixup generate_obfuscated_name() From: Alex Elder Reply-To: aelder@sgi.com To: xfs@oss.sgi.com Content-Type: text/plain; charset="UTF-8" Date: Thu, 30 Dec 2010 14:39:43 -0600 Message-ID: <1293741583.2294.341.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: quoted-printable X-OriginalArrivalTime: 30 Dec 2010 20:39:44.0080 (UTC) FILETIME=[B0BF1D00:01CBA861] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This series has expanded some since I first posted a version of it back in October. My original purpose was to fix a bug in the function used by xfs_metadump to obfuscate file and extended attribute names. Arkadiusz Mi=C5=9Bkiewicz found out that when he attempted to perform a metadump on a filesystem which had some files whose names used 8-bit characters, it never completed. The cause was a flaw in the algorithm used to obfuscate names which caused an infinite loop when certain names got obfuscated. I have fixed that bug (in patch 4 of this series), but while I was at it I rearranged the code a bit and did some other cleanups. The first 7 patches in the series are really pretty directly related to that issue. But while in there I noticed some other somewhat subtle issues and have addressed those in this series as well: - There is a table that tracks names to ensure duplicates aren't produced as a result of obfuscation. There was a case where a failure to update the table was silently ignored. - There was still a chance that pathological cases could end up repeating due to finding duplicates. I changed it so it would give up after a fixed number of attempts. - Obfuscated names had been chosen from an alphabet of all allowable characters. This was more than needed, so I made it create names that were (mostly) printables. - It was previously possible for an obfuscated name to end up being a duplicate of a real name, because non-obfuscated names were not placed in the name table. And finally I did a little tidying of the code that manages the name table. Below is a summary of the patches, in order. -Alex xfsprogs: some things aren't all that special Some simple code refactoring to make the purpose of one help function more focused. xfsprogs: simplify leading '/' handling in generate_obfuscated_name() Another cleanup, to simplify some other changes to come. xfsprogs: drop unneeded use of a random character This tweaks the obfuscated filename algorithm slightly to simplify it, while preserving its original properties. xfsprogs: adjust rather than start over when invalid byte found This contains the real fix to the original problem. This patch contains a very long description to explain what's happening. But basically it changes the algorithm so that when a bad (random) character is produced, we don't start over, but instead modify the character (by flipping a bit), resulting in a good character that will be used. xfsprogs: eliminate a pointless loop in generate_obfuscated_name() The previous change made a loop in the code no longer needed. xfsprogs: Replace repeated blocks with a loop The code is now structured so all of the last 5 characters in an obfuscated name are handled identically. This just takes advantage of that by using a loop over them. xfsprogs: use pointers in generate_obfuscated_name() Sort of a cleanup, replacing array references with pointers. xfsprogs: ensure dup table always has entry for obfuscated name This just makes sure we create an entry in the name table before we pass back an obfuscated name. xfsprogs: don't loop on too many dups This ensures we don't loop forever (or even for very long) if we repeatedly come up with duplicate entries when obfuscating names. xfsprogs: use printable characters for obfuscated filenames This restricts the characters used for all but the last five letters of obfuscated file names to just a set of printables. xfsprogs: fix up the nametable code in db/metadump.c This encapsulates some code that works with the name table used in tracking duplicates. xfsprogs: Drop a typedef in db/metadump.c This just gets rid of an unnecessary typedef. From aelder@sgi.com Thu Dec 30 14:37:58 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_45, J_CHICKENPOX_64,J_CHICKENPOX_71,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBUKbvev028852 for ; Thu, 30 Dec 2010 14:37:57 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9B6E58F80D2 for ; Thu, 30 Dec 2010 12:39:59 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 30 Dec 2010 14:39:59 -0600 Subject: [PATCH 01/12] xfsprogs: some things aren't all that special From: Alex Elder Reply-To: aelder@sgi.com To: xfs@oss.sgi.com Content-Type: text/plain; charset="UTF-8" Date: Thu, 30 Dec 2010 14:39:59 -0600 Message-ID: <1293741599.2294.342.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 30 Dec 2010 20:39:59.0534 (UTC) FILETIME=[B9F534E0:01CBA861] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Move the check for short file names out of is_special_dirent() and into generate_obfuscated_name(). That way the check is more directly associated with the algorithm that requires it. Similarly, move the check for inode == 0, since that case has to do with storing extended attributes (not files) in the name table. As a result, is_special_dirent() is really only focused on whether a given file is in the lost+found directory. Rename is_special_dirent() to reflect its more specific purpose. And use a cast to elminate a compile warning in calls to libxfs_da_hashname(). Signed-off-by: Alex Elder --- db/metadump.c | 51 +++++++++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 22 deletions(-) Index: b/db/metadump.c =================================================================== --- a/db/metadump.c +++ b/db/metadump.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007 Silicon Graphics, Inc. + * Copyright (c) 2007,2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -377,8 +377,15 @@ random_filename_char(void) return c; } +/* + * We won't obfuscate "lost+found" nor any inodes within it. + * + * Record the "lost+found" directory's inode number when it's found. + * While processing that directory, any file whose name matches + * its inode number is left as-is (no obfuscation). + */ static int -is_special_dirent( +in_lost_found( xfs_ino_t ino, int namelen, uchar_t *name) @@ -387,22 +394,8 @@ is_special_dirent( char s[32]; int slen; - /* - * due to the XFS name hashing algorithm, we cannot obfuscate - * names with 4 chars or less. - */ - if (namelen <= 4) - return 1; - - if (ino == 0) - return 0; - - /* - * don't obfuscate lost+found nor any inodes within lost+found with - * the inode number - */ - if (cur_ino == mp->m_sb.sb_rootino && namelen == 10 && - memcmp(name, "lost+found", 10) == 0) { + if (!orphanage_ino && cur_ino == mp->m_sb.sb_rootino && + namelen == 10 && !memcmp(name, "lost+found", 10)) { orphanage_ino = ino; return 1; } @@ -410,7 +403,8 @@ is_special_dirent( return 0; slen = sprintf(s, "%lld", (long long)ino); - return (slen == namelen && memcmp(name, s, namelen) == 0); + + return slen == namelen && !memcmp(name, s, namelen); } static void @@ -426,10 +420,23 @@ generate_obfuscated_name( xfs_dahash_t newhash; uchar_t newname[NAME_MAX]; - if (is_special_dirent(ino, namelen, name)) + /* + * Our obfuscation algorithm requires at least 5-character + * names, so don't bother if the name is too short. + */ + if (namelen < 5) + return; + + /* + * We don't obfuscate "lost+found" or any of the files + * therein. When the name table is used for extended + * attributes, the inode number provided is 0, in which + * case we don't need to make this check. + */ + if (ino && in_lost_found(ino, namelen, name)) return; - hash = libxfs_da_hashname(name, namelen); + hash = libxfs_da_hashname((char *) name, namelen); /* create a random name with the same hash value */ @@ -468,7 +475,7 @@ generate_obfuscated_name( break; } - ASSERT(libxfs_da_hashname(newname, namelen) == hash); + ASSERT(libxfs_da_hashname((char *) newname, namelen) == hash); for (p = nametable[hash % NAME_TABLE_SIZE]; p; p = p->next) { if (p->hash == hash && p->namelen == namelen && From aelder@sgi.com Thu Dec 30 14:38:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_47 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBUKc8RV028880 for ; Thu, 30 Dec 2010 14:38:08 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id 261C3AC011 for ; Thu, 30 Dec 2010 12:40:13 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 30 Dec 2010 14:40:12 -0600 Subject: [PATCH 02/12] xfsprogs: simplify leading '/' handling in generate_obfuscated_name() From: Alex Elder Reply-To: aelder@sgi.com To: xfs@oss.sgi.com Content-Type: text/plain; charset="UTF-8" Date: Thu, 30 Dec 2010 14:40:12 -0600 Message-ID: <1293741612.2294.354.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 30 Dec 2010 20:40:12.0815 (UTC) FILETIME=[C1DFB9F0:01CBA861] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean In generate_obfuscated_name(), the incoming file name is allowed to start with a '/' character, in which case it is copied over to the new file name and ignored for the remainder of the hash calculation. Simplify the affected code by processing the '/' right away, and using a pointer thereafter for the start of the new file name. Signed-off-by: Alex Elder --- db/metadump.c | 67 ++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 42 insertions(+), 25 deletions(-) Index: b/db/metadump.c =================================================================== --- a/db/metadump.c +++ b/db/metadump.c @@ -419,6 +419,7 @@ generate_obfuscated_name( int dup; xfs_dahash_t newhash; uchar_t newname[NAME_MAX]; + uchar_t *newp = &newname[0]; /* * Our obfuscation algorithm requires at least 5-character @@ -438,39 +439,55 @@ generate_obfuscated_name( hash = libxfs_da_hashname((char *) name, namelen); - /* create a random name with the same hash value */ - + /* + * If the name starts with a slash, just skip over it. We + * will copy our obfuscated name back into space following + * the slash when we're done. Our new name will not have + * the '/', and that's the version we'll keep in our + * duplicates table. Note that the namelen value passed in + * does not include the leading slash (if any). + */ + if (*name == '/') + name++; do { dup = 0; - newname[0] = '/'; - for (;;) { - /* if the first char is a "/", preserve it */ - i = (name[0] == '/'); - - for (newhash = 0; i < namelen - 5; i++) { - newname[i] = random_filename_char(); - newhash = newname[i] ^ rol32(newhash, 7); + /* + * The beginning of the obfuscated name can + * be pretty much anything, so fill it in + * with random characters. Accumulate its + * new hash value as we go. + */ + newhash = 0; + for (i = 0; i < namelen - 5; i++) { + newp[i] = random_filename_char(); + newhash = newp[i] ^ rol32(newhash, 7); } + + /* + * Compute which five bytes need to be used + * at the end of the name so the hash of the + * obfuscated name is the same as the hash + * of the original. + */ newhash = rol32(newhash, 3) ^ hash; - if (name[0] != '/' || namelen > 5) { - newname[namelen - 5] = (newhash >> 28) | - (random_filename_char() & 0xf0); - if (is_invalid_char(newname[namelen - 5])) - continue; - } - newname[namelen - 4] = (newhash >> 21) & 0x7f; - if (is_invalid_char(newname[namelen - 4])) + + newp[namelen - 5] = (newhash >> 28) | + (random_filename_char() & 0xf0); + if (is_invalid_char(newp[namelen - 5])) + continue; + newp[namelen - 4] = (newhash >> 21) & 0x7f; + if (is_invalid_char(newp[namelen - 4])) continue; - newname[namelen - 3] = (newhash >> 14) & 0x7f; - if (is_invalid_char(newname[namelen - 3])) + newp[namelen - 3] = (newhash >> 14) & 0x7f; + if (is_invalid_char(newp[namelen - 3])) continue; - newname[namelen - 2] = (newhash >> 7) & 0x7f; - if (is_invalid_char(newname[namelen - 2])) + newp[namelen - 2] = (newhash >> 7) & 0x7f; + if (is_invalid_char(newp[namelen - 2])) continue; - newname[namelen - 1] = ((newhash >> 0) ^ - (newname[namelen - 5] >> 4)) & 0x7f; - if (is_invalid_char(newname[namelen - 1])) + newp[namelen - 1] = ((newhash >> 0) ^ + (newp[namelen - 5] >> 4)) & 0x7f; + if (is_invalid_char(newp[namelen - 1])) continue; break; } From aelder@sgi.com Thu Dec 30 14:38:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_47 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBUKcNmZ028907 for ; Thu, 30 Dec 2010 14:38:23 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay2.corp.sgi.com (Postfix) with ESMTP id 25700304053 for ; Thu, 30 Dec 2010 12:40:25 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 30 Dec 2010 14:40:25 -0600 Subject: [PATCH 03/12] xfsprogs: drop unneeded use of a random character From: Alex Elder Reply-To: aelder@sgi.com To: xfs@oss.sgi.com Content-Type: text/plain; charset="UTF-8" Date: Thu, 30 Dec 2010 14:40:24 -0600 Message-ID: <1293741624.2294.355.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 30 Dec 2010 20:40:25.0049 (UTC) FILETIME=[C92A7C90:01CBA861] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean With the exception of the last five bytes, an obfuscated filename is simply a random string of (filesystem-acceptable) characters. The last five bytes are chosen, based on the random portion before them, such that the resulting obfuscated name has the same hash value as the original filename. This is done by essentially working backwards from the difference between the original hash and the hash value computed for the obfuscated name so far, picking final bytes based on how that difference gets manipulated by completing the hash computation. Of those last 5 bytes, all but the upper half of the first one are completely determined by this process. The upper part of the first one is currently computed as 4 random bits, just like the entire first part of the obfuscated name. But the lower nibble of that byte is already effectively random, resulting from the hash computation (or the difference between two of them). We can choose to use 0's for that upper nibble and it will have no significant effect on the randomoness of the result. Doing this simplifies the generation of two of the final five characters, and makes all five of them get computed in a consistent way. Add the use of a mask in the one case it wasn't used to be even more consistent. Signed-off-by: Alex Elder --- db/metadump.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) Index: b/db/metadump.c =================================================================== --- a/db/metadump.c +++ b/db/metadump.c @@ -472,8 +472,7 @@ generate_obfuscated_name( */ newhash = rol32(newhash, 3) ^ hash; - newp[namelen - 5] = (newhash >> 28) | - (random_filename_char() & 0xf0); + newp[namelen - 5] = (newhash >> 28) & 0x7f; if (is_invalid_char(newp[namelen - 5])) continue; newp[namelen - 4] = (newhash >> 21) & 0x7f; @@ -485,8 +484,7 @@ generate_obfuscated_name( newp[namelen - 2] = (newhash >> 7) & 0x7f; if (is_invalid_char(newp[namelen - 2])) continue; - newp[namelen - 1] = ((newhash >> 0) ^ - (newp[namelen - 5] >> 4)) & 0x7f; + newp[namelen - 1] = (newhash >> 0) & 0x7f; if (is_invalid_char(newp[namelen - 1])) continue; break; From aelder@sgi.com Thu Dec 30 14:38:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_47, LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBUKcX57028933 for ; Thu, 30 Dec 2010 14:38:33 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0BF738F80D2 for ; Thu, 30 Dec 2010 12:40:37 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 30 Dec 2010 14:40:37 -0600 Subject: [PATCH 04/12] xfsprogs: adjust rather than start over when invalid byte found From: Alex Elder Reply-To: aelder@sgi.com To: xfs@oss.sgi.com Content-Type: text/plain; charset="UTF-8" Date: Thu, 30 Dec 2010 14:40:37 -0600 Message-ID: <1293741637.2294.356.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: quoted-printable X-OriginalArrivalTime: 30 Dec 2010 20:40:37.0878 (UTC) FILETIME=[D0D00960:01CBA861] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean The last 5 bytes of a filename generated by generate_obfuscated_name() can be selected such that they (along with all of the preceding characters in the filename) produce any desired value when hashed. They are selected based on how their value affects the outcome of the hash calculation for the obfuscated name. Each byte is XOR'd into the hash at a certain position. The portion of the hash affected by each of these last five bytes can be seen visually below: +-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-+ hash: | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-+ last-4 ->| |<-- last-2 --->| |<--- last ---->| |<-- last-3 --->| |<-- last-1 --->| |<- last-4 (Note byte (last - 4) wraps around. The previous patch in this series eliminated the effect of the upper 4 bits of that byte by forcing them to be all be 0 bits.) Using the (XOR) difference between the hash computed for the beginning of the obfuscated name and the hash from the original value, we can directly determine the required final five bytes to make the hashes for the two complete filenames match. The lower byte (bits 0-7) of that difference is used for the last character in the obfuscated name, bits 7-14 for the second-to-last, and so on. It's possible for those portions to result in characters ('\0' and '/') that are not allowed in valid file names. If this occurs, the existing code abandons the current obfuscated file name and starts again from the beginning. But there exist cases where this can lead to a never-ending loop. Arkadiusz Mi=C5=9Bkiewicz encountered just such a name, "R\323\257NE". That filename produces hash value 0x3a4be740, which requires that the obfuscated name uses '/' at position last-2. The current algorithm starts over, but since there are no random characters in this length-5 obfuscated name, no other possibility will be found and the process repeats forever. This change modifies the algorithm used so that if a non-allowed character arises, we flip a bit in that character (which results in an allowed character), along with another "matching" bit in another byte such that the resulting hash is unchanged. The two un-allowed characters in a pathname component are '\0' (0x00) and '/' (0x2f). Flipping any one bit in either one of those characters converts it to an allowed character. Flipping two distinct bits also results in an allowed character. As seen in the diagram above, the effect of each character on the hash overlaps two other characters. We can choose to flip one of the overlapping bits in a "bad" character, then flip the overlapping bit in the next byte, and the result will produce the same hash. So, starting with the first of these last 5 bytes (last-4), if its "normal" value is one of the invalid ones, we flip its low bit and arrange to flip the high bit of its successor byte. The very last byte has a little different treatment. We can flip its low bit, but it has no successor byte per se. Its effect on the hash does overlap the first byte of the 5-byte series though, so we can flip the corresponding bit in that (at position 0x10). There is one more case to consider. It's possible in that last case that by flipping a bit in byte (last-4), we have converted that byte to one that's not allowed. Fortunately, we have four bits of overlap here, so we can choose to flip a second bit in both the last byte and its corresponding bit at (last-4). Since flipping two bits also results in an allowed character, this resolves the issue. With these changes to the filename generation algorithm, we avoid any of the cases in which no alternate name can be found without using an illegal character. We also avoid all looping due to bad characters. Reported-by: Arkadiusz Mi=C5=9Bkiewicz Signed-off-by: Alex Elder --- db/metadump.c | 77 +++++++++++++++++++++++++++++++++++++++++++++--------= ----- 1 file changed, 61 insertions(+), 16 deletions(-) Index: b/db/metadump.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- a/db/metadump.c +++ b/db/metadump.c @@ -452,6 +452,8 @@ generate_obfuscated_name( do { dup =3D 0; for (;;) { + uchar_t high_bit; + /* * The beginning of the obfuscated name can * be pretty much anything, so fill it in @@ -468,25 +470,68 @@ generate_obfuscated_name( * Compute which five bytes need to be used * at the end of the name so the hash of the * obfuscated name is the same as the hash - * of the original. + * of the original. If any result in an + * invalid character, flip a bit and arrange + * for a corresponding bit in a neighboring + * byte to be flipped as well. For the last + * byte, the "neighbor" to change is the + * first byte we're computing here. */ newhash =3D rol32(newhash, 3) ^ hash; =20 - newp[namelen - 5] =3D (newhash >> 28) & 0x7f; - if (is_invalid_char(newp[namelen - 5])) - continue; - newp[namelen - 4] =3D (newhash >> 21) & 0x7f; - if (is_invalid_char(newp[namelen - 4])) - continue; - newp[namelen - 3] =3D (newhash >> 14) & 0x7f; - if (is_invalid_char(newp[namelen - 3])) - continue; - newp[namelen - 2] =3D (newhash >> 7) & 0x7f; - if (is_invalid_char(newp[namelen - 2])) - continue; - newp[namelen - 1] =3D (newhash >> 0) & 0x7f; - if (is_invalid_char(newp[namelen - 1])) - continue; + high_bit =3D 0; + + newp[namelen - 5] =3D ((newhash >> 28) & 0x7f) ^ high_bit; + if (is_invalid_char(newp[namelen - 5])) { + newp[namelen - 5] ^=3D 1; + high_bit =3D 0x80; + } else + high_bit =3D 0; + + newp[namelen - 4] =3D ((newhash >> 21) & 0x7f) ^ high_bit; + if (is_invalid_char(newp[namelen - 4])) { + newp[namelen - 4] ^=3D 1; + high_bit =3D 0x80; + } else + high_bit =3D 0; + + newp[namelen - 3] =3D ((newhash >> 14) & 0x7f) ^ high_bit; + if (is_invalid_char(newp[namelen - 3])) { + newp[namelen - 3] ^=3D 1; + high_bit =3D 0x80; + } else + high_bit =3D 0; + + newp[namelen - 2] =3D ((newhash >> 7) & 0x7f) ^ high_bit; + if (is_invalid_char(newp[namelen - 2])) { + newp[namelen - 2] ^=3D 1; + high_bit =3D 0x80; + } else + high_bit =3D 0; + + newp[namelen - 1] =3D ((newhash >> 0) & 0x7f) ^ high_bit; + if (is_invalid_char(newp[namelen - 1])) { + newp[namelen - 1] ^=3D 1; + high_bit =3D 0x80; + } else + high_bit =3D 0; + + /* + * If we flipped a bit on the last byte, we + * need to fix up the first one we computed. + * That could make that first character + * invalid, in which case we flip one more + * bit in both bytes. + */ + if (high_bit) { + newp[namelen - 5] ^=3D 0x10; + if (is_invalid_char(newp[namelen - 5])) { + newp[namelen - 1] ^=3D 2; + newp[namelen - 5] ^=3D 0x20; + ASSERT(!is_invalid_char(newp[namelen - 1])); + ASSERT(!is_invalid_char(newp[namelen - 5])); + } + } break; } =20 From aelder@sgi.com Thu Dec 30 14:38:46 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_47 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBUKckYm028965 for ; Thu, 30 Dec 2010 14:38:46 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id BB2CAAC011 for ; Thu, 30 Dec 2010 12:40:50 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 30 Dec 2010 14:40:50 -0600 Subject: [PATCH 05/12] xfsprogs: eliminate a pointless loop in generate_obfuscated_name() From: Alex Elder Reply-To: aelder@sgi.com To: xfs@oss.sgi.com Content-Type: text/plain; charset="UTF-8" Date: Thu, 30 Dec 2010 14:40:49 -0600 Message-ID: <1293741649.2294.357.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 30 Dec 2010 20:40:50.0425 (UTC) FILETIME=[D84A8E90:01CBA861] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Eliminate a now pointless loop. Done as a separate patch to make the effects of upcoming changes more clear. Signed-off-by: Alex Elder --- db/metadump.c | 146 ++++++++++++++++++++++++++++------------------------------ 1 file changed, 71 insertions(+), 75 deletions(-) Index: b/db/metadump.c =================================================================== --- a/db/metadump.c +++ b/db/metadump.c @@ -450,89 +450,85 @@ generate_obfuscated_name( if (*name == '/') name++; do { + uchar_t high_bit; + dup = 0; - for (;;) { - uchar_t high_bit; - /* - * The beginning of the obfuscated name can - * be pretty much anything, so fill it in - * with random characters. Accumulate its - * new hash value as we go. - */ - newhash = 0; - for (i = 0; i < namelen - 5; i++) { - newp[i] = random_filename_char(); - newhash = newp[i] ^ rol32(newhash, 7); - } + /* + * The beginning of the obfuscated name can be + * pretty much anything, so fill it in with random + * characters. Accumulate its new hash value as we + * go. + */ + newhash = 0; + for (i = 0; i < namelen - 5; i++) { + newp[i] = random_filename_char(); + newhash = newp[i] ^ rol32(newhash, 7); + } - /* - * Compute which five bytes need to be used - * at the end of the name so the hash of the - * obfuscated name is the same as the hash - * of the original. If any result in an - * invalid character, flip a bit and arrange - * for a corresponding bit in a neighboring - * byte to be flipped as well. For the last - * byte, the "neighbor" to change is the - * first byte we're computing here. - */ - newhash = rol32(newhash, 3) ^ hash; + /* + * Compute which five bytes need to be used at the + * end of the name so the hash of the obfuscated + * name is the same as the hash of the original. If + * any result in an invalid character, flip a bit + * and arrange for a corresponding bit in a + * neighboring byte to be flipped as well. For the + * last byte, the "neighbor" to change is the first + * byte we're computing here. + */ + newhash = rol32(newhash, 3) ^ hash; + high_bit = 0; + + newp[namelen - 5] = ((newhash >> 28) & 0x7f) ^ high_bit; + if (is_invalid_char(newp[namelen - 5])) { + newp[namelen - 5] ^= 1; + high_bit = 0x80; + } else high_bit = 0; - newp[namelen - 5] = ((newhash >> 28) & 0x7f) ^ high_bit; - if (is_invalid_char(newp[namelen - 5])) { - newp[namelen - 5] ^= 1; - high_bit = 0x80; - } else - high_bit = 0; - - newp[namelen - 4] = ((newhash >> 21) & 0x7f) ^ high_bit; - if (is_invalid_char(newp[namelen - 4])) { - newp[namelen - 4] ^= 1; - high_bit = 0x80; - } else - high_bit = 0; - - newp[namelen - 3] = ((newhash >> 14) & 0x7f) ^ high_bit; - if (is_invalid_char(newp[namelen - 3])) { - newp[namelen - 3] ^= 1; - high_bit = 0x80; - } else - high_bit = 0; - - newp[namelen - 2] = ((newhash >> 7) & 0x7f) ^ high_bit; - if (is_invalid_char(newp[namelen - 2])) { - newp[namelen - 2] ^= 1; - high_bit = 0x80; - } else - high_bit = 0; - - newp[namelen - 1] = ((newhash >> 0) & 0x7f) ^ high_bit; - if (is_invalid_char(newp[namelen - 1])) { - newp[namelen - 1] ^= 1; - high_bit = 0x80; - } else - high_bit = 0; + newp[namelen - 4] = ((newhash >> 21) & 0x7f) ^ high_bit; + if (is_invalid_char(newp[namelen - 4])) { + newp[namelen - 4] ^= 1; + high_bit = 0x80; + } else + high_bit = 0; - /* - * If we flipped a bit on the last byte, we - * need to fix up the first one we computed. - * That could make that first character - * invalid, in which case we flip one more - * bit in both bytes. - */ - if (high_bit) { - newp[namelen - 5] ^= 0x10; - if (is_invalid_char(newp[namelen - 5])) { - newp[namelen - 1] ^= 2; - newp[namelen - 5] ^= 0x20; - ASSERT(!is_invalid_char(newp[namelen - 1])); - ASSERT(!is_invalid_char(newp[namelen - 5])); - } + newp[namelen - 3] = ((newhash >> 14) & 0x7f) ^ high_bit; + if (is_invalid_char(newp[namelen - 3])) { + newp[namelen - 3] ^= 1; + high_bit = 0x80; + } else + high_bit = 0; + + newp[namelen - 2] = ((newhash >> 7) & 0x7f) ^ high_bit; + if (is_invalid_char(newp[namelen - 2])) { + newp[namelen - 2] ^= 1; + high_bit = 0x80; + } else + high_bit = 0; + + newp[namelen - 1] = ((newhash >> 0) & 0x7f) ^ high_bit; + if (is_invalid_char(newp[namelen - 1])) { + newp[namelen - 1] ^= 1; + high_bit = 0x80; + } else + high_bit = 0; + + /* + * If we flipped a bit on the last byte, we need to + * fix up the first one we computed. That could + * make that first character invalid, in which case + * we flip one more bit in both bytes. + */ + if (high_bit) { + newp[namelen - 5] ^= 0x10; + if (is_invalid_char(newp[namelen - 5])) { + newp[namelen - 1] ^= 2; + newp[namelen - 5] ^= 0x20; + ASSERT(!is_invalid_char(newp[namelen - 1])); + ASSERT(!is_invalid_char(newp[namelen - 5])); } - break; } ASSERT(libxfs_da_hashname((char *) newname, namelen) == hash); From aelder@sgi.com Thu Dec 30 14:39:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_47 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBUKd5T3028995 for ; Thu, 30 Dec 2010 14:39:06 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8FD748F80D3 for ; Thu, 30 Dec 2010 12:41:10 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 30 Dec 2010 14:41:10 -0600 Subject: [PATCH: 06 /12] xfsprogs: replace repeated blocks with a loop From: Alex Elder Reply-To: aelder@sgi.com To: xfs@oss.sgi.com Content-Type: text/plain; charset="UTF-8" Date: Thu, 30 Dec 2010 14:41:09 -0600 Message-ID: <1293741669.2294.365.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 30 Dec 2010 20:41:10.0487 (UTC) FILETIME=[E43FC670:01CBA861] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Replace a repeated block of code with an equivalent loop. Signed-off-by: Alex Elder --- db/metadump.c | 43 +++++++++---------------------------------- 1 file changed, 9 insertions(+), 34 deletions(-) Index: b/db/metadump.c =================================================================== --- a/db/metadump.c +++ b/db/metadump.c @@ -479,41 +479,16 @@ generate_obfuscated_name( newhash = rol32(newhash, 3) ^ hash; high_bit = 0; + for (i = 5; i > 0; i--) { + int shift = (i - 1) * 7; - newp[namelen - 5] = ((newhash >> 28) & 0x7f) ^ high_bit; - if (is_invalid_char(newp[namelen - 5])) { - newp[namelen - 5] ^= 1; - high_bit = 0x80; - } else - high_bit = 0; - - newp[namelen - 4] = ((newhash >> 21) & 0x7f) ^ high_bit; - if (is_invalid_char(newp[namelen - 4])) { - newp[namelen - 4] ^= 1; - high_bit = 0x80; - } else - high_bit = 0; - - newp[namelen - 3] = ((newhash >> 14) & 0x7f) ^ high_bit; - if (is_invalid_char(newp[namelen - 3])) { - newp[namelen - 3] ^= 1; - high_bit = 0x80; - } else - high_bit = 0; - - newp[namelen - 2] = ((newhash >> 7) & 0x7f) ^ high_bit; - if (is_invalid_char(newp[namelen - 2])) { - newp[namelen - 2] ^= 1; - high_bit = 0x80; - } else - high_bit = 0; - - newp[namelen - 1] = ((newhash >> 0) & 0x7f) ^ high_bit; - if (is_invalid_char(newp[namelen - 1])) { - newp[namelen - 1] ^= 1; - high_bit = 0x80; - } else - high_bit = 0; + newp[namelen - i] = ((newhash >> shift) & 0x7f) ^ high_bit; + if (is_invalid_char(newp[namelen - i])) { + newp[namelen - i] ^= 1; + high_bit = 0x80; + } else + high_bit = 0; + } /* * If we flipped a bit on the last byte, we need to From aelder@sgi.com Thu Dec 30 14:39:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_47 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBUKdIoO029025 for ; Thu, 30 Dec 2010 14:39:18 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay2.corp.sgi.com (Postfix) with ESMTP id BDD16304039 for ; Thu, 30 Dec 2010 12:41:23 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 30 Dec 2010 14:41:23 -0600 Subject: [PATCH 07/12] xfsprogs: use pointers in generate_obfuscated_name() From: Alex Elder Reply-To: aelder@sgi.com To: xfs@oss.sgi.com Content-Type: text/plain; charset="UTF-8" Date: Thu, 30 Dec 2010 14:41:23 -0600 Message-ID: <1293741683.2294.366.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 30 Dec 2010 20:41:23.0675 (UTC) FILETIME=[EC1C1AB0:01CBA861] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Switch from using array references to using pointers to refer to the pathname characters as they get generated. Also limit the scope of a few automatic variables. Signed-off-by: Alex Elder --- db/metadump.c | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) Index: b/db/metadump.c =================================================================== --- a/db/metadump.c +++ b/db/metadump.c @@ -415,11 +415,8 @@ generate_obfuscated_name( { xfs_dahash_t hash; name_ent_t *p; - int i; int dup; - xfs_dahash_t newhash; uchar_t newname[NAME_MAX]; - uchar_t *newp = &newname[0]; /* * Our obfuscation algorithm requires at least 5-character @@ -450,7 +447,12 @@ generate_obfuscated_name( if (*name == '/') name++; do { - uchar_t high_bit; + int i; + xfs_dahash_t newhash = 0; + uchar_t *newp = &newname[0]; + uchar_t *first; + uchar_t high_bit; + int shift; dup = 0; @@ -460,10 +462,10 @@ generate_obfuscated_name( * characters. Accumulate its new hash value as we * go. */ - newhash = 0; for (i = 0; i < namelen - 5; i++) { - newp[i] = random_filename_char(); - newhash = newp[i] ^ rol32(newhash, 7); + *newp = random_filename_char(); + newhash = *newp ^ rol32(newhash, 7); + newp++; } /* @@ -478,16 +480,16 @@ generate_obfuscated_name( */ newhash = rol32(newhash, 3) ^ hash; + first = newp; high_bit = 0; - for (i = 5; i > 0; i--) { - int shift = (i - 1) * 7; - - newp[namelen - i] = ((newhash >> shift) & 0x7f) ^ high_bit; - if (is_invalid_char(newp[namelen - i])) { - newp[namelen - i] ^= 1; + for (shift = 28; shift >= 0; shift -= 7) { + *newp = (newhash >> shift & 0x7f) ^ high_bit; + if (is_invalid_char(*newp)) { + *newp ^= 1; high_bit = 0x80; } else high_bit = 0; + newp++; } /* @@ -497,12 +499,12 @@ generate_obfuscated_name( * we flip one more bit in both bytes. */ if (high_bit) { - newp[namelen - 5] ^= 0x10; - if (is_invalid_char(newp[namelen - 5])) { - newp[namelen - 1] ^= 2; - newp[namelen - 5] ^= 0x20; - ASSERT(!is_invalid_char(newp[namelen - 1])); - ASSERT(!is_invalid_char(newp[namelen - 5])); + *first ^= 0x10; + if (is_invalid_char(*first)) { + *--newp ^= 2; + *first ^= 0x20; + ASSERT(!is_invalid_char(*newp)); + ASSERT(!is_invalid_char(*first)); } } @@ -510,7 +512,7 @@ generate_obfuscated_name( for (p = nametable[hash % NAME_TABLE_SIZE]; p; p = p->next) { if (p->hash == hash && p->namelen == namelen && - memcmp(p->name, newname, namelen) == 0){ + !memcmp(p->name, newname, namelen)) { dup = 1; break; } From aelder@sgi.com Thu Dec 30 14:39:41 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_64 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBUKdfi7029057 for ; Thu, 30 Dec 2010 14:39:41 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id CE5F6AC011 for ; Thu, 30 Dec 2010 12:41:45 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 30 Dec 2010 14:41:45 -0600 Subject: [PATCH 08/12] xfsprogs: ensure dup table always has entry for obfuscated name From: Alex Elder Reply-To: aelder@sgi.com To: xfs@oss.sgi.com Content-Type: text/plain; charset="UTF-8" Date: Thu, 30 Dec 2010 14:41:45 -0600 Message-ID: <1293741705.2294.367.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 30 Dec 2010 20:41:45.0503 (UTC) FILETIME=[F91ECAF0:01CBA861] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean We need to ensure the name table has a copy of all the names in a directory in order to avoid creating duplicate entries when obfuscating names. Currently there is an (unlikely) case where the name is passed back without such an entry being created. Reorder things so that won't happen. Signed-off-by: Alex Elder --- db/metadump.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) Index: b/db/metadump.c =================================================================== --- a/db/metadump.c +++ b/db/metadump.c @@ -519,18 +519,22 @@ generate_obfuscated_name( } } while (dup); - memcpy(name, newname, namelen); + /* Create an entry for the name in the name table */ p = malloc(sizeof(name_ent_t) + namelen); if (p == NULL) return; - p->next = nametable[hash % NAME_TABLE_SIZE]; - p->hash = hash; p->namelen = namelen; - memcpy(p->name, name, namelen); + memcpy(p->name, newname, namelen); + p->hash = hash; + p->next = nametable[hash % NAME_TABLE_SIZE]; nametable[hash % NAME_TABLE_SIZE] = p; + + /* Update the caller's copy with the obfuscated name */ + + memcpy(name, newname, namelen); } static void From aelder@sgi.com Thu Dec 30 14:40:02 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_64 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBUKe246029146 for ; Thu, 30 Dec 2010 14:40:02 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id DDEE9AC011 for ; Thu, 30 Dec 2010 12:42:06 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 30 Dec 2010 14:42:06 -0600 Subject: [PATCH 09/12] xfsprogs: don't loop on too many dups From: Alex Elder Reply-To: aelder@sgi.com To: xfs@oss.sgi.com Content-Type: text/plain; charset="UTF-8" Date: Thu, 30 Dec 2010 14:42:06 -0600 Message-ID: <1293741726.2294.368.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 30 Dec 2010 20:42:06.0503 (UTC) FILETIME=[05A32370:01CBA862] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Don't just loop indefinitely when an obfuscated name comes up as a duplicate. Count the number of times we've found a duplicate, and if it gets excessive just give up and use the original name without obfuscation. Signed-off-by: Alex Elder --- db/metadump.c | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) Index: b/db/metadump.c =================================================================== --- a/db/metadump.c +++ b/db/metadump.c @@ -29,6 +29,14 @@ #define DEFAULT_MAX_EXT_SIZE 1000 +/* + * It's possible that more than one file in a directory produce the + * same obfuscated name. If that happens, we try to create another + * one. After several rounds of this though, we just give up and + * leave the original name as-is. + */ +#define DUP_MAX 5 /* Max duplicates before we give up */ + /* copy all metadata structures to/from a file */ static int metadump_f(int argc, char **argv); @@ -415,7 +423,7 @@ generate_obfuscated_name( { xfs_dahash_t hash; name_ent_t *p; - int dup; + int dup = 0; uchar_t newname[NAME_MAX]; /* @@ -454,8 +462,6 @@ generate_obfuscated_name( uchar_t high_bit; int shift; - dup = 0; - /* * The beginning of the obfuscated name can be * pretty much anything, so fill it in with random @@ -510,14 +516,24 @@ generate_obfuscated_name( ASSERT(libxfs_da_hashname((char *) newname, namelen) == hash); + /* + * Search the name table to be sure we don't produce + * a name that's already been used. + */ for (p = nametable[hash % NAME_TABLE_SIZE]; p; p = p->next) { if (p->hash == hash && p->namelen == namelen && - !memcmp(p->name, newname, namelen)) { - dup = 1; + !memcmp(p->name, newname, namelen)) break; - } } - } while (dup); + if (p) + dup++; + else + dup = 0; + } while (dup && dup < DUP_MAX); + + /* Use the original name if we got too many dups. */ + + newp = dup ? name : newname; /* Create an entry for the name in the name table */ @@ -526,7 +542,7 @@ generate_obfuscated_name( return; p->namelen = namelen; - memcpy(p->name, newname, namelen); + memcpy(p->name, newp, namelen); p->hash = hash; p->next = nametable[hash % NAME_TABLE_SIZE]; @@ -534,7 +550,8 @@ generate_obfuscated_name( /* Update the caller's copy with the obfuscated name */ - memcpy(name, newname, namelen); + if (newp != name) + memcpy(name, newp, namelen); } static void From aelder@sgi.com Thu Dec 30 14:40:26 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBUKeQ0d029252 for ; Thu, 30 Dec 2010 14:40:26 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay2.corp.sgi.com (Postfix) with ESMTP id 47B12304053 for ; Thu, 30 Dec 2010 12:42:31 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 30 Dec 2010 14:42:31 -0600 Subject: [PATCH 10/12] xfsprogs: use printable characters for obfuscated filenames From: Alex Elder Reply-To: aelder@sgi.com To: xfs@oss.sgi.com Content-Type: text/plain; charset="UTF-8" Date: Thu, 30 Dec 2010 14:42:30 -0600 Message-ID: <1293741750.2294.372.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 30 Dec 2010 20:42:31.0191 (UTC) FILETIME=[145A3A70:01CBA862] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean There is probably not much need for an extreme amount of randomness in the obfuscated names produced in metadumps. Limit the character set used for (most of) these filenames to printable characters rather than every permitted byte. The result makes metadumps a bit more natural to work with. I chose the set of all upper- and lower-case letters, digits, and the dash and underscore for the alphabet. It could easily be expanded to include others. Signed-off-by: Alex Elder --- db/metadump.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) Index: b/db/metadump.c =================================================================== --- a/db/metadump.c +++ b/db/metadump.c @@ -377,12 +377,11 @@ clear_nametable(void) static inline uchar_t random_filename_char(void) { - uchar_t c; + static uchar_t filename_alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789-_"; - do { - c = random() % 127 + 1; - } while (c == '/'); - return c; + return filename_alphabet[random() % (sizeof filename_alphabet - 1)]; } /* From aelder@sgi.com Thu Dec 30 14:40:43 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_64, J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBUKehA5029316 for ; Thu, 30 Dec 2010 14:40:43 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay2.corp.sgi.com (Postfix) with ESMTP id 29853304053 for ; Thu, 30 Dec 2010 12:42:48 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 30 Dec 2010 14:42:48 -0600 Subject: [PATCH 11/12] xfsprogs: fix up the nametable code in db/metadump.c From: Alex Elder Reply-To: aelder@sgi.com To: xfs@oss.sgi.com Content-Type: text/plain; charset="UTF-8" Date: Thu, 30 Dec 2010 14:42:47 -0600 Message-ID: <1293741767.2294.373.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 30 Dec 2010 20:42:48.0066 (UTC) FILETIME=[1E692620:01CBA862] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean The name table used to find duplicates in metadump.c is allocated dynamically, but there's no real need to do so. Just make it a BSS global array and drop the initialization call. Meanwhile, encapsulate the code that add entries to and look up entries in the table into their own functions. Use the lookup function to detect a duplicate name in a case not previously checked. Change the naming scheme to use "nametable" as a prefix rather than a suffix. Signed-off-by: Alex Elder --- db/metadump.c | 118 ++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 66 insertions(+), 52 deletions(-) Index: b/db/metadump.c =================================================================== --- a/db/metadump.c +++ b/db/metadump.c @@ -346,30 +346,61 @@ typedef struct name_ent { #define NAME_TABLE_SIZE 4096 -static name_ent_t **nametable; - -static int -create_nametable(void) -{ - nametable = calloc(NAME_TABLE_SIZE, sizeof(name_ent_t)); - return nametable != NULL; -} +static struct name_ent *nametable[NAME_TABLE_SIZE]; static void -clear_nametable(void) +nametable_clear(void) { - int i; - name_ent_t *p; + int i; + name_ent_t *ent; for (i = 0; i < NAME_TABLE_SIZE; i++) { - while (nametable[i]) { - p = nametable[i]; - nametable[i] = p->next; - free(p); + while ((ent = nametable[i])) { + nametable[i] = ent->next; + free(ent); } } } +/* + * See if the given name is already in the name table. If so, + * return a pointer to its entry, otherwise return a null pointer. + */ +static struct name_ent * +nametable_find(xfs_dahash_t hash, int namelen, uchar_t *name) +{ + struct name_ent *ent; + + for (ent = nametable[hash % NAME_TABLE_SIZE]; ent; ent = ent->next) { + if (ent->hash == hash && ent->namelen == namelen && + !memcmp(ent->name, name, namelen)) + return ent; + } + return NULL; +} + +/* + * Add the given name to the name table. Returns a pointer to the + * name's new entry, or a null pointer if an error occurs. + */ +static struct name_ent * +nametable_add(xfs_dahash_t hash, int namelen, uchar_t *name) +{ + struct name_ent *ent; + + ent = malloc(sizeof *ent + namelen); + if (!ent) + return NULL; + + ent->namelen = namelen; + memcpy(ent->name, name, namelen); + ent->hash = hash; + ent->next = nametable[hash % NAME_TABLE_SIZE]; + + nametable[hash % NAME_TABLE_SIZE] = ent; + + return ent; +} #define is_invalid_char(c) ((c) == '/' || (c) == '\0') #define rol32(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) @@ -421,7 +452,6 @@ generate_obfuscated_name( uchar_t *name) { xfs_dahash_t hash; - name_ent_t *p; int dup = 0; uchar_t newname[NAME_MAX]; @@ -519,38 +549,31 @@ generate_obfuscated_name( * Search the name table to be sure we don't produce * a name that's already been used. */ - for (p = nametable[hash % NAME_TABLE_SIZE]; p; p = p->next) { - if (p->hash == hash && p->namelen == namelen && - !memcmp(p->name, newname, namelen)) - break; - } - if (p) + if (nametable_find(hash, namelen, newname)) dup++; else dup = 0; } while (dup && dup < DUP_MAX); - /* Use the original name if we got too many dups. */ - - newp = dup ? name : newname; - - /* Create an entry for the name in the name table */ - - p = malloc(sizeof(name_ent_t) + namelen); - if (p == NULL) + /* + * Create an entry for the name in the name table. Use the + * original name if we got too many dups. + */ + if (! nametable_add(hash, namelen, dup ? name : newname)) return; - p->namelen = namelen; - memcpy(p->name, newp, namelen); - p->hash = hash; - p->next = nametable[hash % NAME_TABLE_SIZE]; - - nametable[hash % NAME_TABLE_SIZE] = p; - - /* Update the caller's copy with the obfuscated name */ - - if (newp != name) - memcpy(name, newp, namelen); + /* + * Update the caller's copy with the obfuscated name. + * Warn if we previously managed to create an obfuscated + * name that matches the one we're working on. + */ + if (! dup) + memcpy(name, newname, namelen); + else if (nametable_find(hash, namelen, newname)) + print_warning("duplicate name \"%s\" for inode %llu " + "in dir inode %llu\n", + name, (unsigned long long) ino, + (unsigned long long) cur_ino); } static void @@ -1253,7 +1276,7 @@ process_inode( break; default: ; } - clear_nametable(); + nametable_clear(); /* copy extended attributes if they exist and forkoff is valid */ if (success && XFS_DFORK_DSIZE(dip, mp) < XFS_LITINO(mp)) { @@ -1272,7 +1295,7 @@ process_inode( success = process_btinode(dip, TYP_ATTR); break; } - clear_nametable(); + nametable_clear(); } return success; } @@ -1675,12 +1698,6 @@ metadump_f( metablock->mb_blocklog = BBSHIFT; metablock->mb_magic = cpu_to_be32(XFS_MD_MAGIC); - if (!create_nametable()) { - print_warning("memory allocation failure"); - free(metablock); - return 0; - } - block_index = (__be64 *)((char *)metablock + sizeof(xfs_metablock_t)); block_buffer = (char *)metablock + BBSIZE; num_indicies = (BBSIZE - sizeof(xfs_metablock_t)) / sizeof(__be64); @@ -1690,7 +1707,6 @@ metadump_f( if (strcmp(argv[optind], "-") == 0) { if (isatty(fileno(stdout))) { print_warning("cannot write to a terminal"); - free(nametable); free(metablock); return 0; } @@ -1699,7 +1715,6 @@ metadump_f( outf = fopen(argv[optind], "wb"); if (outf == NULL) { print_warning("cannot create dump file"); - free(nametable); free(metablock); return 0; } @@ -1736,7 +1751,6 @@ metadump_f( while (iocur_sp > start_iocur_sp) pop_cur(); - free(nametable); free(metablock); return 0; From aelder@sgi.com Thu Dec 30 14:40:55 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBUKetDR029375 for ; Thu, 30 Dec 2010 14:40:55 -0600 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id E1BE6AC012 for ; Thu, 30 Dec 2010 12:42:59 -0800 (PST) Received: from [127.0.0.1] ([128.162.232.50]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 30 Dec 2010 14:42:59 -0600 Subject: [PATCH 12/12] xfsprogs: Drop a typedef in db/metadump.c From: Alex Elder Reply-To: aelder@sgi.com To: xfs@oss.sgi.com Content-Type: text/plain; charset="UTF-8" Date: Thu, 30 Dec 2010 14:42:59 -0600 Message-ID: <1293741779.2294.374.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 30 Dec 2010 20:42:59.0582 (UTC) FILETIME=[254659E0:01CBA862] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Use struct name_ent rather than its typedef, and just drop the typedef entirely. Signed-off-by: Alex Elder --- db/metadump.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) Index: b/db/metadump.c =================================================================== --- a/db/metadump.c +++ b/db/metadump.c @@ -337,12 +337,12 @@ copy_free_cnt_btree( /* filename and extended attribute obfuscation routines */ -typedef struct name_ent { +struct name_ent { struct name_ent *next; xfs_dahash_t hash; int namelen; uchar_t name[1]; -} name_ent_t; +}; #define NAME_TABLE_SIZE 4096 @@ -352,7 +352,7 @@ static void nametable_clear(void) { int i; - name_ent_t *ent; + struct name_ent *ent; for (i = 0; i < NAME_TABLE_SIZE; i++) { while ((ent = nametable[i])) { From SRS0+7eIB+33+fromorbit.com=david@internode.on.net Thu Dec 30 16:33:26 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBUMXPSG041223 for ; Thu, 30 Dec 2010 16:33:25 -0600 X-ASG-Debug-ID: 1293748520-66bd00690000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E8C4AF920B4 for ; Thu, 30 Dec 2010 14:35:20 -0800 (PST) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id t0XeCVCqPqkc4CCC for ; Thu, 30 Dec 2010 14:35:20 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51223106-1927428 for multiple; Fri, 31 Dec 2010 09:05:18 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PYR5Z-0001S3-1P; Fri, 31 Dec 2010 09:35:17 +1100 Date: Fri, 31 Dec 2010 09:35:16 +1100 From: Dave Chinner To: Alex Elder Cc: XFS Mailing List X-ASG-Orig-Subj: Re: [PATCH 1/5] percpu_counter: fix test in __percpu_counter_add_unless_lt() Subject: Re: [PATCH 1/5] percpu_counter: fix test in __percpu_counter_add_unless_lt() Message-ID: <20101230223516.GB15179@dastard> References: <1293076575.2408.425.camel@doink> <20101223060652.GE18264@dastard> <1293656188.1961.470.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1293656188.1961.470.camel@doink> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1293748522 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50967 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Dec 29, 2010 at 02:56:28PM -0600, Alex Elder wrote: > On Thu, 2010-12-23 at 17:06 +1100, Dave Chinner wrote: > > On Wed, Dec 22, 2010 at 09:56:15PM -0600, Alex Elder wrote: > > > In __percpu_counter_add_unless_lt(), there is a test to see if > > > a call to __percpu_counter_add() can be made, knowing the result > > > will not be less than the given threshhold and the called function > > > will do the addition without taking a lock. > > . . . > > > > =================================================================== > > > --- a/lib/percpu_counter.c > > > +++ b/lib/percpu_counter.c > > > @@ -239,10 +239,10 @@ int __percpu_counter_add_unless_lt(struc > > > goto out; > > > > > > /* > > > - * If the counter is over the threshold and the change is less than the > > > - * batch size, we might be able to avoid locking. > > > + * If the updated counter will be over the threshold we know > > > + * we can safely add, and might be able to avoid locking. > > > */ > > > - if (count > threshold + error && abs(amount) < batch) { > > > + if (count + amount > threshold + error) { > > > __percpu_counter_add(fbc, amount, batch); > > > ret = 1; > > > goto out; > > > > What you have is what I first implemented following your exact > > logic. However, after having several assert failures n the XFS code, > > I realised that the logic fails when there are concurrent modifications > > with abs(amount) > batch. To demonstrate, take the initial conditions: > > I think we're both wrong. First I'll point out a think-o > you did, then I'll lay out a counterexample to your approach. Argh, you're right. However, if you change amount to -49 and the initial fbc->count to 306, we get 226, 146, 66, -14, so the problem I was pointing out still stands. > > And we've just blown through the threshold. We modified the counter > > and pushed the result less than the threshold which we are not > > supposed to be, and worst yet is the fact we returning a positive > > number indicating that we _didn't_ bust the threshold. > > Now here's an example that will fail with your version, which is: > > if (count > threshold + error && abs(amount) < batch) { > __percpu_counter_add(fbc, amount, batch); > > My example is not symmetric like yours is. > > threshold = 0 > batch = 32 > 4 cpus, so (your) error = 2 * 4 * 32 = 256 > > We'll start with 0 for all per-cpu counter values > for simplicity, but we'll not assume that the > amount being added by all CPU's is the same. So > here are both the current per-cpu counter values and > the amount each racing CPU is going to try to add. > > fbc->count = 257 > CPU 0 1 2 3 > value 0 0 0 0 > amount -31 -76 -76 -76 Granted, that is a possible state that can occur at the sampling point, but it assumes that the race condition of CPUs 1, 2 and 3 complete the fbc->count modification before seeing the CPU 0 modification of the local CPU value can occur. I don't think that race condition can occur, because CPUs 1, 2 and 3 will take the slow path because abs(amount) >= batch and serialise on the fbc->lock, whilst CPU 0 will not be serialised, is running under preempt_disable() and so should complete first.... > The real problem is that we're caching the value of > fbc->count, and as soon as we've done that it > could be out of date. To get around it we need > to examine it under lock--preferably a reader/writer > lock I suppose. No, new locks are not an option. The point of percpu counters is to avoid locking where possible. memory barriers, OTOH.... > You'll notice that fbc->count is > only ever read under the protection of the spinlock > everywhere else in the file. It isn't, in fact. percpu_counter_read(), for example. > Locking is avoided > only when checking whether it is possible to add to > a per-cpu value, and that is done with preemption > disabled. Sure, that's the rules for using per-cpu data structures (i.e. preemption needs to be disabled). That doesn't mean we can't avoid locking where possible.... > I have a little more below. > > > Analysis of the failures lead me to this lead me to this logic > > for the unlocked check in my proposed patch: > > > > We can do unlocked modifications concurrently on all CPUs IFF > > > > 1. the code cannot be preempted between sampling fbc->count > > and calling __percpu_counter_add() > > This I agree with (you convinced me in your response > to my patch 5/5). > > > 2. -batch < amount < batch > > This isn't right, or maybe just isn't relevant. The > reason is that it neither takes into account this CPU's > counter value, nor what a concurrent call on the other > CPU's might be adding to the net value. It is supposed to take into account whether the local addition will transgress the error bound for this CPU.... > > 3. the error bound is set to 2 * batch * nr_cpus > > I think this assumes that all the CPU's are adding a limited > amount to the counter. And I still think you're doubling > the error bound unnecessarily (but that may reflect the > implied limit). It is the limit that is supposed to take into account the current counter and the amount being added. I think this the the cause of the issue - the error doesn't correctly take into account amount - it assumes that -batch < amount < batch is always true. We can change the error bound to take amount into account, but that still doesn't work if another CPU is adding a larger abs(amount). So for it to work in all cases we need to set a maximum bound on amount, which is impractical. However, I think this error bound is still valid if we modify the lockless code to detect if fbc->count has changed before we make the modification. It's only when fbc->count changes that the error bound is invalidated if abs(amount) < batch, so checking that it hasn't changed before applying the modification seems to solve the problem to me. And rather than using locking, we can use memory barriers to ensure that we pick up any racing changes to fbc->count. i.e something like: restart: smp_mb(); count = fbc->count; if (count > threshold + error && abs(amount) < batch) { s64 lcount; pcount = this_cpu_ptr(fbc->counters); lcount = *pcount + amount; if (lcount >= batch || lcount <= -batch) { spin_lock(&fbc->lock); if (fbc->count != count) { /* raced with other modifications */ spin_unlock(&fbc->lock); goto restart; } fbc->count += lcount; *pcount = 0; spin_unlock(&fbc->lock); } else { smp_mb(); if (fbc->count != count) goto restart; *pcount = lcount; } ret = 1; got out; } This means that in your example (and indeed any example where fbc->count is modified directly on another CPU), we will detect it and redo the unlocked checks. > Below I have a version of the code that I think would work, > but it unfortunately requires a lock in the (presumably) > normal case. Which, unfortunately, defeats the primary purpose of using a percpu counter in the first place (i.e. to reduce lock contention on a global counter) and so if that is the best that can be done, there is no point making any change. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+ix8d+33+fromorbit.com=david@internode.on.net Thu Dec 30 17:11:54 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBUNBsrj045715 for ; Thu, 30 Dec 2010 17:11:54 -0600 X-ASG-Debug-ID: 1293750836-013f01a80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 050E6229FC8 for ; Thu, 30 Dec 2010 15:13:57 -0800 (PST) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id 33jBSSSTv6OtWPfa for ; Thu, 30 Dec 2010 15:13:57 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 40023015-1927428 for multiple; Fri, 31 Dec 2010 09:43:55 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PYRgw-0001Us-1c; Fri, 31 Dec 2010 10:13:54 +1100 Date: Fri, 31 Dec 2010 10:13:53 +1100 From: Dave Chinner To: Ajeet Yadav Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS handling of synchronous buffers in case of EIO error Subject: Re: XFS handling of synchronous buffers in case of EIO error Message-ID: <20101230231353.GC15179@dastard> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1293750839 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50968 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Dec 30, 2010 at 05:58:36PM +0530, Ajeet Yadav wrote: > Kernel: 2.6.30.9 > > I am trouble shooting a hang in XFS during umount. > Test scenerio: Copy large number of files files using below script, and > remove the USB after 3-5 second FWIW, in future can you please report what kernel you are testing on? > > index=0 > while [ "$?" == 0 ] > do > index=$((index+1)) > sync > cp $1/1KB.txt $2/"$index".test > done > > In rare scenerio during USB unplug the umount process hang at xfs_buf_lock. > Below log shows the hung process > > We have put printk to buffer handling functions xfs_buf_iodone_callbacks(), > xfs_buf_error_relse(), xfs_buf_relse() and xfs_buf_rele() > > We always observed the hang only comes when bp->b_relse = > xfs_buf_error_relse(). i.e when xfs_buf_iodone_callbacks() execute > XFS_BUF_SET_BRELSE_FUNC(bp,xfs_buf_error_relse); > XFS_BUF_DONE(bp); > XFS_BUF_FINISH_IOWAIT(bp); > > buf its never called by xfs_buf_relse() because b_hold = 3. > > Also we have seen that this problem always comes when bp->relse != NULL && > bp->hold > 1. This appears to be the same problem as reported here: http://oss.sgi.com/archives/xfs/2010-12/msg00380.html > I do not know whether below prints will help you, but I have taken printk > for super block buffer tracing > S-functionname ( Start of function) > E-functionname (End of function) If you have a recent enough kernel, you can get all this information from the tracing built into XFS. As it is, the cause of the problem is that setting bp->b_relse changes the behaviour of xfs_buf_relse() - if bp->b_relse is set, it doesn't unlock the buffer. This is normally just fine, because xfs_buf_rele() has a special case to handle buffers with bp->b_relse(), which adds a hold count and call the release function when the hold count drops to zero. The b_relse function is supposed to unlock the buffer by calling xfs_buf_relse() again. Unfortunately, the superblock buffer is special - the hold count on it never drops to zero until very late in the unmont process because it is managed by the filesystem. Hence the bp->b_relse function is never called, and hence the buffer is never unlocked in this case. Hence future attempts to access it hang. I'll need to think about this one for a bit... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+CcnX+34+fromorbit.com=david@internode.on.net Thu Dec 30 18:11:24 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_53 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBV0BN9c053641 for ; Thu, 30 Dec 2010 18:11:24 -0600 X-ASG-Debug-ID: 1293754406-69e902ff0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A6B1AF92310 for ; Thu, 30 Dec 2010 16:13:26 -0800 (PST) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id BRpcVFuDcSoAnoOK for ; Thu, 30 Dec 2010 16:13:26 -0800 (PST) Received: from dastard (unverified [121.44.88.148]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 51385261-1927428 for multiple; Fri, 31 Dec 2010 10:43:25 +1030 (CDT) Received: from dave by dastard with local (Exim 4.72) (envelope-from ) id 1PYScV-0001aH-Ca; Fri, 31 Dec 2010 11:13:23 +1100 Date: Fri, 31 Dec 2010 11:13:23 +1100 From: Dave Chinner To: Petre Rodan Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfssyncd and disk spin down Subject: Re: xfssyncd and disk spin down Message-ID: <20101231001323.GD15179@dastard> References: <20101223165532.GA23813@peter.simplex.ro> <20101227021904.GA24828@dastard> <20101227061629.GA2275@pandora.simplex.ro> <20101227140750.GB24828@dastard> <20101227171939.GA7759@pandora.simplex.ro> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20101227171939.GA7759@pandora.simplex.ro> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1293754407 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50973 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Dec 27, 2010 at 07:19:39PM +0200, Petre Rodan wrote: > > Hello Dave, > > On Tue, Dec 28, 2010 at 01:07:50AM +1100, Dave Chinner wrote: > > Turn on the XFS tracing so we can see what is being written every > > 36s. When the problem shows up: > > > > # echo 1 > /sys/kernel/debug/tracing/events/xfs/enable > > # sleep 100 > > # cat /sys/kernel/debug/tracing/trace > trace.out > > # echo 0 > /sys/kernel/debug/tracing/events/xfs/enable > > > > And post the trace.out file for us to look at. > > attached. > > you can disregard all the lvm partitions ('dev 254:.*') since they are on a different drive, probably only 8:17 is of interest. Ok, I can see the problem. The original patch I tested: http://oss.sgi.com/archives/xfs/2010-08/msg00026.html Made the log covering dummy transaction a synchronous transaction so that the log was written and the superblock unpinned immediately to allow the xfsbufd to write back the superblock and empty the AIL before the next log covering check. On review, the log covering dummy transaction got changed to an async transaction, so the superblock buffer is not unpinned immediately. This was the patch committed: http://oss.sgi.com/archives/xfs/2010-08/msg00197.html As a result, the success of log covering and idling is then dependent on whether the log gets written to disk to unpin the superblock buffer before the next xfssyncd run. It seems that there is a large chance that this log write does not happen, so the filesystem never idles correctly. I've reproduced it here, and only in one test out of ten did the filesystem enter an idle state correctly. I guess I was unlucky enough to hit that 1-in-10 case when I tested the modified patch. I'll cook up a patch to make the log covering behave like the original patch I sent... Cheers, Dave. -- Dave Chinner david@fromorbit.com From ajeet.yadav.77@gmail.com Fri Dec 31 00:45:10 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBV6jAJF106066 for ; Fri, 31 Dec 2010 00:45:10 -0600 X-ASG-Debug-ID: 1293778033-20f102080000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-vw0-f53.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 31A2C1D065A8 for ; Thu, 30 Dec 2010 22:47:13 -0800 (PST) Received: from mail-vw0-f53.google.com (mail-vw0-f53.google.com [209.85.212.53]) by cuda.sgi.com with ESMTP id bM8OzHKPu82JLRPS for ; Thu, 30 Dec 2010 22:47:13 -0800 (PST) Received: by vws8 with SMTP id 8so5098395vws.26 for ; Thu, 30 Dec 2010 22:47:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:cc:content-type; bh=7O+xbaO6NV4G+eP6UxxVE6TSItVt4L1mEDcipT9Osdc=; b=wKvxouhKayHDn59RTZRSIWbC4ftgsO+dw3fZe9rDp7KK5v8tLVuFZECSMFPUfDZKRo 1HbNH150jmTVOxUbE0d8qV6Y+8VNudWS4L2mlsmnMc1KAnTP1fl5M/ZK0Kqr80RfiqQX m/1DzLzGgoJthM4qQOCfffOGjpy/FCMoMt3VI= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; b=wbXIqjeUo0K7HtvLiFFW+Uum7/8btw/GIf0V6H9oSYUloSGxcPzI6FFa7dV5cGccMv KgNULnQWlTqKu9HknjctW/3db2msvM/YESNn8TsxCsOm+4FbTfV4TJzumsLWVReOy+SA 52phtERrXHbS+XfB2hayTKooY/gmU+zbvwFuo= MIME-Version: 1.0 Received: by 10.220.91.198 with SMTP id o6mr5123158vcm.22.1293778032909; Thu, 30 Dec 2010 22:47:12 -0800 (PST) Received: by 10.220.165.198 with HTTP; Thu, 30 Dec 2010 22:47:12 -0800 (PST) In-Reply-To: <20101230231353.GC15179@dastard> References: <20101230231353.GC15179@dastard> Date: Fri, 31 Dec 2010 12:17:12 +0530 Message-ID: X-ASG-Orig-Subj: Re: XFS handling of synchronous buffers in case of EIO error Subject: Re: XFS handling of synchronous buffers in case of EIO error From: Ajeet Yadav To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001485f8732a11de170498af2cd5 X-Barracuda-Connect: mail-vw0-f53.google.com[209.85.212.53] X-Barracuda-Start-Time: 1293778034 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.50997 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 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --001485f8732a11de170498af2cd5 Content-Type: text/plain; charset=ISO-8859-1 Dear Dave, Our Kernel is 2.6.30.9 but XFS is backported from 2.6.34. But I have seen similar behaviour in another post related to process ls hang in 2.6.35.9 * http://oss.sgi.com/pipermail/xfs/2010-December/048691.html *I have always seen the hang problem comes only if comes when b_relse != NULL, and b_hold > 2 I have made below workaround it solved the problem in our case because when USB is removed we know we get EIO error. But I think we need to review xfs_buf_error_relse() and xfs_buf_relse() considering XBF_LOCK flow path. @@ -1047,9 +1047,19 @@ xfs_buf_iodone_callbacks( /* We actually overwrite the existing b-relse function at times, but we're gonna be shutting down anyway. */ - XFS_BUF_SET_BRELSE_FUNC(bp,xfs_buf_error_relse); - XFS_BUF_DONE(bp); - XFS_BUF_FINISH_IOWAIT(bp); + if (XFS_BUF_GETERROR(bp) == EIO){ + ASSERT(XFS_BUF_TARGET(bp) == mp->m_ddev_targp); + XFS_BUF_SUPER_STALE(bp); + trace_xfs_buf_item_iodone(bp, _RET_IP_); + xfs_buf_do_callbacks(bp, lip); + XFS_BUF_SET_FSPRIVATE(bp, NULL); + XFS_BUF_CLR_IODONE_FUNC(bp); + xfs_biodone(bp); + } else { + XFS_BUF_SET_BRELSE_FUNC(bp,xfs_buf_error_relse); + XFS_BUF_DONE(bp); + XFS_BUF_FINISH_IOWAIT(bp); + } } return; } Dec 31, 2010 at 4:43 AM, Dave Chinner wrote: > On Thu, Dec 30, 2010 at 05:58:36PM +0530, Ajeet Yadav wrote: > > Kernel: 2.6.30.9 > > > > I am trouble shooting a hang in XFS during umount. > > Test scenerio: Copy large number of files files using below script, and > > remove the USB after 3-5 second > > FWIW, in future can you please report what kernel you are testing on? > > > > > index=0 > > while [ "$?" == 0 ] > > do > > index=$((index+1)) > > sync > > cp $1/1KB.txt $2/"$index".test > > done > > > > In rare scenerio during USB unplug the umount process hang at > xfs_buf_lock. > > Below log shows the hung process > > > > We have put printk to buffer handling functions > xfs_buf_iodone_callbacks(), > > xfs_buf_error_relse(), xfs_buf_relse() and xfs_buf_rele() > > > > We always observed the hang only comes when bp->b_relse = > > xfs_buf_error_relse(). i.e when xfs_buf_iodone_callbacks() execute > > XFS_BUF_SET_BRELSE_FUNC(bp,xfs_buf_error_relse); > > XFS_BUF_DONE(bp); > > XFS_BUF_FINISH_IOWAIT(bp); > > > > buf its never called by xfs_buf_relse() because b_hold = 3. > > > > Also we have seen that this problem always comes when bp->relse != NULL > && > > bp->hold > 1. > > This appears to be the same problem as reported here: > > http://oss.sgi.com/archives/xfs/2010-12/msg00380.html > > > > I do not know whether below prints will help you, but I have taken printk > > for super block buffer tracing > > S-functionname ( Start of function) > > E-functionname (End of function) > > If you have a recent enough kernel, you can get all this information > from the tracing built into XFS. > > As it is, the cause of the problem is that setting bp->b_relse > changes the behaviour of xfs_buf_relse() - if bp->b_relse is set, it > doesn't unlock the buffer. This is normally just fine, because > xfs_buf_rele() has a special case to handle buffers with > bp->b_relse(), which adds a hold count and call the release function > when the hold count drops to zero. The b_relse function is supposed > to unlock the buffer by calling xfs_buf_relse() again. > > Unfortunately, the superblock buffer is special - the hold count on > it never drops to zero until very late in the unmont process because > it is managed by the filesystem. Hence the bp->b_relse function is > never called, and hence the buffer is never unlocked in this case. > Hence future attempts to access it hang. > > I'll need to think about this one for a bit... > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --001485f8732a11de170498af2cd5 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Dear Dave,
=A0
Our Kernel is 2.6.30.9 but XFS is backported from 2.6.34.
But I have seen similar behaviour in another post related to=A0process= ls hang in 2.6.35.9

h= ttp://oss.sgi.com/pipermail/xfs/2010-December/048691.html

I have always seen the hang problem comes=A0only i= f comes when b_relse !=3D NULL, and b_hold > 2=A0

I have made below=A0workaround it solved the problem in our case because= =A0when USB is removed we know we get EIO error.

But I think we need to review xfs_buf_error_relse() and xfs_buf_relse() = considering =A0XBF_LOCK flow path.

@@ -1047,9 +1047,19 @@ xfs_buf_iodone_callbacks(
=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 /* We actually overwrit= e the existing b-relse
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 function at times, but we're gonna be sh= utting down
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 anyway. */
-=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 XFS_BUF= _SET_BRELSE_FUNC(bp,xfs_buf_error_relse);
-=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 XFS_BUF_DONE(bp);
-=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 XFS_BUF_FINISH_IOWAI= T(bp);
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0 if (XFS_BUF_GETERROR(bp) =3D=3D EIO){
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 ASSERT(XFS_BUF_TARGET(bp) =3D=3D mp->m_ddev_targp);+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 XFS_BUF_SUPER_STALE(bp);
+=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 trace_xfs_b= uf_item_iodone(bp, _RET_IP_);
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 xfs_buf_do_callbacks(bp, lip);
+=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 XFS_B= UF_SET_FSPRIVATE(bp, NULL);
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 XFS_BUF_CLR_IODONE_FUNC(bp= );
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0 xfs_biodone(bp);
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 } else = {
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0 XFS_BUF_SET_BRELSE_FUNC(bp,xfs_buf_error_relse);
+= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0 XFS_BUF_DONE(bp);
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 XFS_BUF_FINISH_IOWAI= T(bp);
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 }
= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 }
=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0 return;
=A0=A0=A0=A0=A0=A0=A0 }

=A0

=A0Dec 31, 2010 at 4:43 AM, Dave Chinner <david@fromorbit.com&g= t; wrote:

On Thu, Dec 30, 2010 at 05:58:36PM +0530, Ajeet Yadav wrote:
> K= ernel: 2.6.30.9
>
> I am trouble shooting a hang in XFS during = umount.
> Test scenerio: Copy large number of files files using below= script, and
> remove the USB after 3-5 second

FWIW, in future can you p= lease report what kernel you are testing on?

>
> index=3D0
> while [ "$?" =3D=3D 0 ]> do
> =A0 =A0 =A0 =A0 index=3D$((index+1))
> =A0 =A0 =A0 = =A0 sync
> =A0 =A0 =A0 =A0 cp $1/1KB.txt $2/"$index".test> done
>
> In rare scenerio during USB unplug the umount p= rocess hang at xfs_buf_lock.
> Below log shows the hung process
>
> We have put printk to= buffer handling functions xfs_buf_iodone_callbacks(),
> xfs_buf_erro= r_relse(), xfs_buf_relse() and xfs_buf_rele()
>
> We always obs= erved the hang only comes when bp->b_relse =3D
> xfs_buf_error_relse(). i.e when xfs_buf_iodone_callbacks() execute
= > XFS_BUF_SET_BRELSE_FUNC(bp,xfs_buf_error_relse);
> XFS_BUF_DONE(= bp);
> XFS_BUF_FINISH_IOWAIT(bp);
>
> =A0buf its never ca= lled by xfs_buf_relse() because b_hold =3D 3.
>
> Also we have seen that this problem always comes when bp->r= else !=3D NULL &&
> bp->hold > 1.

This app= ears to be the same problem as reported here:

http://oss.sg= i.com/archives/xfs/2010-12/msg00380.html


> I do not know whether below prints will help you, but I h= ave taken printk
> for super block buffer tracing
> S-functionn= ame ( Start of function)
> E-functionname (End of function)

If you have a recent enough kernel, you can get all this information<= br>from the tracing built into XFS.

As it is, the cause of the probl= em is that setting bp->b_relse
changes the behaviour of xfs_buf_relse= () - if bp->b_relse is set, it
doesn't unlock the buffer. This is normally just fine, because
xfs_b= uf_rele() has a special case to handle buffers with
bp->b_relse(), wh= ich adds a hold count and call the release function
when the hold count = drops to zero. The b_relse function is supposed
to unlock the buffer by calling xfs_buf_relse() again.

Unfortunately= , the superblock buffer is special - the hold count on
it never drops to= zero until very late in the unmont process because
it is managed by the= filesystem. =A0Hence the bp->b_relse function is
never called, and hence the buffer is never unlocked in this case.
Hence= future attempts to access it hang.

I'll need to think about thi= s one for a bit...

Cheers,

Dave.
-= -
Dave Chinner
da= vid@fromorbit.com

--001485f8732a11de170498af2cd5-- From mailman-bounces@mb2d91.vdrs.net Fri Dec 31 16:53:39 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.3 required=5.0 tests=BAYES_99,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id oBVMrdCj245071 for ; Fri, 31 Dec 2010 16:53:39 -0600 X-ASG-Debug-ID: 1293836142-3b8401010000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mb2d91.vdrs.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 553541530B9F for ; Fri, 31 Dec 2010 14:55:42 -0800 (PST) Received: from mb2d91.vdrs.net (mb2d91.vdrs.net [112.78.2.91]) by cuda.sgi.com with ESMTP id TInq4GVLTz6JYTaB for ; Fri, 31 Dec 2010 14:55:42 -0800 (PST) Received: from localhost ([127.0.0.1] helo=mb2d91.vdrs.net) by mb2d91.vdrs.net with esmtp (Exim 4.69) (envelope-from ) id 1PYnsp-0007ee-S8 for linux-xfs@oss.sgi.com; Sat, 01 Jan 2011 05:55:39 +0700 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 X-ASG-Orig-Subj: =?utf-8?b?TOG7nWkgbmjhuq9jIG5o4bufIHRow6BuaCB2acOqbiBo4buZcCB0?= =?utf-8?q?h=C6=B0_subishop=2Ecom?= Subject: =?utf-8?b?TOG7nWkgbmjhuq9jIG5o4bufIHRow6BuaCB2acOqbiBo4buZcCB0?= =?utf-8?q?h=C6=B0_subishop=2Ecom?= From: sanpham-owner@subishop.com To: linux-xfs@oss.sgi.com X-No-Archive: yes Message-ID: Date: Sat, 01 Jan 2011 05:16:18 +0700 Precedence: bulk X-BeenThere: mailman@mb2d91.vdrs.net X-Mailman-Version: 2.1.12.cp3 List-Id: Mailman site list X-List-Administrivia: yes Sender: mailman-bounces@mb2d91.vdrs.net Errors-To: mailman-bounces@mb2d91.vdrs.net X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - mb2d91.vdrs.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - mb2d91.vdrs.net X-Barracuda-Connect: mb2d91.vdrs.net[112.78.2.91] X-Barracuda-Start-Time: 1293836144 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4449 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.40 X-Barracuda-Spam-Status: No, SCORE=0.40 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA085b, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.51062 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.40 BSF_SC0_SA085b Custom Rule SA085b X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean xJDDonkgbMOgIGzhu51pIG5o4bqvYyBuaOG7nywgxJHGsOG7o2MgZ+G7n2kgaMOgbmcgdGjDoW5n LCB24buBIHPhu7EKxJHEg25nIGvDvSBj4bunYSBi4bqhbiB24bubaSBo4buZcCB0aMawIGNodW5n IHRyw6puIG3DoXkgc3ViaXNob3AuY29tLgpOw7MgZ+G7k20gdGjDtG5nIHRpbiDEkcSDbmcga8O9 IGPhu6dhIGLhuqFuLCB2w6AgaMaw4bubbmcgZOG6q24gduG7gQp0aGF5IMSR4buVaSB0aMO0bmcg dGluIG7DoHkgdsOgIGjhu6d5IMSRxINuZyBrw70gcmEgaOG7mXAgdGjGsCBuw6BvLgoKQuG6oW4g Y8OzIHRo4buDIHRoxINtIMSR4buLYSBjaOG7iSBN4bqhbmcgxJHhu4MgdGhheSDEkeG7lWkgdHLh uqFuZwp0aMOhaSB0aMOgbmggdmnDqm4gaGF5IGPhuqV1IGjDrG5oLCBn4buTbSBo4buneSDEkcSD bmcga8O9LCDEkeG6t3QKbmjhuq1uIGLDsyB0aMawLCBob+G6t2MgdOG6r3QgdOG6oW0gdGjhu51p IG5o4bqtbiB0aMawICh2LmQuIGtoaSDEkWkKbmdo4buJKSB2LnYuCgpUaMOqbSB2w6BvIGto4bqj IG7Eg25nIHPhu60gZOG7pW5nIGdpYW8gZGnhu4duIE3huqFuZywgYuG6oW4gY8WpbmcgY8OzCmto 4bqjIG7Eg25nIHPhu60gZOG7pW5nIHRoxrAgxJFp4buHbiB04butIMSR4buDIHRoYXkgxJHhu5Vp IGfDrC4gxJDhu4MKxJHGsOG7o2MgdGjDtG5nIHRpbiB0aMOqbSwgaMOjeSBn4bufaSB0aMawIGNo byDEkeG7i2EgY2jhu4kgecOqdSBj4bqndQrCqyAtcmVxdWVzdCDCuyBj4bunYSBo4buZcCB0aMaw IMSRw7MgKHYuZC4Kc2FucGhhbS1yZXF1ZXN0QHN1YmlzaG9wLmNvbSkgbcOgIGNo4bupYSBjaOG7 iSB04burICJoZWxwIiAodHLhu6MKZ2nDunApIChraMO0bmcgY8OzIGThuqV1IHRyw61jaCBk4bqr bikgdHJvbmcgdGjDom4sIHLhu5NpIGLhuqFuIHPhur0Kbmjhuq1uIHRoxrAgaMaw4bubbmcgZOG6 q24uCgpN4buXaSBjw6J1IGjhu49pLCB24bqlbiDEkeG7gSwgY2jDuiB0aMOtY2ggdi52LiwgdnVp IGzDsm5nIGfhu59pIHRoxrAKY2hvIHNhbnBoYW0tb3duZXJAc3ViaXNob3AuY29tLiAgQ8OhbSDG oW4gYuG6oW4uCgpN4bqtdCBraOG6qXUgY2hvIGxpbnV4LXhmc0Bvc3Muc2dpLmNvbToKCkjhu5lw IHRoxrAgY2h1bmcgICAgICAgICAgICAgICAgICAgICAgICAgTeG6rXQga2jhuql1IC8vIMSQ4buL YSBjaOG7iSBVUkwKLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0t LS0tLSAgCnNhbnBoYW1Ac3ViaXNob3AuY29tICAgICAgICAgICAgICAgICAgICAgZWR2ZWJvcGEg IApodHRwOi8vc3ViaXNob3AuY29tL21haWxtYW4vb3B0aW9ucy9zYW5waGFtX3N1YmlzaG9wLmNv bS9saW51eC14ZnMlNDBvc3Muc2dpLmNvbQo=